Tcl
Tcl
Create JWS using the Flattened JSON Serialization Format
See more JSON Web Signatures (JWS) Examples
Creates a JSON Web Signature (JWS) containing 1 signature and output using the flattened JSON serialization format.Note: This example requires Chilkat v9.5.0.66 or greater.
Chilkat Tcl Downloads
load ./chilkat.dll
set success 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.
# The JWS to be created will contain one signature using an ECDSA key.
set sbEccJwk [new_CkStringBuilder]
CkStringBuilder_Append $sbEccJwk "{\"kty\":\"EC\","
CkStringBuilder_Append $sbEccJwk "\"crv\":\"P-256\","
CkStringBuilder_Append $sbEccJwk "\"x\":\"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\","
CkStringBuilder_Append $sbEccJwk "\"y\":\"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0\","
CkStringBuilder_Append $sbEccJwk "\"d\":\"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI\""
CkStringBuilder_Append $sbEccJwk "}"
set eccKey [new_CkPrivateKey]
# Note: This example loads the ECDSA key from JWK format. Any format can be loaded
# into the private key object. (See the online reference documentation..)
set success [CkPrivateKey_LoadJwk $eccKey [CkStringBuilder_getAsString $sbEccJwk]]
if {$success != 1} then {
puts [CkPrivateKey_lastErrorText $eccKey]
delete_CkStringBuilder $sbEccJwk
delete_CkPrivateKey $eccKey
exit
}
# ---------------------------------------------------
# Prepare both a protected and unprotected header.
set jwsProtHdr [new_CkJsonObject]
CkJsonObject_AppendString $jwsProtHdr "alg" "ES256"
set jwsUnprotHdr [new_CkJsonObject]
CkJsonObject_AppendString $jwsUnprotHdr "kid" "myEcKey"
# ---------------------------------------------------
set jws [new_CkJws]
CkJws_SetProtectedHeader $jws 0 $jwsProtHdr
CkJws_SetUnprotectedHeader $jws 0 $jwsUnprotHdr
CkJws_SetPrivateKey $jws 0 $eccKey
set bIncludeBom 0
set payloadStr "In our village, folks say God crumbles up the old moon into stars."
CkJws_SetPayload $jws $payloadStr "utf-8" $bIncludeBom
# ---------------------------------------------------
# Create the JWS.
# Indicate we prefer the non-compact, flattened serialization.
CkJws_put_PreferCompact $jws 0
CkJws_put_PreferFlattened $jws 1
set jwsStr [CkJws_createJws $jws]
if {[CkJws_get_LastMethodSuccess $jws] != 1} then {
puts [CkJws_lastErrorText $jws]
delete_CkStringBuilder $sbEccJwk
delete_CkPrivateKey $eccKey
delete_CkJsonObject $jwsProtHdr
delete_CkJsonObject $jwsUnprotHdr
delete_CkJws $jws
exit
}
# The jwsStr is contains the flattened JSON in the smallest possible size, which is a single line.
# To get in human-readable format, load into a Chilkat JSON object and emit..
set json [new_CkJsonObject]
CkJsonObject_Load $json $jwsStr
CkJsonObject_put_EmitCompact $json 0
puts [CkJsonObject_emit $json]
# Sample output:
# {
# "payload": "SW4gb3VyIHZpbGxhZ2UsIGZvbGtzIHNheSBHb2QgY3J1bWJsZXMgdXAgdGhlIG9sZCBtb29uIGludG8gc3RhcnMu",
# "protected": "eyJhbGciOiJFUzI1NiJ9",
# "header": {
# "kid": "myEcKey"
# },
# "signature": "b7V2UpDPytr-kMnM_YjiQ3E0J2ucOI9LYA7mt57vccrK1rb84j9areqgQcJwOA00aWGoz4hf6sMTBfobdcJEGg"
# }
delete_CkStringBuilder $sbEccJwk
delete_CkPrivateKey $eccKey
delete_CkJsonObject $jwsProtHdr
delete_CkJsonObject $jwsUnprotHdr
delete_CkJws $jws
delete_CkJsonObject $json