Sample code for 30+ languages & platforms
SQL Server

DSA Signature Create and Verify

See more DSA Examples

Shows how to create a DSA (DSS) signature for the contents of a file. The first step is to create an SHA-1 hash of the file contents. The hash is signed using the Digital Signature Algorithm and the signature bytes are retrieved as a hex-encoded string.

The 2nd part of the example loads the signature and verifies it against the hash.

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'

    -- Return the SHA-1 hash of a file.  The file may be any size.
    -- The Chilkat Crypt component will stream the file when 
    -- computing the hash, keeping the memory usage constant
    -- and reasonable.
    -- The 20-byte SHA-1 hash is returned as a hex-encoded string.
    DECLARE @hashStr nvarchar(4000)
    EXEC sp_OAMethod @crypt, 'HashFileENC', @hashStr OUT, 'hamlet.xml'

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

    -- Load a DSA private key from a PEM file.  Chilkat DSA
    -- provides the ability to load and save DSA public and private
    -- keys from encrypted or non-encrypted PEM or DER.
    -- The LoadText method is for convenience only.  You may
    -- use any means to load the contents of a PEM file into
    -- a string.
    DECLARE @pemPrivateKey nvarchar(4000)

    EXEC sp_OAMethod @dsa, 'LoadText', @pemPrivateKey OUT, 'dsa_priv.pem'
    EXEC sp_OAMethod @dsa, 'FromPem', @success OUT, @pemPrivateKey
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- You may optionally verify the key to ensure that it is a valid
    -- DSA key.
    EXEC sp_OAMethod @dsa, 'VerifyKey', @success OUT
    IF @success <> 1
      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 <> 1
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- Now that the DSA object contains both the private key and hash,
    -- it is ready to create the signature:
    EXEC sp_OAMethod @dsa, 'SignHash', @success OUT
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @dsa, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        RETURN
      END

    -- If SignHash is successful, the DSA object contains the
    -- signature.  It may be accessed as a hex or base64 encoded
    -- string.  (It is also possible to access directly in byte array form via
    -- the "Signature" property.)
    DECLARE @hexSig nvarchar(4000)
    EXEC sp_OAMethod @dsa, 'GetEncodedSignature', @hexSig OUT, 'hex'

    PRINT 'Signature:'

    PRINT @hexSig

    -- -----------------------------------------------------------
    -- Step 2: Verify the DSA Signature
    -- -----------------------------------------------------------

    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, 'dsa_pub.pem'
    EXEC sp_OAMethod @dsa2, 'FromPublicPem', @success OUT, @pemPublicKey
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @dsa2
        RETURN
      END

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

    -- Load the signature:
    EXEC sp_OAMethod @dsa2, 'SetEncodedSignature', @success OUT, 'hex', @hexSig
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @dsa2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @dsa
        EXEC @hr = sp_OADestroy @dsa2
        RETURN
      END

    -- Verify:
    EXEC sp_OAMethod @dsa2, 'Verify', @success OUT
    IF @success <> 1
      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 @dsa2


END
GO