Sample code for 30+ languages & platforms
SQL Server

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 SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

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

    DECLARE @crypt int
    EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    EXEC sp_OASetProperty @crypt, 'EncodingMode', 'hex'
    EXEC sp_OASetProperty @crypt, 'HashAlgorithm', 'sha-1'

    DECLARE @hashStr nvarchar(4000)
    EXEC sp_OAMethod @crypt, 'HashFileENC', @hashStr OUT, 'qa_data/hamlet.xml'

    PRINT 'hash to sign: ' + @hashStr

    DECLARE @dsa int
    EXEC @hr = sp_OACreate 'Chilkat.Dsa', @dsa OUT

    DECLARE @pemPrivateKey nvarchar(4000)

    EXEC sp_OAMethod @dsa, 'LoadText', @pemPrivateKey OUT, 'qa_data/dsa/dsaPrivKey2.pem'
    EXEC sp_OAMethod @dsa, 'FromPem', @success OUT, @pemPrivateKey
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- Load the hash to be signed into the DSA object:
    EXEC sp_OAMethod @dsa, 'SetEncodedHash', @success OUT, 'hex', @hashStr
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- Sign the hash.
    EXEC sp_OAMethod @dsa, 'SignHash', @success OUT
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- Get the ASN.1 signature.
    DECLARE @asnSig nvarchar(4000)
    EXEC sp_OAMethod @dsa, 'GetEncodedSignature', @asnSig OUT, 'base64'

    PRINT 'Signature: ' + @asnSig

    -- Examine the details of the ASN.1 signature.
    -- We want to get the r,s values as hex strings..
    DECLARE @asn int
    EXEC @hr = sp_OACreate 'Chilkat.Asn', @asn OUT

    EXEC sp_OAMethod @asn, 'LoadEncoded', @success OUT, @asnSig, 'base64'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @asn, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @asn
        RETURN
      END

    -- Get the ASN.1 as XML.
    DECLARE @xml int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml OUT

    EXEC sp_OAMethod @asn, 'AsnToXml', @sTmp0 OUT
    EXEC sp_OAMethod @xml, 'LoadXml', @success OUT, @sTmp0

    PRINT 'Signature as XML: '
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    PRINT @sTmp0

    -- 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
    DECLARE @r nvarchar(4000)
    SELECT @r = '2C187F3AB6E47A66497B86CE97BB39E2133810F5'
    DECLARE @s nvarchar(4000)
    SELECT @s = '588E53D3F7B69636B48FD7175E99A3961BD7D775'

    -- Build the XML that will be converted to ASN.1
    EXEC sp_OAMethod @xml, 'Clear', NULL
    EXEC sp_OASetProperty @xml, 'Tag', 'sequence'
    EXEC sp_OAMethod @xml, 'NewChild2', NULL, 'int', @r
    EXEC sp_OAMethod @xml, 'NewChild2', NULL, 'int', @s

    -- Convert the XML to ASN.1
    EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
    EXEC sp_OAMethod @asn, 'LoadAsnXml', @success OUT, @sTmp0

    -- Emit the signature as DER encoded ASN.1 (base64)
    EXEC sp_OAMethod @asn, 'GetEncodedDer', @asnSig OUT, 'base64'

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

    DECLARE @dsa2 int
    EXEC @hr = sp_OACreate 'Chilkat.Dsa', @dsa2 OUT

    -- Load the DSA public key to be used for verification:
    DECLARE @pemPublicKey nvarchar(4000)

    EXEC sp_OAMethod @dsa2, 'LoadText', @pemPublicKey OUT, 'qa_data/dsa/dsaPubKey2.pem'
    EXEC sp_OAMethod @dsa2, 'FromPublicPem', @success OUT, @pemPublicKey
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @asn
        EXEC @hr = sp_OADestroy @xml
        EXEC @hr = sp_OADestroy @dsa2
        RETURN
      END

    -- Load the hash to be verified.
    EXEC sp_OAMethod @dsa2, 'SetEncodedHash', @success OUT, 'hex', @hashStr
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @asn
        EXEC @hr = sp_OADestroy @xml
        EXEC @hr = sp_OADestroy @dsa2
        RETURN
      END

    -- Load the ASN.1 signature:
    EXEC sp_OAMethod @dsa2, 'SetEncodedSignature', @success OUT, 'base64', @asnSig
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @asn
        EXEC @hr = sp_OADestroy @xml
        EXEC @hr = sp_OADestroy @dsa2
        RETURN
      END

    -- Verify:
    EXEC sp_OAMethod @dsa2, 'Verify', @success OUT
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
      END
    ELSE
      BEGIN

        PRINT 'DSA Signature Verified!'
      END

    EXEC @hr = sp_OADestroy @crypt
    EXEC @hr = sp_OADestroy @dsa
    EXEC @hr = sp_OADestroy @asn
    EXEC @hr = sp_OADestroy @xml
    EXEC @hr = sp_OADestroy @dsa2


END
GO