Sample code for 30+ languages & platforms
SQL Server

Sign Manifest File to Generate a Passbook .pkpass file

See more Digital Signatures Examples

Demonstrates how to create a Passbook .pkpass archive by creating a signature of a manifest file and then zipping to a .pkpass archive.

Note: Chilkat also has the capability to do everything in-memory (no files would be involved). If this is of interest, please send email to support@chilkatsoft.com

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 requires the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    -- ---------------------------------------------------------------------------------------------
    -- Note: Chilkat also has the capability to do everything in-memory (no files would be involved).  
    -- See this example:  Sign Manifest File to Generate a Passbook .pkpass in Memory
    -- ---------------------------------------------------------------------------------------------

    -- First create the manifest.json

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

    DECLARE @crypt int
    EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT

    DECLARE @zip int
    EXEC @hr = sp_OACreate 'Chilkat.Zip', @zip OUT

    EXEC sp_OAMethod @zip, 'NewZip', @success OUT, 'qa_data/p7s/pass-wallet/example.pkpass'
    -- Set the AppendFromDir property to prevent that relative paths from being stored in the .pkpass archive.
    EXEC sp_OASetProperty @zip, 'AppendFromDir', 'qa_data/p7s/pass-wallet/'

    EXEC sp_OASetProperty @crypt, 'HashAlgorithm', 'sha1'
    -- Return hashes as lowercase hex.
    EXEC sp_OASetProperty @crypt, 'EncodingMode', 'hexlower'

    DECLARE @fileHash nvarchar(4000)

    DECLARE @filePath nvarchar(4000)

    SELECT @filePath = 'qa_data/p7s/pass-wallet/icon.png'
    EXEC sp_OAMethod @crypt, 'HashFileENC', @fileHash OUT, @filePath
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'icon.png', 0
    EXEC sp_OAMethod @manifest, 'UpdateString', @success OUT, '"icon.png"', @fileHash

    SELECT @filePath = 'qa_data/p7s/pass-wallet/icon@2x.png'
    EXEC sp_OAMethod @crypt, 'HashFileENC', @fileHash OUT, @filePath
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'icon@2x.png', 0
    EXEC sp_OAMethod @manifest, 'UpdateString', @success OUT, '"icon@2x.png"', @fileHash

    SELECT @filePath = 'qa_data/p7s/pass-wallet/logo.png'
    EXEC sp_OAMethod @crypt, 'HashFileENC', @fileHash OUT, @filePath
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'logo.png', 0
    EXEC sp_OAMethod @manifest, 'UpdateString', @success OUT, '"logo.png"', @fileHash

    SELECT @filePath = 'qa_data/p7s/pass-wallet/logo@2x.png'
    EXEC sp_OAMethod @crypt, 'HashFileENC', @fileHash OUT, @filePath
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'logo@2x.png', 0
    EXEC sp_OAMethod @manifest, 'UpdateString', @success OUT, '"logo@2x.png"', @fileHash

    SELECT @filePath = 'qa_data/p7s/pass-wallet/pass.json'
    EXEC sp_OAMethod @crypt, 'HashFileENC', @fileHash OUT, @filePath
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'pass.json', 0
    EXEC sp_OAMethod @manifest, 'UpdateString', @success OUT, '"pass.json"', @fileHash

    DECLARE @sbJson int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbJson OUT

    EXEC sp_OAMethod @manifest, 'EmitSb', @success OUT, @sbJson
    DECLARE @manifestPath nvarchar(4000)
    SELECT @manifestPath = 'qa_data/p7s/pass-wallet/manifest.json'
    EXEC sp_OAMethod @sbJson, 'WriteFile', @success OUT, @manifestPath, 'utf-8', 0
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'manifest.json', 0

    -- Make sure we have the Apple WWDR intermediate certificate available for 
    -- the cert chain in the signature.
    DECLARE @certVault int
    EXEC @hr = sp_OACreate 'Chilkat.XmlCertVault', @certVault OUT

    DECLARE @appleWwdrCert int
    EXEC @hr = sp_OACreate 'Chilkat.Cert', @appleWwdrCert OUT

    EXEC sp_OAMethod @appleWwdrCert, 'LoadByCommonName', @success OUT, 'Apple Worldwide Developer Relations Certification Authority'
    IF @success <> 1
      BEGIN

        PRINT 'The Apple WWDR intermediate certificate is not installed.'

        PRINT 'It is available at https://developer.apple.com/certificationauthority/AppleWWDRCA.cer'

        PRINT 'You may alternatively load the .cer like this...'
        EXEC sp_OAMethod @appleWwdrCert, 'LoadFromFile', @success OUT, 'qa_data/certs/AppleWWDRCA.cer'
        IF @success = 0
          BEGIN
            EXEC sp_OAGetProperty @appleWwdrCert, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
            EXEC @hr = sp_OADestroy @manifest
            EXEC @hr = sp_OADestroy @crypt
            EXEC @hr = sp_OADestroy @zip
            EXEC @hr = sp_OADestroy @sbJson
            EXEC @hr = sp_OADestroy @certVault
            EXEC @hr = sp_OADestroy @appleWwdrCert
            RETURN
          END

      END
    EXEC sp_OAMethod @certVault, 'AddCert', @success OUT, @appleWwdrCert
    EXEC sp_OAMethod @crypt, 'UseCertVault', @success OUT, @certVault

    -- Use a digital certificate and private key from a PFX file (.pfx or .p12).
    DECLARE @pfxPath nvarchar(4000)
    SELECT @pfxPath = 'qa_data/pfx/cert_test123.pfx'
    DECLARE @pfxPassword nvarchar(4000)
    SELECT @pfxPassword = 'test123'

    DECLARE @cert int
    EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert OUT

    EXEC sp_OAMethod @cert, 'LoadPfxFile', @success OUT, @pfxPath, @pfxPassword
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @cert, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @manifest
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @sbJson
        EXEC @hr = sp_OADestroy @certVault
        EXEC @hr = sp_OADestroy @appleWwdrCert
        EXEC @hr = sp_OADestroy @cert
        RETURN
      END

    -- Provide the signing cert (with associated private key).
    EXEC sp_OAMethod @crypt, 'SetSigningCert', @success OUT, @cert
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @crypt, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @manifest
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @sbJson
        EXEC @hr = sp_OADestroy @certVault
        EXEC @hr = sp_OADestroy @appleWwdrCert
        EXEC @hr = sp_OADestroy @cert
        RETURN
      END

    -- Specify the signed attributes to be included.
    -- (These attributes appear to not be necessary, but we're including
    -- them just in case they become necessary in the future.)
    DECLARE @jsonSignedAttrs int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonSignedAttrs OUT

    EXEC sp_OAMethod @jsonSignedAttrs, 'UpdateInt', @success OUT, 'contentType', 1
    EXEC sp_OAMethod @jsonSignedAttrs, 'UpdateInt', @success OUT, 'signingTime', 1
    EXEC sp_OAMethod @jsonSignedAttrs, 'Emit', @sTmp0 OUT
    EXEC sp_OASetProperty @crypt, 'SigningAttributes', @sTmp0

    -- Sign the manifest JSON file to produce a file named "signature".
    DECLARE @sigPath nvarchar(4000)
    SELECT @sigPath = 'qa_data/p7s/pass-wallet/signature'

    -- Create the "signature" file.
    EXEC sp_OAMethod @crypt, 'CreateP7S', @success OUT, @manifestPath, @sigPath
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @crypt, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @manifest
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @sbJson
        EXEC @hr = sp_OADestroy @certVault
        EXEC @hr = sp_OADestroy @appleWwdrCert
        EXEC @hr = sp_OADestroy @cert
        EXEC @hr = sp_OADestroy @jsonSignedAttrs
        RETURN
      END

    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'signature', 0

    -- ---------------------------------------------------------------------------------------------
    -- Note: Chilkat also has the capability to do everything in-memory (no files would be involved).  
    -- If this is of interest, please send email to support@chilkatsoft.com
    -- ---------------------------------------------------------------------------------------------

    -- Create the .pkipass archive (which is a .zip archive containing the required files).
    EXEC sp_OAMethod @zip, 'WriteZipAndClose', @success OUT
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @zip, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @manifest
        EXEC @hr = sp_OADestroy @crypt
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @sbJson
        EXEC @hr = sp_OADestroy @certVault
        EXEC @hr = sp_OADestroy @appleWwdrCert
        EXEC @hr = sp_OADestroy @cert
        EXEC @hr = sp_OADestroy @jsonSignedAttrs
        RETURN
      END


    PRINT 'Success.'

    EXEC @hr = sp_OADestroy @manifest
    EXEC @hr = sp_OADestroy @crypt
    EXEC @hr = sp_OADestroy @zip
    EXEC @hr = sp_OADestroy @sbJson
    EXEC @hr = sp_OADestroy @certVault
    EXEC @hr = sp_OADestroy @appleWwdrCert
    EXEC @hr = sp_OADestroy @cert
    EXEC @hr = sp_OADestroy @jsonSignedAttrs


END
GO