213 lines
6.0 KiB
JavaScript
213 lines
6.0 KiB
JavaScript
"use strict";
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var jws_exports = {};
|
|
__export(jws_exports, {
|
|
signing: () => signing,
|
|
verifying: () => verifying
|
|
});
|
|
module.exports = __toCommonJS(jws_exports);
|
|
var import_adapter = require("../../helper/adapter");
|
|
var import_encode = require("../encode");
|
|
var import_types = require("./types");
|
|
var import_types2 = require("./types");
|
|
var import_utf8 = require("./utf8");
|
|
async function signing(privateKey, alg, data) {
|
|
const algorithm = getKeyAlgorithm(alg);
|
|
const cryptoKey = await importPrivateKey(privateKey, algorithm);
|
|
return await crypto.subtle.sign(algorithm, cryptoKey, data);
|
|
}
|
|
async function verifying(publicKey, alg, signature, data) {
|
|
const algorithm = getKeyAlgorithm(alg);
|
|
const cryptoKey = await importPublicKey(publicKey, algorithm);
|
|
return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);
|
|
}
|
|
function pemToBinary(pem) {
|
|
return (0, import_encode.decodeBase64)(pem.replace(/-+(BEGIN|END).*/g, "").replace(/\s/g, ""));
|
|
}
|
|
async function importPrivateKey(key, alg) {
|
|
if (!crypto.subtle || !crypto.subtle.importKey) {
|
|
throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");
|
|
}
|
|
if (isCryptoKey(key)) {
|
|
if (key.type !== "private") {
|
|
throw new Error(`unexpected non private key: CryptoKey.type is ${key.type}`);
|
|
}
|
|
return key;
|
|
}
|
|
const usages = [import_types2.CryptoKeyUsage.Sign];
|
|
if (typeof key === "object") {
|
|
return await crypto.subtle.importKey("jwk", key, alg, false, usages);
|
|
}
|
|
if (key.includes("PRIVATE")) {
|
|
return await crypto.subtle.importKey("pkcs8", pemToBinary(key), alg, false, usages);
|
|
}
|
|
return await crypto.subtle.importKey("raw", import_utf8.utf8Encoder.encode(key), alg, false, usages);
|
|
}
|
|
async function importPublicKey(key, alg) {
|
|
if (!crypto.subtle || !crypto.subtle.importKey) {
|
|
throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");
|
|
}
|
|
if (isCryptoKey(key)) {
|
|
if (key.type === "public" || key.type === "secret") {
|
|
return key;
|
|
}
|
|
key = await exportPublicJwkFrom(key);
|
|
}
|
|
if (typeof key === "string" && key.includes("PRIVATE")) {
|
|
const privateKey = await crypto.subtle.importKey("pkcs8", pemToBinary(key), alg, true, [
|
|
import_types2.CryptoKeyUsage.Sign
|
|
]);
|
|
key = await exportPublicJwkFrom(privateKey);
|
|
}
|
|
const usages = [import_types2.CryptoKeyUsage.Verify];
|
|
if (typeof key === "object") {
|
|
return await crypto.subtle.importKey("jwk", key, alg, false, usages);
|
|
}
|
|
if (key.includes("PUBLIC")) {
|
|
return await crypto.subtle.importKey("spki", pemToBinary(key), alg, false, usages);
|
|
}
|
|
return await crypto.subtle.importKey("raw", import_utf8.utf8Encoder.encode(key), alg, false, usages);
|
|
}
|
|
async function exportPublicJwkFrom(privateKey) {
|
|
if (privateKey.type !== "private") {
|
|
throw new Error(`unexpected key type: ${privateKey.type}`);
|
|
}
|
|
if (!privateKey.extractable) {
|
|
throw new Error("unexpected private key is unextractable");
|
|
}
|
|
const jwk = await crypto.subtle.exportKey("jwk", privateKey);
|
|
const { kty } = jwk;
|
|
const { alg, e, n } = jwk;
|
|
const { crv, x, y } = jwk;
|
|
return { kty, alg, e, n, crv, x, y, key_ops: [import_types2.CryptoKeyUsage.Verify] };
|
|
}
|
|
function getKeyAlgorithm(name) {
|
|
switch (name) {
|
|
case "HS256":
|
|
return {
|
|
name: "HMAC",
|
|
hash: {
|
|
name: "SHA-256"
|
|
}
|
|
};
|
|
case "HS384":
|
|
return {
|
|
name: "HMAC",
|
|
hash: {
|
|
name: "SHA-384"
|
|
}
|
|
};
|
|
case "HS512":
|
|
return {
|
|
name: "HMAC",
|
|
hash: {
|
|
name: "SHA-512"
|
|
}
|
|
};
|
|
case "RS256":
|
|
return {
|
|
name: "RSASSA-PKCS1-v1_5",
|
|
hash: {
|
|
name: "SHA-256"
|
|
}
|
|
};
|
|
case "RS384":
|
|
return {
|
|
name: "RSASSA-PKCS1-v1_5",
|
|
hash: {
|
|
name: "SHA-384"
|
|
}
|
|
};
|
|
case "RS512":
|
|
return {
|
|
name: "RSASSA-PKCS1-v1_5",
|
|
hash: {
|
|
name: "SHA-512"
|
|
}
|
|
};
|
|
case "PS256":
|
|
return {
|
|
name: "RSA-PSS",
|
|
hash: {
|
|
name: "SHA-256"
|
|
},
|
|
saltLength: 32
|
|
};
|
|
case "PS384":
|
|
return {
|
|
name: "RSA-PSS",
|
|
hash: {
|
|
name: "SHA-384"
|
|
},
|
|
saltLength: 48
|
|
};
|
|
case "PS512":
|
|
return {
|
|
name: "RSA-PSS",
|
|
hash: {
|
|
name: "SHA-512"
|
|
},
|
|
saltLength: 64
|
|
};
|
|
case "ES256":
|
|
return {
|
|
name: "ECDSA",
|
|
hash: {
|
|
name: "SHA-256"
|
|
},
|
|
namedCurve: "P-256"
|
|
};
|
|
case "ES384":
|
|
return {
|
|
name: "ECDSA",
|
|
hash: {
|
|
name: "SHA-384"
|
|
},
|
|
namedCurve: "P-384"
|
|
};
|
|
case "ES512":
|
|
return {
|
|
name: "ECDSA",
|
|
hash: {
|
|
name: "SHA-512"
|
|
},
|
|
namedCurve: "P-521"
|
|
};
|
|
case "EdDSA":
|
|
return {
|
|
name: "Ed25519",
|
|
namedCurve: "Ed25519"
|
|
};
|
|
default:
|
|
throw new import_types.JwtAlgorithmNotImplemented(name);
|
|
}
|
|
}
|
|
function isCryptoKey(key) {
|
|
const runtime = (0, import_adapter.getRuntimeKey)();
|
|
if (runtime === "node" && !!crypto.webcrypto) {
|
|
return key instanceof crypto.webcrypto.CryptoKey;
|
|
}
|
|
return key instanceof CryptoKey;
|
|
}
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
signing,
|
|
verifying
|
|
});
|