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