Sample code for 30+ languages & platforms
PowerBuilder

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 PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
oleobject loo_Ecc
oleobject loo_Fortuna
string ls_Entropy
oleobject loo_PrivKey
oleobject loo_Asn
oleobject loo_Xml
oleobject loo_Crypt
string ls_PrivKeyHex

li_Success = 0

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

loo_Ecc = create oleobject
li_rc = loo_Ecc.ConnectToNewObject("Chilkat.Ecc")
if li_rc < 0 then
    destroy loo_Ecc
    MessageBox("Error","Connecting to COM object failed")
    return
end if

// 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.
loo_Fortuna = create oleobject
li_rc = loo_Fortuna.ConnectToNewObject("Chilkat.Prng")

ls_Entropy = loo_Fortuna.GetEntropy(32,"base64")
li_Success = loo_Fortuna.AddEntropy(ls_Entropy,"base64")

loo_PrivKey = create oleobject
li_rc = loo_PrivKey.ConnectToNewObject("Chilkat.PrivateKey")

li_Success = loo_Ecc.GenKey("secp256k1",loo_Fortuna,loo_PrivKey)
if li_Success = 0 then
    Write-Debug loo_Ecc.LastErrorText
    destroy loo_Ecc
    destroy loo_Fortuna
    destroy loo_PrivKey
    return
end if

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

loo_Asn = create oleobject
li_rc = loo_Asn.ConnectToNewObject("Chilkat.Asn")

li_Success = loo_Asn.LoadEncoded(loo_PrivKey.GetPkcs1ENC("base64"),"base64")
if li_Success <> 1 then
    Write-Debug loo_Asn.LastErrorText
    destroy loo_Ecc
    destroy loo_Fortuna
    destroy loo_PrivKey
    destroy loo_Asn
    return
end if

loo_Xml = create oleobject
li_rc = loo_Xml.ConnectToNewObject("Chilkat.Xml")

loo_Xml.LoadXml(loo_Asn.AsnToXml())

Write-Debug loo_Xml.GetXml()

// 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.
loo_Crypt = create oleobject
li_rc = loo_Crypt.ConnectToNewObject("Chilkat.Crypt2")

ls_PrivKeyHex = loo_Crypt.ReEncode(loo_Xml.GetChildContent("octets"),"base64","hex")

Write-Debug "EC private key as hex = " + ls_PrivKeyHex


destroy loo_Ecc
destroy loo_Fortuna
destroy loo_PrivKey
destroy loo_Asn
destroy loo_Xml
destroy loo_Crypt