Sample code for 30+ languages & platforms
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

Tcl

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