Sample code for 30+ languages & platforms
Zig Requires Chilkat v11.0.0+

Generate ECDSA Key and Get Details as XML

See more ECC Examples

Demonstrates how to generate an ECDSA key and gets the parts as XML.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    // This requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    const ecc = try chilkat.Ecc.init();
    defer ecc.deinit();

    // Generate a random ECC private key on the secp256k1 curve.
    // Chilkat also supports other curves, such as secp384r1, secp521r1, and secp256r1.

    // Create a Fortuna PRNG and seed it with system entropy.
    // This will be our source of random data for generating the ECC private key.
    const fortuna = try chilkat.Prng.init();
    defer fortuna.deinit();
    const entropy = try fortuna.getEntropy(alloc, 32, "base64");
    try fortuna.addEntropy(entropy, "base64");

    const priv_key = try chilkat.PrivateKey.init();
    defer priv_key.deinit();
    ecc.genKey("secp256k1", fortuna, priv_key) catch {
        std.debug.print("{s}\n", .{try ecc.getLastErrorText(alloc)});
        return;
    };

    // An EC private key has this ASN.1
    // ECPrivateKey ::= SEQUENCE {
    //     version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    //     privateKey     OCTET STRING,
    //     parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
    //     publicKey  [1] BIT STRING OPTIONAL (This is the ANSI X9.63 public key format.)

    const asn = try chilkat.Asn.init();
    defer asn.deinit();
    asn.loadEncoded(try priv_key.getPkcs1ENC(alloc, "base64"), "base64") catch {
        std.debug.print("{s}\n", .{try asn.getLastErrorText(alloc)});
        return;
    };

    const xml = try chilkat.Xml.init();
    defer xml.deinit();
    xml.loadXml(try asn.asnToXml(alloc)) catch {};

    std.debug.print("{s}\n", .{try xml.getXml(alloc)});

    // The XML looks like this:
    // <?xml version="1.0" encoding="utf-8" ?>
    // <sequence>
    //     <int>01</int>
    //     <octets>JgJvBG+3wletkJab8iXAkpz0O8/AgWZSpkYVcB7SpnU=</octets>
    //     <contextSpecific tag="0" constructed="1">
    //         <oid>1.3.132.0.10</oid>
    //     </contextSpecific>
    // </sequence>

    // The 32-byte private key is in the octets..
    // Get it as hex.
    const crypt = try chilkat.Crypt2.init();
    defer crypt.deinit();
    const priv_key_hex = try crypt.reEncode(alloc, try xml.getChildContent(alloc, "octets"), "base64", "hex");

    std.debug.print("EC private key as hex = {s}\n", .{priv_key_hex});
}