Sample code for 30+ languages & platforms
PowerBuilder

ECDSA Sign and Verify Data using Different Hash Algorithms

See more ECC Examples

Demonstrates how to create ECDSA signatures on data using different hash algorithms.

Note: This example requires Chilkat v9.5.0.85 or greater because the SignBd and VerifyBd methods were added in v9.5.0.85.

Chilkat PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
oleobject loo_PrivKey
oleobject loo_Bd
oleobject loo_Ecdsa
oleobject loo_Prng
string ls_Sig
oleobject loo_PubKey
oleobject loo_Ecc2
integer li_Result

li_Success = 0

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

// First load an ECDSA private key to be used for signing.
loo_PrivKey = create oleobject
li_rc = loo_PrivKey.ConnectToNewObject("Chilkat.PrivateKey")
if li_rc < 0 then
    destroy loo_PrivKey
    MessageBox("Error","Connecting to COM object failed")
    return
end if
li_Success = loo_PrivKey.LoadEncryptedPemFile("qa_data/ecc/secp256r1-key-pkcs8-secret.pem","secret")
if li_Success = 0 then
    Write-Debug loo_PrivKey.LastErrorText
    destroy loo_PrivKey
    return
end if

// Load some data to be signed.
loo_Bd = create oleobject
li_rc = loo_Bd.ConnectToNewObject("Chilkat.BinData")

li_Success = loo_Bd.LoadFile("qa_data/hamlet.xml")
if li_Success = 0 then
    Write-Debug "Failed to load file to be hashed."
    destroy loo_PrivKey
    destroy loo_Bd
    return
end if

loo_Ecdsa = create oleobject
li_rc = loo_Ecdsa.ConnectToNewObject("Chilkat.Ecc")

loo_Prng = create oleobject
li_rc = loo_Prng.ConnectToNewObject("Chilkat.Prng")

// Sign the sha256 hash of the data.  Return the ECDSA signature in the base64 encoding.
Write-Debug "ECDSA signing the sha256 hash of the data..."
ls_Sig = loo_Ecdsa.SignBd(loo_Bd,"sha256","base64",loo_PrivKey,loo_Prng)
Write-Debug "sig = " + ls_Sig

// Verify the signature against the original data.
// (We must use the same hash algorithm that was used when signing.)

// Load the public key that corresponds to the private key used for signing.
loo_PubKey = create oleobject
li_rc = loo_PubKey.ConnectToNewObject("Chilkat.PublicKey")

li_Success = loo_PubKey.LoadFromFile("qa_data/ecc/secp256r1-pub.pem")
if li_Success = 0 then
    Write-Debug loo_PubKey.LastErrorText
    destroy loo_PrivKey
    destroy loo_Bd
    destroy loo_Ecdsa
    destroy loo_Prng
    destroy loo_PubKey
    return
end if

loo_Ecc2 = create oleobject
li_rc = loo_Ecc2.ConnectToNewObject("Chilkat.Ecc")

li_Result = loo_Ecc2.VerifyBd(loo_Bd,"sha256",ls_Sig,"base64",loo_PubKey)
if li_Result <> 1 then
    Write-Debug loo_Ecc2.LastErrorText
    destroy loo_PrivKey
    destroy loo_Bd
    destroy loo_Ecdsa
    destroy loo_Prng
    destroy loo_PubKey
    destroy loo_Ecc2
    return
end if

Write-Debug "Verified!"

// ----------------------------------------------------------------------------------------
// Let's do the same thing, but with sha384 hashing...

Write-Debug "--------------------------------------------"
Write-Debug "ECDSA signing the sha384 hash of the data..."

ls_Sig = loo_Ecdsa.SignBd(loo_Bd,"sha384","base64",loo_PrivKey,loo_Prng)
Write-Debug "sig = " + ls_Sig

li_Result = loo_Ecc2.VerifyBd(loo_Bd,"sha384",ls_Sig,"base64",loo_PubKey)
if li_Result <> 1 then
    Write-Debug loo_Ecc2.LastErrorText
    destroy loo_PrivKey
    destroy loo_Bd
    destroy loo_Ecdsa
    destroy loo_Prng
    destroy loo_PubKey
    destroy loo_Ecc2
    return
end if

Write-Debug "Verified!"


destroy loo_PrivKey
destroy loo_Bd
destroy loo_Ecdsa
destroy loo_Prng
destroy loo_PubKey
destroy loo_Ecc2