Sample code for 30+ languages & platforms
SQL Server Requires Chilkat v11.0.0+

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