DataFlex
DataFlex
JWE using PBES2 Key Wrapping
See more JSON Web Encryption (JWE) Examples
Demonstrates how to create and decrypt a JWE that using PBES2 key wrapping.This example demonstrates PBES2 with HMAC SHA-256 and A128KW wrapping. It is also possible to do the following by simply changing the "alg" parameter:
- PBES2 with HMAC SHA-384 and A192KW wrapping
- PBES2 with HMAC SHA-512 and A256KW wrapping
Note: This example requires Chilkat v9.5.0.66 or greater.
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
String sPlaintext
Handle hoJwe
Variant vJweProtHdr
Handle hoJweProtHdr
Handle hoPrng
Integer iRecipientIndex
String sStrJwe
Handle hoJwe2
String sOriginalPlaintext
String sTemp1
Boolean bTemp1
Move False To iSuccess
// 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.
Move "Live long and prosper." To sPlaintext
Get Create (RefClass(cComChilkatJwe)) To hoJwe
If (Not(IsComObjectCreated(hoJwe))) Begin
Send CreateComObject of hoJwe
End
// First build the JWE Protected Header..
Get Create (RefClass(cComChilkatJsonObject)) To hoJweProtHdr
If (Not(IsComObjectCreated(hoJweProtHdr))) Begin
Send CreateComObject of hoJweProtHdr
End
Get ComAppendString Of hoJweProtHdr "alg" "PBES2-HS256+A128KW" To iSuccess
Get ComAppendString Of hoJweProtHdr "enc" "A128GCM" To iSuccess
// PBES2 requires two additional parameters:
// 1) A random salt parameter ("p2s") containing 8 or more bytes in base64url format.
// 2) An iteration count parameter ("p2c"). A minimum count of 1000 is recommended.
// The iteration count is intended to make the PBES2 computation more expensive (time consuming)
// to prevent brute-force attacks.
Get Create (RefClass(cComChilkatPrng)) To hoPrng
If (Not(IsComObjectCreated(hoPrng))) Begin
Send CreateComObject of hoPrng
End
Get ComGenRandom Of hoPrng 16 "base64url" To sTemp1
Get ComAppendString Of hoJweProtHdr "p2s" sTemp1 To iSuccess
Get ComAppendString Of hoJweProtHdr "p2c" "1000" To iSuccess
Get ComEmit Of hoJweProtHdr To sTemp1
Showln "JWE Protected Header: " sTemp1
Showln "--"
// Don't forget to actually provide the protected header to the JWE object:
Get pvComObject of hoJweProtHdr to vJweProtHdr
Get ComSetProtectedHeader Of hoJwe vJweProtHdr To iSuccess
// Set the PBES2 password
Move 0 To iRecipientIndex
Get ComSetPassword Of hoJwe iRecipientIndex "top secret" To iSuccess
// Encrypt and return the JWE:
Get ComEncrypt Of hoJwe sPlaintext "utf-8" To sStrJwe
Get ComLastMethodSuccess Of hoJwe To bTemp1
If (bTemp1 <> True) Begin
Get ComLastErrorText Of hoJwe To sTemp1
Showln sTemp1
Procedure_Return
End
// Show the JWE we just created:
Showln sStrJwe
// Decrypt the JWE.
Get Create (RefClass(cComChilkatJwe)) To hoJwe2
If (Not(IsComObjectCreated(hoJwe2))) Begin
Send CreateComObject of hoJwe2
End
Get ComLoadJwe Of hoJwe2 sStrJwe To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoJwe2 To sTemp1
Showln sTemp1
Procedure_Return
End
// Set the PBES2 password
Get ComSetPassword Of hoJwe2 iRecipientIndex "top secret" To iSuccess
// Decrypt.
Get ComDecrypt Of hoJwe2 0 "utf-8" To sOriginalPlaintext
Get ComLastMethodSuccess Of hoJwe2 To bTemp1
If (bTemp1 <> True) Begin
Get ComLastErrorText Of hoJwe2 To sTemp1
Showln sTemp1
Procedure_Return
End
Showln "original text: "
Showln sOriginalPlaintext
// Sample output:
// JWE Protected Header: {"alg":"PBES2-HS256+A128KW","enc":"A128GCM","p2s":"z39rTEfRy1T1Yn_D1mZRlg","p2c":"1000"}
// --
// eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIiwicDJzIjoiejM5clRFZlJ5MVQxWW5fRDFtWlJsZyIsInAyYyI6IjEwMDAifQ.koYt6PrFmYwcwdcT7ZcvXHA1d-Xez5h4.luGlbvEnZp-7IsBOj42Yhw.YMTcfLf8Qe4zazozGV2OAu3cUdQ8Kg.rWub47ESWkc6IqZJTvSTmg
// original text:
// Live long and prosper.
End_Procedure