Sample code for 30+ languages & platforms
Tcl 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 Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set ecc [new_CkEcc]

#  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.
set fortuna [new_CkPrng]

set entropy [CkPrng_getEntropy $fortuna 32 "base64"]
set success [CkPrng_AddEntropy $fortuna $entropy "base64"]

set privKey [new_CkPrivateKey]

set success [CkEcc_GenKey $ecc "secp256k1" $fortuna $privKey]
if {$success == 0} then {
    puts [CkEcc_lastErrorText $ecc]
    delete_CkEcc $ecc
    delete_CkPrng $fortuna
    delete_CkPrivateKey $privKey
    exit
}

#  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.)

set asn [new_CkAsn]

set success [CkAsn_LoadEncoded $asn [CkPrivateKey_getPkcs1ENC $privKey "base64"] "base64"]
if {$success != 1} then {
    puts [CkAsn_lastErrorText $asn]
    delete_CkEcc $ecc
    delete_CkPrng $fortuna
    delete_CkPrivateKey $privKey
    delete_CkAsn $asn
    exit
}

set xml [new_CkXml]

CkXml_LoadXml $xml [CkAsn_asnToXml $asn]

puts [CkXml_getXml $xml]

#  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.
set crypt [new_CkCrypt2]

set privKeyHex [CkCrypt2_reEncode $crypt [CkXml_getChildContent $xml "octets"] "base64" "hex"]

puts "EC private key as hex = $privKeyHex"

delete_CkEcc $ecc
delete_CkPrng $fortuna
delete_CkPrivateKey $privKey
delete_CkAsn $asn
delete_CkXml $xml
delete_CkCrypt2 $crypt