Sample code for 30+ languages & platforms
Perl

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

Chilkat2 Perl
use strict;
use warnings;
use Chilkat2;

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

my $crypt = Chilkat2::Crypt2->new;

$crypt->EncodingMode('hex');
$crypt->HashAlgorithm('sha-1');

my $hashStr = $crypt->HashFileENC('qa_data/hamlet.xml');
print 'hash to sign: ', $hashStr, "\n";

my $dsa = Chilkat2::Dsa->new;

my $pemPrivateKey = $dsa->LoadText('qa_data/dsa/dsaPrivKey2.pem');
my $success = $dsa->FromPem($pemPrivateKey);
if (!$success) {
    print $dsa->LastErrorText, "\n";
    exit;
}

# Load the hash to be signed into the DSA object:
$success = $dsa->SetEncodedHash('hex', $hashStr);
if (!$success) {
    print $dsa->LastErrorText, "\n";
    exit;
}

# Sign the hash.
$success = $dsa->SignHash();
if (!$success) {
    print $dsa->LastErrorText, "\n";
    exit;
}

# Get the ASN.1 signature.
my $asnSig = $dsa->GetEncodedSignature('base64');
print 'Signature: ', $asnSig, "\n";

# Examine the details of the ASN.1 signature.
# We want to get the r,s values as hex strings..
my $asn = Chilkat2::Asn->new;
$success = $asn->LoadEncoded($asnSig, 'base64');
if (!$success) {
    print $asn->LastErrorText, "\n";
    exit;
}

# Get the ASN.1 as XML.
my $xml = Chilkat2::Xml->new;
$success = $xml->LoadXml($asn->AsnToXml());
print "Signature as XML: \n";
print $xml->GetXml(), "\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
my $r = '2C187F3AB6E47A66497B86CE97BB39E2133810F5';
my $s = '588E53D3F7B69636B48FD7175E99A3961BD7D775';

# Build the XML that will be converted to ASN.1
$xml->Clear();
$xml->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
# --------------------------------------------------------------------

my $dsa2 = Chilkat2::Dsa->new;

# Load the DSA public key to be used for verification:
my $pemPublicKey = $dsa2->LoadText('qa_data/dsa/dsaPubKey2.pem');
$success = $dsa2->FromPublicPem($pemPublicKey);
if (!$success) {
    print $dsa2->LastErrorText, "\n";
    exit;
}

# Load the hash to be verified.
$success = $dsa2->SetEncodedHash('hex', $hashStr);
if (!$success) {
    print $dsa2->LastErrorText, "\n";
    exit;
}

# Load the ASN.1 signature:
$success = $dsa2->SetEncodedSignature('base64', $asnSig);
if (!$success) {
    print $dsa2->LastErrorText, "\n";
    exit;
}

# Verify:
$success = $dsa2->Verify();
if (!$success) {
    print $dsa2->LastErrorText, "\n";
} else {
    print "DSA Signature Verified!\n";
}