Sample code for 30+ languages & platforms
DataFlex

Validate a JWS Using ECDSA P-521 SHA-512

See more JSON Web Signatures (JWS) Examples

Validates a JSON Web Signature (JWS) that uses ECDSA P-521 SHA-512

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoSbPubKey
    Variant vPubKey
    Handle hoPubKey
    Handle hoJws
    Integer iSignatureIndex
    Variant vSbJws
    Handle hoSbJws
    Integer v
    Variant vJoseHeader
    Handle hoJoseHeader
    String sTemp1

    Move False To iSuccess

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

    // This example takes a JSON signature in compact serialization format,
    // and uses an ECDSA public key to validate and recover the protected header and payload.

    // We only need a public key for signature validation.  This is the ECDSA public key
    // that is used:

    //      {"kty":"EC", 
    //       "crv":"P-521", 
    //       "x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk", 
    //       "y":"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2" 
    //      } 

    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbPubKey
    If (Not(IsComObjectCreated(hoSbPubKey))) Begin
        Send CreateComObject of hoSbPubKey
    End
    Get ComAppend Of hoSbPubKey '{"kty":"EC",' To iSuccess
    Get ComAppend Of hoSbPubKey '"crv":"P-521",' To iSuccess
    Get ComAppend Of hoSbPubKey '"x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk",' To iSuccess
    Get ComAppend Of hoSbPubKey '"y":"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2"' To iSuccess
    Get ComAppend Of hoSbPubKey "}" To iSuccess

    Get Create (RefClass(cComChilkatPublicKey)) To hoPubKey
    If (Not(IsComObjectCreated(hoPubKey))) Begin
        Send CreateComObject of hoPubKey
    End
    Get ComGetAsString Of hoSbPubKey To sTemp1
    Get ComLoadFromString Of hoPubKey sTemp1 To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPubKey To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatJws)) To hoJws
    If (Not(IsComObjectCreated(hoJws))) Begin
        Send CreateComObject of hoJws
    End

    // Set the ECC public key:
    Move 0 To iSignatureIndex
    Get pvComObject of hoPubKey to vPubKey
    Get ComSetPublicKey Of hoJws iSignatureIndex vPubKey To iSuccess

    // Load the JWS.
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbJws
    If (Not(IsComObjectCreated(hoSbJws))) Begin
        Send CreateComObject of hoSbJws
    End
    Get ComAppend Of hoSbJws "eyJhbGciOiJFUzUxMiJ9" To iSuccess
    Get ComAppend Of hoSbJws "." To iSuccess
    Get ComAppend Of hoSbJws "UGF5bG9hZA" To iSuccess
    Get ComAppend Of hoSbJws "." To iSuccess
    Get ComAppend Of hoSbJws "AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZq" To iSuccess
    Get ComAppend Of hoSbJws "wqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8Kp" To iSuccess
    Get ComAppend Of hoSbJws "EHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn" To iSuccess

    Get pvComObject of hoSbJws to vSbJws
    Get ComLoadJwsSb Of hoJws vSbJws To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoJws To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // Validate the 1st (and only) signature at index 0..
    Get ComValidate Of hoJws iSignatureIndex To v
    If (v < 0) Begin
        // Perhaps Chilkat was not unlocked or the trial expired..
        Showln "Method call failed for some other reason."
        Get ComLastErrorText Of hoJws To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    If (v = 0) Begin
        Showln "Invalid signature.  The ECC key was incorrect, the JWS was invalid, or both."
        Procedure_Return
    End

    // If we get here, the signature was validated..
    Showln "Signature validated."
    Showln "--"

    // Recover the original content:
    Showln "Recovered content:"
    Get ComGetPayload Of hoJws "utf-8" To sTemp1
    Showln sTemp1
    Showln "--"

    // Examine the protected header:

    Get Create (RefClass(cComChilkatJsonObject)) To hoJoseHeader
    If (Not(IsComObjectCreated(hoJoseHeader))) Begin
        Send CreateComObject of hoJoseHeader
    End
    Get pvComObject of hoJoseHeader to vJoseHeader
    Get ComGetProtectedH Of hoJws iSignatureIndex vJoseHeader To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoJws To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Set ComEmitCompact Of hoJoseHeader To False

    Showln "Protected (JOSE) header:"
    Get ComEmit Of hoJoseHeader To sTemp1
    Showln sTemp1

    // Output:
    // (the string "Payload" was the content that was signed.)

    // 	Signature validated.
    // 	--
    // 	Recovered content:
    // 	Payload
    // 	--
    // 	Protected (JOSE) header:
    // 	{
    // 	  "alg": "ES512"
    // 	}


End_Procedure