Sample code for 30+ languages & platforms
SQL Server

JWE with DEFLATE Compression

See more JSON Web Encryption (JWE) Examples

Demonstrates how to DEFLATE ("zip") compress the JWE payload prior to encryption.

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.

    -- Create some plaintext to be encrypted.
    -- This example will demonstrate with and without DEFLATE (zip) compression.
    DECLARE @sbPlainText int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbPlainText OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    DECLARE @bCrLf int
    SELECT @bCrLf = 1
    DECLARE @line nvarchar(4000)
    SELECT @line = 'Live long and prosper.'
    EXEC sp_OAMethod @sbPlainText, 'AppendLine', @success OUT, @line, @bCrLf
    EXEC sp_OAMethod @sbPlainText, 'AppendLine', @success OUT, @line, @bCrLf
    EXEC sp_OAMethod @sbPlainText, 'AppendLine', @success OUT, @line, @bCrLf
    EXEC sp_OAMethod @sbPlainText, 'AppendLine', @success OUT, @line, @bCrLf

    -- The text to be encrypted:
    EXEC sp_OAMethod @sbPlainText, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

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

    -- Build the JWE Protected Header: {"alg":"A128KW","enc":"A128CBC-HS256","zip":"DEF"}
    -- The "zip":"DEF" parameter indicates that the plaintext payload should
    -- be compressed prior to encryption.
    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 @jweProtHdr, 'AppendString', @success OUT, 'zip', 'DEF'
    EXEC sp_OAMethod @jwe, 'SetProtectedHeader', @success OUT, @jweProtHdr

    -- Set the AES key wrap key:
    DECLARE @aesWrappingKey nvarchar(4000)
    SELECT @aesWrappingKey = 'GawgguFyGrWKav7AX4VKUg'
    EXEC sp_OAMethod @jwe, 'SetWrappingKey', @success OUT, 0, @aesWrappingKey, 'base64url'

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

    EXEC sp_OAMethod @jwe, 'EncryptSb', @success OUT, @sbPlainText, 'utf-8', @sbJweCompressed
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbPlainText
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJweCompressed
        RETURN
      END

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

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

    -- Now create a JWE without compression.
    EXEC sp_OAMethod @jweProtHdr, 'Delete', @success OUT, 'zip'
    -- Make sure to update the shared protected header:
    EXEC sp_OAMethod @jwe, 'SetProtectedHeader', @success OUT, @jweProtHdr

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

    EXEC sp_OAMethod @jwe, 'EncryptSb', @success OUT, @sbPlainText, 'utf-8', @sbJweUncompressed
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbPlainText
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJweCompressed
        EXEC @hr = sp_OADestroy @sbJweUncompressed
        RETURN
      END

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

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

    -- Decrypting is the same whether compression is used or not.
    -- The "zip" header in the JWE indicates that the payload should be 
    -- automatically decompressed (inflated) after decrypting.
    DECLARE @jwe2 int
    EXEC @hr = sp_OACreate 'Chilkat.Jwe', @jwe2 OUT

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

    -- Decrypt (also automatically decompresses).
    DECLARE @sbOriginalText int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbOriginalText OUT

    EXEC sp_OAMethod @jwe2, 'DecryptSb', @success OUT, 0, 'utf-8', @sbOriginalText
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbPlainText
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJweCompressed
        EXEC @hr = sp_OADestroy @sbJweUncompressed
        EXEC @hr = sp_OADestroy @jwe2
        EXEC @hr = sp_OADestroy @sbOriginalText
        RETURN
      END


    PRINT 'original text from compressed JWE: '
    EXEC sp_OAMethod @sbOriginalText, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    -- -----------------------------------------------------------
    -- Do the same with the uncompressed JWE

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

    -- Decrypt.
    EXEC sp_OAMethod @sbOriginalText, 'Clear', NULL
    EXEC sp_OAMethod @jwe2, 'DecryptSb', @success OUT, 0, 'utf-8', @sbOriginalText
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @jwe2, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @sbPlainText
        EXEC @hr = sp_OADestroy @jwe
        EXEC @hr = sp_OADestroy @jweProtHdr
        EXEC @hr = sp_OADestroy @sbJweCompressed
        EXEC @hr = sp_OADestroy @sbJweUncompressed
        EXEC @hr = sp_OADestroy @jwe2
        EXEC @hr = sp_OADestroy @sbOriginalText
        RETURN
      END


    PRINT 'original text from uncompressed JWE: '
    EXEC sp_OAMethod @sbOriginalText, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    -- ------------------------------------------------
    -- The output of this example is:
    -- (Note: Your output data will be different because the content encryption key is randomly generated.)

    -- eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiemlwIjoiREVGIn0.xuW-pEAIdEUFnk10m8ocursvktO8Of9ByCCAt6LgKkkOtCWCUn1kQw.zpGj-9WVni3cQxyOuZbcGA.0hzP1myua3oYpUHwCIY_3edBUREbUpLaX6wYuJduOdI.Ppc6aEO3y3B8BJ1FKMPjlA
    -- size of compressed JWE: 212
    -- eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.N4KeyC7nnSFkieJOyE24_zKeuV_m7v5UKoJb1TgV4Yc_r2RzUPNvyA.6AEdyXSCKx-iMmUJyypSLg.QpixfyrwhGpmwUDp623viik4smPav7vwPLiC2r-V-jwnSfEH3mxWu6DbrIz3mixaqATwynmEBzVPxvS9jTXpSAGCnniib4_0WoPl3r_wF5tlsKOEe--jpNso-DKd1Tp8jJxj3JkFWt3IRnUUKGj17g.sBfDwFc5fzpaI-UW8-SW4g
    -- size of uncompressed JWE: 303
    -- original text from compressed JWE: 
    -- Live long and prosper.
    -- Live long and prosper.
    -- Live long and prosper.
    -- Live long and prosper.
    -- 
    -- original text from uncompressed JWE: 
    -- Live long and prosper.
    -- Live long and prosper.
    -- Live long and prosper.
    -- Live long and prosper.
    -- 

    EXEC @hr = sp_OADestroy @sbPlainText
    EXEC @hr = sp_OADestroy @jwe
    EXEC @hr = sp_OADestroy @jweProtHdr
    EXEC @hr = sp_OADestroy @sbJweCompressed
    EXEC @hr = sp_OADestroy @sbJweUncompressed
    EXEC @hr = sp_OADestroy @jwe2
    EXEC @hr = sp_OADestroy @sbOriginalText


END
GO