Sample code for 30+ languages & platforms
SQL Server

JWE with Binary Data

See more JSON Web Encryption (JWE) Examples

Demonstrates how to create a JWE that contains a binary payload (such as a JPG image).

Note: This example requires Chilkat v9.5.0.66 or greater.

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 @iTmp0 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: This example requires Chilkat v9.5.0.66 or greater.

    -- Load a JPG file that will be the JWE payload.
    DECLARE @jpgBytes int
    EXEC @hr = sp_OACreate 'Chilkat.BinData', @jpgBytes OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    EXEC sp_OAMethod @jpgBytes, 'LoadFile', @success OUT, 'qa_data/jpg/starfish.jpg'
    -- Make sure your app checks the success/failure of the call to LoadFile..

    EXEC sp_OAGetProperty @jpgBytes, 'NumBytes', @iTmp0 OUT
    PRINT 'Original JPG size = ' + @iTmp0

    DECLARE @jwe int
    EXEC @hr = sp_OACreate 'Chilkat.Jwe', @jwe OUT

    DECLARE @jweProtHdr int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jweProtHdr OUT

    EXEC sp_OAMethod @jweProtHdr, 'AppendString', @success OUT, 'alg', 'A128KW'
    EXEC sp_OAMethod @jweProtHdr, 'AppendString', @success OUT, 'enc', 'A128CBC-HS256'
    EXEC sp_OAMethod @jwe, 'SetProtectedHeader', @success OUT, @jweProtHdr

    DECLARE @aesWrappingKey nvarchar(4000)
    SELECT @aesWrappingKey = 'GawgguFyGrWKav7AX4VKUg'
    EXEC sp_OAMethod @jwe, 'SetWrappingKey', @success OUT, 0, @aesWrappingKey, 'base64url'

    -- Encrypt and return the JWE in sbJwe:
    DECLARE @sbJwe int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbJwe OUT

    EXEC sp_OAMethod @jwe, 'EncryptBd', @success OUT, @jpgBytes, @sbJwe
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @jpgBytes
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJwe
        RETURN
      END

    -- Show the JWE:
    EXEC sp_OAMethod @sbJwe, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    EXEC sp_OAGetProperty @sbJwe, 'Length', @iTmp0 OUT
    PRINT 'size of JWE: ' + @iTmp0

    -- ---------------------------------------------------------
    -- Decrypt to get the original JPG file..

    DECLARE @jwe2 int
    EXEC @hr = sp_OACreate 'Chilkat.Jwe', @jwe2 OUT

    EXEC sp_OAMethod @jwe2, 'LoadJweSb', @success OUT, @sbJwe
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @jpgBytes
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJwe
        EXEC @hr = sp_OADestroy @jwe2
        RETURN
      END
    -- Set the AES wrap key.
    EXEC sp_OAMethod @jwe2, 'SetWrappingKey', @success OUT, 0, @aesWrappingKey, 'base64url'

    -- Decrypt.
    DECLARE @jpgOriginal int
    EXEC @hr = sp_OACreate 'Chilkat.BinData', @jpgOriginal OUT

    EXEC sp_OAMethod @jwe2, 'DecryptBd', @success OUT, 0, @jpgOriginal
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @jpgBytes
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJwe
        EXEC @hr = sp_OADestroy @jwe2
        EXEC @hr = sp_OADestroy @jpgOriginal
        RETURN
      END

    EXEC sp_OAGetProperty @jpgOriginal, 'NumBytes', @iTmp0 OUT
    PRINT 'Decrypted JPG size = ' + @iTmp0

    -- Save the decrypted JPG to a file.
    EXEC sp_OAMethod @jpgOriginal, 'WriteFile', @success OUT, 'qa_output/jwe_decrypted_starfish.jpg'


    PRINT 'success = ' + @success

    -- The output of this program, when tested, was:
    -- Original JPG size = 6229
    -- eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.9YFz_wteV ... 7Et3hKhpxnKEXw
    -- size of JWE: 8473
    -- Decrypted JPG size = 6229
    -- success = True

    EXEC @hr = sp_OADestroy @jpgBytes
    EXEC @hr = sp_OADestroy @jwe
    EXEC @hr = sp_OADestroy @jweProtHdr
    EXEC @hr = sp_OADestroy @sbJwe
    EXEC @hr = sp_OADestroy @jwe2
    EXEC @hr = sp_OADestroy @jpgOriginal


END
GO