Sample code for 30+ languages & platforms
Lianja

JWE using A256GCMKW

See more JSON Web Encryption (JWE) Examples

This example demonstrates creating a JCE with AES GCM key wrap.

Chilkat Lianja Downloads

Lianja
llSuccess = .F.

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

lcPlaintext = "My text to enrypt"

loJwe = createobject("CkJwe")

// First build the JWE Protected Header: 

//         {
//             "alg": "A256GCMKW",
//             "kid": "18ec08e1-bfa9-4d95-b205-2b4dd1d4321d",
//             "tag": "kfPduVQ3T3H6vnewt--ksw",
//             "iv": "KkYT0GX_2jHlfqN_",
//             "enc": "A128CBC-HS256"
//         }

loJweProtHdr = createobject("CkJsonObject")
loJweProtHdr.AppendString("alg","A256GCMKW")
// kid is optional
loJweProtHdr.AppendString("kid","18ec08e1-bfa9-4d95-b205-2b4dd1d4321d")
// tag is optional
loJweProtHdr.AppendString("tag","kfPduVQ3T3H6vnewt--ksw")
loJweProtHdr.AppendString("enc","A256GCM")
// the iv should be 16 random chars.
loPrng = createobject("CkPrng")
loJweProtHdr.AppendString("iv",loPrng.RandomString(16,.T.,.T.,.T.))
loJwe.SetProtectedHeader(loJweProtHdr)

? "JWE Protected Header: " + loJweProtHdr.Emit()
? "--"

// Given that we have 256-bit AES, our key should be 32 bytes.
// The ascii string here is 32 bytes, therefore the 2nd arg is "ascii" to use these
// ascii chars directly as the key.
lcAesWrappingKey = "2baf4f730f5e4542b428593ef9cceb0e"
loJwe.SetWrappingKey(0,lcAesWrappingKey,"ascii")

// Encrypt and return the JWE:
lcStrJwe = loJwe.Encrypt(lcPlaintext,"utf-8")
if (loJwe.LastMethodSuccess <> .T.) then
    ? loJwe.LastErrorText
    release loJwe
    release loJweProtHdr
    release loPrng
    return
endif

// Show the JWE we just created:
? lcStrJwe

// Decrypt the JWE that was just produced.
// 1) Load the JWE.
// 2) Set the AES wrapping key.
// 3) Decrypt.
loJwe2 = createobject("CkJwe")
llSuccess = loJwe2.LoadJwe(lcStrJwe)
if (llSuccess <> .T.) then
    ? loJwe2.LastErrorText
    release loJwe
    release loJweProtHdr
    release loPrng
    release loJwe2
    return
endif

// Set the AES wrap key.  Important to use "ascii"
loJwe2.SetWrappingKey(0,lcAesWrappingKey,"ascii")

// Decrypt.
lcOriginalPlaintext = loJwe2.Decrypt(0,"utf-8")
if (loJwe2.LastMethodSuccess <> .T.) then
    ? loJwe2.LastErrorText
    release loJwe
    release loJweProtHdr
    release loPrng
    release loJwe2
    return
endif

? "original text: "
? lcOriginalPlaintext


release loJwe
release loJweProtHdr
release loPrng
release loJwe2