Stefan Oltmann
08/31/2025, 10:23 AMkotlin-wrappers
project has already wrappers for that, but I lack sample code how to use it. I find it hard to use it without docs & samples.
This is the original JavaScript I want to translate:
async function verifyJwt(token, publicKeyBase64Der) {
const parts = token.split('.');
if (parts.length !== 3)
throw new Error("JWT malformed");
const [headerBase64, payloadBase64, signatureBase64] = parts;
const signature = base64urlToUint8Array(signatureBase64);
const data = new TextEncoder().encode(headerBase64 + '.' + payloadBase64);
const headerJson = JSON.parse(utf8Decode(base64urlToUint8Array(headerBase64)));
if (headerJson.alg !== "ES256")
throw new Error("Unsupported Algorithm: " + headerJson.alg);
const keyData = base64ToUint8Array(publicKeyBase64Der);
const cryptoKey = await crypto.subtle.importKey(
"spki",
keyData,
{
name: "ECDSA",
namedCurve: "P-256",
},
false,
["verify"]
);
const verified = await crypto.subtle.verify(
{name: "ECDSA", hash: "SHA-256"},
cryptoKey,
signature,
data
);
if (!verified)
throw new Error("Invalid signature");
return JSON.parse(utf8Decode(base64urlToUint8Array(payloadBase64)));
}
andylamax
08/31/2025, 10:31 AMStefan Oltmann
08/31/2025, 10:32 AMStefan Oltmann
08/31/2025, 10:34 AMimportPemKey()
methods, because it can't say Sorry, I have no idea how to use the kolin-wrappersStefan Oltmann
08/31/2025, 10:39 AMStefan Oltmann
08/31/2025, 10:40 AMStefan Oltmann
08/31/2025, 10:47 AMStefan Oltmann
08/31/2025, 10:55 AMval binaryString = atob(JWT_PUBLIC_KEY)
val bytes = Uint8Array(binaryString.length)
for (index in 0 .. bytes.length)
bytes.set(index, binaryString.get(index).code.toByte())
crypto.subtle.importKey(
format = KeyFormat.spki,
keyData = bytes,
algorithm = EcKeyImportParams(
name = "ECDSA",
namedCurve = "P-256"
),
extractable = false,
keyUsages = arrayOf("verify")
)
Stefan Oltmann
08/31/2025, 11:35 AMStefan Oltmann
08/31/2025, 11:44 AMcom.appstractive:jwt-kt-js:1.2.1
now. That works.
I leave the sample issue open - it's needed.