Tcl
Tcl
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
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