Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Perl) DSA R,S Signature ValuesSee more DSA ExamplesCreates 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.
use chilkat(); # This example requires the Chilkat API to have been previously unlocked. # See Global Unlock Sample for sample code. $crypt = chilkat::CkCrypt2->new(); $crypt->put_EncodingMode("hex"); $crypt->put_HashAlgorithm("sha-1"); $hashStr = $crypt->hashFileENC("qa_data/hamlet.xml"); print "hash to sign: " . $hashStr . "\r\n"; $dsa = chilkat::CkDsa->new(); $pemPrivateKey = $dsa->loadText("qa_data/dsa/dsaPrivKey2.pem"); $success = $dsa->FromPem($pemPrivateKey); if ($success == 0) { print $dsa->lastErrorText() . "\r\n"; exit; } # Load the hash to be signed into the DSA object: $success = $dsa->SetEncodedHash("hex",$hashStr); if ($success == 0) { print $dsa->lastErrorText() . "\r\n"; exit; } # Sign the hash. $success = $dsa->SignHash(); if ($success == 0) { print $dsa->lastErrorText() . "\r\n"; exit; } # Get the ASN.1 signature. $asnSig = $dsa->getEncodedSignature("base64"); print "Signature: " . $asnSig . "\r\n"; # Examine the details of the ASN.1 signature. # We want to get the r,s values as hex strings.. $asn = chilkat::CkAsn->new(); $success = $asn->LoadEncoded($asnSig,"base64"); if ($success == 0) { print $asn->lastErrorText() . "\r\n"; exit; } # Get the ASN.1 as XML. $xml = chilkat::CkXml->new(); $success = $xml->LoadXml($asn->asnToXml()); print "Signature as XML: " . "\r\n"; print $xml->getXml() . "\r\n"; # 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 $xml->Clear(); $xml->put_Tag("sequence"); $xml->NewChild2("int",$r); $xml->NewChild2("int",$s); # Convert the XML to ASN.1 $success = $asn->LoadAsnXml($xml->getXml()); # Emit the signature as DER encoded ASN.1 (base64) $asnSig = $asn->getEncodedDer("base64"); # -------------------------------------------------------------------- # Verify the signature using the asnSig we built from the r,s values # -------------------------------------------------------------------- $dsa2 = chilkat::CkDsa->new(); # Load the DSA public key to be used for verification: $pemPublicKey = $dsa2->loadText("qa_data/dsa/dsaPubKey2.pem"); $success = $dsa2->FromPublicPem($pemPublicKey); if ($success == 0) { print $dsa2->lastErrorText() . "\r\n"; exit; } # Load the hash to be verified. $success = $dsa2->SetEncodedHash("hex",$hashStr); if ($success == 0) { print $dsa2->lastErrorText() . "\r\n"; exit; } # Load the ASN.1 signature: $success = $dsa2->SetEncodedSignature("base64",$asnSig); if ($success == 0) { print $dsa2->lastErrorText() . "\r\n"; exit; } # Verify: $success = $dsa2->Verify(); if ($success == 0) { print $dsa2->lastErrorText() . "\r\n"; } else { print "DSA Signature Verified!" . "\r\n"; } |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.