Sample code for 30+ languages & platforms
Lua Requires Chilkat v9.5.0.66+

JWE with DEFLATE Compression

See more JSON Web Encryption (JWE) Examples

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

Chilkat Lua Downloads

Lua
local chilkat = require("chilkat")

-- This requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.

-- Create some plaintext to be encrypted.
-- This example will demonstrate with and without DEFLATE (zip) compression.
local sbPlainText = chilkat.StringBuilder.new()
local bCrLf = true
local line = "Live long and prosper."
sbPlainText:append_line(line, bCrLf)
sbPlainText:append_line(line, bCrLf)
sbPlainText:append_line(line, bCrLf)
sbPlainText:append_line(line, bCrLf)

-- The text to be encrypted:
print(sbPlainText:get_as_string())

local jwe = chilkat.Jwe.new()

-- 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.
local jweProtHdr = chilkat.JsonObject.new()
jweProtHdr:append_string("alg", "A128KW")
jweProtHdr:append_string("enc", "A128CBC-HS256")
jweProtHdr:append_string("zip", "DEF")
jwe:set_protected_header(jweProtHdr)

-- Set the AES key wrap key:
local aesWrappingKey = "GawgguFyGrWKav7AX4VKUg"
jwe:set_wrapping_key(0, aesWrappingKey, "base64url")

-- Encrypt and return the JWE in sbJweCompressed:
local sbJweCompressed = chilkat.StringBuilder.new()
local success = jwe:encrypt_sb(sbPlainText, "utf-8", sbJweCompressed)
if not success then
    print(jwe.last_error_text)
    return
end

-- Show the compressed JWE:
print(sbJweCompressed:get_as_string())
print("size of compressed JWE: " .. sbJweCompressed.length)

-- Now create a JWE without compression.
jweProtHdr:delete("zip")
-- Make sure to update the shared protected header:
jwe:set_protected_header(jweProtHdr)

local sbJweUncompressed = chilkat.StringBuilder.new()
success = jwe:encrypt_sb(sbPlainText, "utf-8", sbJweUncompressed)
if not success then
    print(jwe.last_error_text)
    return
end

-- Show the uncompressed JWE:
print(sbJweUncompressed:get_as_string())
print("size of uncompressed JWE: " .. sbJweUncompressed.length)

-- 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.
local jwe2 = chilkat.Jwe.new()
success = jwe2:load_jwe_sb(sbJweCompressed)
if not success then
    print(jwe2.last_error_text)
    return
end

-- Set the AES wrap key.
jwe2:set_wrapping_key(0, aesWrappingKey, "base64url")

-- Decrypt (also automatically decompresses).
local sbOriginalText = chilkat.StringBuilder.new()
success = jwe2:decrypt_sb(0, "utf-8", sbOriginalText)
if not success then
    print(jwe2.last_error_text)
    return
end

print("original text from compressed JWE: ")
print(sbOriginalText:get_as_string())

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

success = jwe2:load_jwe_sb(sbJweUncompressed)
if not success then
    print(jwe2.last_error_text)
    return
end

-- Set the AES wrap key.
jwe2:set_wrapping_key(0, aesWrappingKey, "base64url")

-- Decrypt.
sbOriginalText:clear()
success = jwe2:decrypt_sb(0, "utf-8", sbOriginalText)
if not success then
    print(jwe2.last_error_text)
    return
end

print("original text from uncompressed JWE: ")
print(sbOriginalText:get_as_string())

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