Sample code for 30+ languages & platforms
PowerBuilder

DSA R,S Signature Values

See more DSA Examples

Creates a DSA signature. Gets r,s values from the signature. Re-creates the DSA signature ASN.1 from the r,s values. Then verifies the signature using the re-created ASN.1 DSA signature.

Chilkat PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
oleobject loo_Crypt
string ls_HashStr
oleobject loo_Dsa
string ls_PemPrivateKey
string ls_AsnSig
oleobject loo_Asn
oleobject loo_Xml
string r
string s
oleobject loo_Dsa2
string ls_PemPublicKey

li_Success = 0

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

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

loo_Crypt.EncodingMode = "hex"
loo_Crypt.HashAlgorithm = "sha-1"

ls_HashStr = loo_Crypt.HashFileENC("qa_data/hamlet.xml")
Write-Debug "hash to sign: " + ls_HashStr

loo_Dsa = create oleobject
li_rc = loo_Dsa.ConnectToNewObject("Chilkat.Dsa")

ls_PemPrivateKey = loo_Dsa.LoadText("qa_data/dsa/dsaPrivKey2.pem")
li_Success = loo_Dsa.FromPem(ls_PemPrivateKey)
if li_Success = 0 then
    Write-Debug loo_Dsa.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    return
end if

// Load the hash to be signed into the DSA object:
li_Success = loo_Dsa.SetEncodedHash("hex",ls_HashStr)
if li_Success = 0 then
    Write-Debug loo_Dsa.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    return
end if

// Sign the hash.
li_Success = loo_Dsa.SignHash()
if li_Success = 0 then
    Write-Debug loo_Dsa.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    return
end if

// Get the ASN.1 signature.
ls_AsnSig = loo_Dsa.GetEncodedSignature("base64")
Write-Debug "Signature: " + ls_AsnSig

// Examine the details of the ASN.1 signature.
// We want to get the r,s values as hex strings..
loo_Asn = create oleobject
li_rc = loo_Asn.ConnectToNewObject("Chilkat.Asn")

li_Success = loo_Asn.LoadEncoded(ls_AsnSig,"base64")
if li_Success = 0 then
    Write-Debug loo_Asn.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    destroy loo_Asn
    return
end if

// Get the ASN.1 as XML.
loo_Xml = create oleobject
li_rc = loo_Xml.ConnectToNewObject("Chilkat.Xml")

li_Success = loo_Xml.LoadXml(loo_Asn.AsnToXml())
Write-Debug "Signature as XML: "
Write-Debug loo_Xml.GetXml()

// Sample XML shown here.
// The r and s values are the two hex strings in the XML.

// <?xml version="1.0" encoding="utf-8"?>
// <sequence>
//     <int>2C187F3AB6E47A66497B86CE97BB39E2133810F5</int>
//     <int>588E53D3F7B69636B48FD7175E99A3961BD7D775</int>
// </sequence>

// Pretend we're starting with r,s
r = "2C187F3AB6E47A66497B86CE97BB39E2133810F5"
s = "588E53D3F7B69636B48FD7175E99A3961BD7D775"

// Build the XML that will be converted to ASN.1
loo_Xml.Clear()
loo_Xml.Tag = "sequence"
loo_Xml.NewChild2("int",r)
loo_Xml.NewChild2("int",s)

// Convert the XML to ASN.1
li_Success = loo_Asn.LoadAsnXml(loo_Xml.GetXml())

// Emit the signature as DER encoded ASN.1 (base64)
ls_AsnSig = loo_Asn.GetEncodedDer("base64")

// --------------------------------------------------------------------
// Verify the signature using the asnSig we built from the r,s values
// --------------------------------------------------------------------

loo_Dsa2 = create oleobject
li_rc = loo_Dsa2.ConnectToNewObject("Chilkat.Dsa")

// Load the DSA public key to be used for verification:

ls_PemPublicKey = loo_Dsa2.LoadText("qa_data/dsa/dsaPubKey2.pem")
li_Success = loo_Dsa2.FromPublicPem(ls_PemPublicKey)
if li_Success = 0 then
    Write-Debug loo_Dsa2.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    destroy loo_Asn
    destroy loo_Xml
    destroy loo_Dsa2
    return
end if

// Load the hash to be verified.
li_Success = loo_Dsa2.SetEncodedHash("hex",ls_HashStr)
if li_Success = 0 then
    Write-Debug loo_Dsa2.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    destroy loo_Asn
    destroy loo_Xml
    destroy loo_Dsa2
    return
end if

// Load the ASN.1 signature:
li_Success = loo_Dsa2.SetEncodedSignature("base64",ls_AsnSig)
if li_Success = 0 then
    Write-Debug loo_Dsa2.LastErrorText
    destroy loo_Crypt
    destroy loo_Dsa
    destroy loo_Asn
    destroy loo_Xml
    destroy loo_Dsa2
    return
end if

// Verify:
li_Success = loo_Dsa2.Verify()
if li_Success = 0 then
    Write-Debug loo_Dsa2.LastErrorText
else
    Write-Debug "DSA Signature Verified!"
end if



destroy loo_Crypt
destroy loo_Dsa
destroy loo_Asn
destroy loo_Xml
destroy loo_Dsa2