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