Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL lcPlaintext
LOCAL loJwe
LOCAL loJweProtHdr
LOCAL loPrng
LOCAL lnRecipientIndex
LOCAL lcStrJwe
LOCAL loJwe2
LOCAL lcOriginalPlaintext

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

lcPlaintext = "Live long and prosper."

loJwe = CreateObject('Chilkat.Jwe')

* First build the JWE Protected Header..
loJweProtHdr = CreateObject('Chilkat.JsonObject')
loJweProtHdr.AppendString("alg","PBES2-HS256+A128KW")
loJweProtHdr.AppendString("enc","A128GCM")

* 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.
loPrng = CreateObject('Chilkat.Prng')
loJweProtHdr.AppendString("p2s",loPrng.GenRandom(16,"base64url"))
loJweProtHdr.AppendString("p2c","1000")

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

* Don't forget to actually provide the protected header to the JWE object:
loJwe.SetProtectedHeader(loJweProtHdr)

* Set the PBES2 password
lnRecipientIndex = 0
loJwe.SetPassword(lnRecipientIndex,"top secret")

* Encrypt and return the JWE:
lcStrJwe = loJwe.Encrypt(lcPlaintext,"utf-8")
IF (loJwe.LastMethodSuccess <> 1) THEN
    ? loJwe.LastErrorText
    RELEASE loJwe
    RELEASE loJweProtHdr
    RELEASE loPrng
    CANCEL
ENDIF

* Show the JWE we just created:
? lcStrJwe

* Decrypt the JWE.
loJwe2 = CreateObject('Chilkat.Jwe')
lnSuccess = loJwe2.LoadJwe(lcStrJwe)
IF (lnSuccess <> 1) THEN
    ? loJwe2.LastErrorText
    RELEASE loJwe
    RELEASE loJweProtHdr
    RELEASE loPrng
    RELEASE loJwe2
    CANCEL
ENDIF

* Set the PBES2 password
loJwe2.SetPassword(lnRecipientIndex,"top secret")

* Decrypt.
lcOriginalPlaintext = loJwe2.Decrypt(0,"utf-8")
IF (loJwe2.LastMethodSuccess <> 1) THEN
    ? loJwe2.LastErrorText
    RELEASE loJwe
    RELEASE loJweProtHdr
    RELEASE loPrng
    RELEASE loJwe2
    CANCEL
ENDIF

? "original text: "
? lcOriginalPlaintext

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

RELEASE loJwe
RELEASE loJweProtHdr
RELEASE loPrng
RELEASE loJwe2