Sample code for 30+ languages & platforms
PureBasic

JWE using ECDH-ES+A256KW

See more JSON Web Encryption (JWE) Examples

Create a JWE with the following public/private key pair:
{
    "kty": "EC",
    "d": "jZCffzVqJjryBH4EoaN0oD-TyLXrW2XHoDdIuPZnk8c",
    "use": "enc",
    "crv": "P-256",
    "kid": "evEK2thJMsWxBYRivXI8ykUf6n6zizLiLCGH3s58wKs",
    "x": "LOakgGvxWBsWbCPLY6Vq6OuBktIqG8POXFXe7ngQ2oM",
    "y": "voJvS6I-Mc4qqmEA_G2hLQqBck3a3vqaJbmzY7YPUD4",
    "alg": "ECDH-ES+A256KW"
}

Also shows how to decrypt.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkPrivateKey.pb"
IncludeFile "CkJwt.pb"
IncludeFile "CkJwe.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkPublicKey.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ; Create the following JSON:
    ; {
    ;     "kty": "EC",
    ;     "d": "jZCffzVqJjryBH4EoaN0oD-TyLXrW2XHoDdIuPZnk8c",
    ;     "use": "enc",
    ;     "crv": "P-256",
    ;     "kid": "evEK2thJMsWxBYRivXI8ykUf6n6zizLiLCGH3s58wKs",
    ;     "x": "LOakgGvxWBsWbCPLY6Vq6OuBktIqG8POXFXe7ngQ2oM",
    ;     "y": "voJvS6I-Mc4qqmEA_G2hLQqBck3a3vqaJbmzY7YPUD4",
    ;     "alg": "ECDH-ES+A256KW"
    ; }

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateString(json,"kty","EC")
    CkJsonObject::ckUpdateString(json,"d","jZCffzVqJjryBH4EoaN0oD-TyLXrW2XHoDdIuPZnk8c")
    CkJsonObject::ckUpdateString(json,"use","enc")
    CkJsonObject::ckUpdateString(json,"crv","P-256")
    CkJsonObject::ckUpdateString(json,"kid","evEK2thJMsWxBYRivXI8ykUf6n6zizLiLCGH3s58wKs")
    CkJsonObject::ckUpdateString(json,"x","LOakgGvxWBsWbCPLY6Vq6OuBktIqG8POXFXe7ngQ2oM")
    CkJsonObject::ckUpdateString(json,"y","voJvS6I-Mc4qqmEA_G2hLQqBck3a3vqaJbmzY7YPUD4")
    CkJsonObject::ckUpdateString(json,"alg","ECDH-ES+A256KW")

    pubkey.i = CkPublicKey::ckCreate()
    If pubkey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPublicKey::ckLoadFromString(pubkey,CkJsonObject::ckEmit(json))
    If success = 0
        Debug CkPublicKey::ckLastErrorText(pubkey)
        CkJsonObject::ckDispose(json)
        CkPublicKey::ckDispose(pubkey)
        ProcedureReturn
    EndIf

    ; Build our protected header:

    ; 	{
    ; 	  "alg": "ECDH-ES+A256KW",
    ; 	  "enc": "A256GCM",
    ; 	  "exp": 1621957030,
    ; 	  "cty": "NJWT",
    ; 	  "epk": {
    ; 	    "kty": "EC",
    ; 	    "x": "QLpJ_LpFx-6yJhsb4OvHwU1khLnviiOwYOvmf5clK7w"
    ; 	    "y": "AJh7pJ3zZKDJkm8rbeG69GBooTosXJgSsvNFH0i3Vxnu"
    ; 	    "crv": "BP-256"
    ; 	  }
    ; 	}

    ; Use jwt only for getting the current date/time + 3600 seconds.
    jwt.i = CkJwt::ckCreate()
    If jwt.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::ckUpdateString(jweProtHdr,"alg","ECDH-ES+A256KW")
    CkJsonObject::ckUpdateString(jweProtHdr,"enc","A256GCM")
    CkJsonObject::ckUpdateInt(jweProtHdr,"exp",CkJwt::ckGenNumericDate(jwt,3600))
    CkJsonObject::ckUpdateString(jweProtHdr,"cty","NJWT")
    CkJsonObject::ckUpdateString(jweProtHdr,"epk.kty","EC")
    CkJsonObject::ckUpdateString(jweProtHdr,"epk.x","LOakgGvxWBsWbCPLY6Vq6OuBktIqG8POXFXe7ngQ2oM")
    CkJsonObject::ckUpdateString(jweProtHdr,"epk.y","voJvS6I-Mc4qqmEA_G2hLQqBck3a3vqaJbmzY7YPUD4")
    CkJsonObject::ckUpdateString(jweProtHdr,"epk.crv","P-256")

    jwe.i = CkJwe::ckCreate()
    If jwe.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJwe::ckSetProtectedHeader(jwe,jweProtHdr)
    CkJwe::ckSetPublicKey(jwe,0,pubkey)

    plainText.s = "This is the text to be encrypted."
    strJwe.s = CkJwe::ckEncrypt(jwe,plainText,"utf-8")
    If CkJwe::ckLastMethodSuccess(jwe) <> 1
        Debug CkJwe::ckLastErrorText(jwe)
        CkJsonObject::ckDispose(json)
        CkPublicKey::ckDispose(pubkey)
        CkJwt::ckDispose(jwt)
        CkJsonObject::ckDispose(jweProtHdr)
        CkJwe::ckDispose(jwe)
        ProcedureReturn
    EndIf

    Debug strJwe

    ; Let's decrypt...
    privkey.i = CkPrivateKey::ckCreate()
    If privkey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPrivateKey::ckLoadJwk(privkey,CkJsonObject::ckEmit(json))
    If success = 0
        Debug CkPrivateKey::ckLastErrorText(privkey)
        CkJsonObject::ckDispose(json)
        CkPublicKey::ckDispose(pubkey)
        CkJwt::ckDispose(jwt)
        CkJsonObject::ckDispose(jweProtHdr)
        CkJwe::ckDispose(jwe)
        CkPrivateKey::ckDispose(privkey)
        ProcedureReturn
    EndIf

    jwe2.i = CkJwe::ckCreate()
    If jwe2.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkJwe::ckLoadJwe(jwe2,strJwe)
    If success = 0
        Debug CkJwe::ckLastErrorText(jwe2)
        CkJsonObject::ckDispose(json)
        CkPublicKey::ckDispose(pubkey)
        CkJwt::ckDispose(jwt)
        CkJsonObject::ckDispose(jweProtHdr)
        CkJwe::ckDispose(jwe)
        CkPrivateKey::ckDispose(privkey)
        CkJwe::ckDispose(jwe2)
        ProcedureReturn
    EndIf

    CkJwe::ckSetPrivateKey(jwe2,0,privkey)

    ;  Decrypt.
    decryptedText.s = CkJwe::ckDecrypt(jwe2,0,"utf-8")
    If CkJwe::ckLastMethodSuccess(jwe2) <> 1
        Debug CkJwe::ckLastErrorText(jwe2)
        CkJsonObject::ckDispose(json)
        CkPublicKey::ckDispose(pubkey)
        CkJwt::ckDispose(jwt)
        CkJsonObject::ckDispose(jweProtHdr)
        CkJwe::ckDispose(jwe)
        CkPrivateKey::ckDispose(privkey)
        CkJwe::ckDispose(jwe2)
        ProcedureReturn
    EndIf

    Debug decryptedText


    CkJsonObject::ckDispose(json)
    CkPublicKey::ckDispose(pubkey)
    CkJwt::ckDispose(jwt)
    CkJsonObject::ckDispose(jweProtHdr)
    CkJwe::ckDispose(jwe)
    CkPrivateKey::ckDispose(privkey)
    CkJwe::ckDispose(jwe2)


    ProcedureReturn
EndProcedure