Sample code for 30+ languages & platforms
Lua Requires Chilkat v11.0.0+

Validate JWS Using RSASSA-PKCS1-v1_5 SHA-256

See more JSON Web Signatures (JWS) Examples

Validates a JSON Web Signature (JWS) that uses RSASSA-PKCS1-v1_5 SHA-256.

Chilkat Lua Downloads

Lua
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 RSA public key to validate and recover the protected header and payload.

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

--      {"kty":"RSA",
--       "n":"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx
--            HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs
--            D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH
--            SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV
--            MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8
--            NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ",
--       "e":"AQAB"
--      }

local sbPubKey = chilkat.StringBuilder.new()
sbPubKey:append("{\"kty\":\"RSA\",")
sbPubKey:append("\"n\":\"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddx")
sbPubKey:append("HmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMs")
sbPubKey:append("D1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSH")
sbPubKey:append("SXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdV")
sbPubKey:append("MTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8")
sbPubKey:append("NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ\",")
sbPubKey:append("\"e\":\"AQAB\"")
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 RSA public key:
local signatureIndex = 0
jws:set_public_key(signatureIndex, pubKey)

-- Load the JWS.
local sbJws = chilkat.StringBuilder.new()
sbJws:append("eyJhbGciOiJSUzI1NiJ9")
sbJws:append(".")
sbJws:append("eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt")
sbJws:append("cGxlLmNvbS9pc19yb290Ijp0cnVlfQ")
sbJws:append(".")
sbJws:append("cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7")
sbJws:append("AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4")
sbJws:append("BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K")
sbJws:append("0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqv")
sbJws:append("hJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrB")
sbJws:append("p0igcN_IoypGlUPQGe77Rw")

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 RSA 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": "RS256"
--     }