PureBasic
PureBasic
JWE with Binary Data
See more JSON Web Encryption (JWE) Examples
Demonstrates how to create a JWE that contains a binary payload (such as a JPG image).Note: This example requires Chilkat v9.5.0.66 or greater.
Chilkat PureBasic Downloads
IncludeFile "CkBinData.pb"
IncludeFile "CkStringBuilder.pb"
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.
; Load a JPG file that will be the JWE payload.
jpgBytes.i = CkBinData::ckCreate()
If jpgBytes.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkBinData::ckLoadFile(jpgBytes,"qa_data/jpg/starfish.jpg")
; Make sure your app checks the success/failure of the call to LoadFile..
Debug "Original JPG size = " + Str(CkBinData::ckNumBytes(jpgBytes))
jwe.i = CkJwe::ckCreate()
If jwe.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
jweProtHdr.i = CkJsonObject::ckCreate()
If jweProtHdr.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckAppendString(jweProtHdr,"alg","A128KW")
CkJsonObject::ckAppendString(jweProtHdr,"enc","A128CBC-HS256")
CkJwe::ckSetProtectedHeader(jwe,jweProtHdr)
aesWrappingKey.s = "GawgguFyGrWKav7AX4VKUg"
CkJwe::ckSetWrappingKey(jwe,0,aesWrappingKey,"base64url")
; Encrypt and return the JWE in sbJwe:
sbJwe.i = CkStringBuilder::ckCreate()
If sbJwe.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJwe::ckEncryptBd(jwe,jpgBytes,sbJwe)
If success <> 1
Debug CkJwe::ckLastErrorText(jwe)
CkBinData::ckDispose(jpgBytes)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkStringBuilder::ckDispose(sbJwe)
ProcedureReturn
EndIf
; Show the JWE:
Debug CkStringBuilder::ckGetAsString(sbJwe)
Debug "size of JWE: " + Str(CkStringBuilder::ckLength(sbJwe))
; ---------------------------------------------------------
; Decrypt to get the original JPG file..
jwe2.i = CkJwe::ckCreate()
If jwe2.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJwe::ckLoadJweSb(jwe2,sbJwe)
If success <> 1
Debug CkJwe::ckLastErrorText(jwe2)
CkBinData::ckDispose(jpgBytes)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkStringBuilder::ckDispose(sbJwe)
CkJwe::ckDispose(jwe2)
ProcedureReturn
EndIf
; Set the AES wrap key.
CkJwe::ckSetWrappingKey(jwe2,0,aesWrappingKey,"base64url")
; Decrypt.
jpgOriginal.i = CkBinData::ckCreate()
If jpgOriginal.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJwe::ckDecryptBd(jwe2,0,jpgOriginal)
If success <> 1
Debug CkJwe::ckLastErrorText(jwe2)
CkBinData::ckDispose(jpgBytes)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkStringBuilder::ckDispose(sbJwe)
CkJwe::ckDispose(jwe2)
CkBinData::ckDispose(jpgOriginal)
ProcedureReturn
EndIf
Debug "Decrypted JPG size = " + Str(CkBinData::ckNumBytes(jpgOriginal))
; Save the decrypted JPG to a file.
success = CkBinData::ckWriteFile(jpgOriginal,"qa_output/jwe_decrypted_starfish.jpg")
Debug "success = " + Str(success)
; The output of this program, when tested, was:
; Original JPG size = 6229
; eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.9YFz_wteV ... 7Et3hKhpxnKEXw
; size of JWE: 8473
; Decrypted JPG size = 6229
; success = True
CkBinData::ckDispose(jpgBytes)
CkJwe::ckDispose(jwe)
CkJsonObject::ckDispose(jweProtHdr)
CkStringBuilder::ckDispose(sbJwe)
CkJwe::ckDispose(jwe2)
CkBinData::ckDispose(jpgOriginal)
ProcedureReturn
EndProcedure