PureBasic
PureBasic
JWE using "dir" Direct use of Shared Symmetric Key
See more JSON Web Encryption (JWE) Examples
Demonstrates how to create a JWE using the "dir" alg -- which is to directly use a shared symmetric key.Note: This example requires Chilkat v9.5.0.66 or greater.
Chilkat PureBasic Downloads
IncludeFile "CkJwe.pb"
IncludeFile "CkJsonObject.pb"
Procedure ChilkatExample()
success.i = 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.
plaintext.s = "Live long and prosper."
jwe.i = CkJwe::ckCreate()
If jwe.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; First build the JWE Protected Header..
jweProtHdr.i = CkJsonObject::ckCreate()
If jweProtHdr.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckAppendString(jweProtHdr,"alg","dir")
CkJsonObject::ckAppendString(jweProtHdr,"enc","A128GCM")
; Don't forget to actually provide the protected header to the JWE object:
CkJwe::ckSetProtectedHeader(jwe,jweProtHdr)
; The JWE is to use 128-bit AES GCM encryption as specified by the "enc" parameter.
; Given that the "alg" = "dir", we are to directly specify the AES GCM key.
; (It is assumed that the decrypting side also has knowledge of the direct key to be used..)
; Our key will be these 16 hex bytes: 000102030405060708090A0B0C0D0E0F
; The SetWrappingKey method is also used for "dir" direct keys.
; However, if there are multiple recipients, they must all share the same CEK (Content Encryption Key),
; which is specified by calling SetWrappingKey with an index of 0.
recipientIndex.i = 0
CkJwe::ckSetWrappingKey(jwe,recipientIndex,"000102030405060708090A0B0C0D0E0F","hex")
; Encrypt and return the JWE:
strJwe.s = CkJwe::ckEncrypt(jwe,plaintext,"utf-8")
If CkJwe::ckLastMethodSuccess(jwe) <> 1
Debug CkJwe::ckLastErrorText(jwe)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
ProcedureReturn
EndIf
; Show the JWE we just created:
Debug strJwe
; Decrypt the JWE.
jwe2.i = CkJwe::ckCreate()
If jwe2.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJwe::ckLoadJwe(jwe2,strJwe)
If success <> 1
Debug CkJwe::ckLastErrorText(jwe2)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkJwe::ckDispose(jwe2)
ProcedureReturn
EndIf
CkJwe::ckSetWrappingKey(jwe2,0,"000102030405060708090A0B0C0D0E0F","hex")
; Decrypt.
originalPlaintext.s = CkJwe::ckDecrypt(jwe2,0,"utf-8")
If CkJwe::ckLastMethodSuccess(jwe2) <> 1
Debug CkJwe::ckLastErrorText(jwe2)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkJwe::ckDispose(jwe2)
ProcedureReturn
EndIf
Debug "original text: "
Debug originalPlaintext
; Sample output:
; eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0..20HX5Huc7f1nQC4pBUtiCQ.axFZIxtZy5j0ifJQUzGXLKIpsBuxJA.eBrOC-NrsreN6JeGuOPk1g
; original text:
; Live long and prosper.
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkJwe::ckDispose(jwe2)
ProcedureReturn
EndProcedure