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