Lua Requires Chilkat v11.0.0+
Lua
Validate a JWS Using ECDSA P-256 SHA-256
See more JSON Web Signatures (JWS) Examples
Validates a JSON Web Signature (JWS) that uses ECDSA P-256 SHA-256Chilkat Lua Downloads
local chilkat = require("chilkat")
-- 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-256",
-- "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
-- "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
-- }
local sbPubKey = chilkat.StringBuilder.new()
sbPubKey:append("{\"kty\":\"EC\",")
sbPubKey:append("\"crv\":\"P-256\",")
sbPubKey:append("\"x\":\"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\",")
sbPubKey:append("\"y\":\"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0\"")
sbPubKey:append("}")
local pubKey = chilkat.PublicKey.new()
local success = pubKey:load_from_string(sbPubKey:get_as_string())
if not success then
print(pubKey.last_error_text)
return
end
local jws = chilkat.Jws.new()
-- Set the ECC public key:
local signatureIndex = 0
jws:set_public_key(signatureIndex, pubKey)
-- Load the JWS.
local sbJws = chilkat.StringBuilder.new()
sbJws:append("eyJhbGciOiJFUzI1NiJ9")
sbJws:append(".")
sbJws:append("eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt")
sbJws:append("cGxlLmNvbS9pc19yb290Ijp0cnVlfQ")
sbJws:append(".")
sbJws:append("DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSA")
sbJws:append("pmWQxfKTUJqPP3-Kg6NU1Q")
success = jws:load_jws_sb(sbJws)
if not success then
print(jws.last_error_text)
return
end
-- Validate the 1st (and only) signature at index 0..
local v = jws:validate(signatureIndex)
if v < 0 then
-- Perhaps Chilkat was not unlocked or the trial expired..
print("Method call failed for some other reason.")
print(jws.last_error_text)
return
end
if v == 0 then
print("Invalid signature. The ECC key was incorrect, the JWS was invalid, or both.")
return
end
-- If we get here, the signature was validated..
print("Signature validated.")
print("--")
-- Recover the original content:
print("Recovered content:")
print(jws:get_payload("utf-8"))
print("--")
-- Examine the protected header:
local joseHeader = chilkat.JsonObject.new()
success = jws:get_protected_h(signatureIndex, joseHeader)
if not success then
print(jws.last_error_text)
return
end
joseHeader.emit_compact = false
print("Protected (JOSE) header:")
print(joseHeader:emit())
-- Output:
-- Signature validated.
-- --
-- Recovered content:
-- {"iss":"joe",
-- "exp":1300819380,
-- "http://example.com/is_root":true}
-- --
-- Protected (JOSE) header:
-- {
-- "alg": "ES256"
-- }