@gw2me/client
Version:
gw2.me client library
53 lines (51 loc) • 1.48 kB
JavaScript
import { t as base64urlEncode } from "./base64-B0vm543A.mjs";
//#region src/dpop.ts
function generateDPoPKeyPair() {
return crypto.subtle.generateKey({
name: "ECDSA",
namedCurve: "P-256"
}, false, ["sign"]);
}
async function createDPoPJwt({ htm, htu, nonce, accessToken }, keyPair) {
const header = JSON.stringify({
alg: "ES256",
typ: "dpop+jwt",
jwk: await jwk(keyPair.publicKey)
});
const body = JSON.stringify({
iat: Math.floor(Date.now() / 1e3),
jti: base64urlEncode(crypto.getRandomValues(new Uint8Array(32))),
htm,
htu,
nonce,
ath: accessToken ? base64urlEncode(await crypto.subtle.digest("SHA-256", stringToBuffer(accessToken))) : void 0
});
const input = `${base64urlEncode(stringToBuffer(header))}.${base64urlEncode(stringToBuffer(body))}`;
return `${input}.${base64urlEncode(await crypto.subtle.sign({
name: "ECDSA",
hash: "SHA-256"
}, keyPair.privateKey, stringToBuffer(input)))}`;
}
const encoder = new TextEncoder();
function stringToBuffer(value) {
return encoder.encode(value);
}
async function jwk(key) {
const { kty, e, k, n, x, y, crv } = await crypto.subtle.exportKey("jwk", key);
return {
e,
k,
crv,
kty,
n,
x,
y
};
}
async function jwkThumbprint(key) {
const jwkJson = JSON.stringify(await jwk(key));
return base64urlEncode(await crypto.subtle.digest("SHA-256", stringToBuffer(jwkJson)));
}
//#endregion
export { createDPoPJwt, generateDPoPKeyPair, jwkThumbprint };
//# sourceMappingURL=dpop.mjs.map