@gaonengwww/jose
Version:
JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes
169 lines (159 loc) • 4.89 kB
JavaScript
;
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);
// src/key/export.ts
var export_exports = {};
__export(export_exports, {
exportJWK: () => exportJWK,
exportPKCS8: () => exportPKCS8,
exportSPKI: () => exportSPKI
});
module.exports = __toCommonJS(export_exports);
// src/lib/invalid_key_input.ts
function message(msg, actual, ...types) {
types = types.filter(Boolean);
if (types.length > 2) {
const last = types.pop();
msg += `one of type ${types.join(", ")}, or ${last}.`;
} else if (types.length === 2) {
msg += `one of type ${types[0]} or ${types[1]}.`;
} else {
msg += `of type ${types[0]}.`;
}
if (actual == null) {
msg += ` Received ${actual}`;
} else if (typeof actual === "function" && actual.name) {
msg += ` Received function ${actual.name}`;
} else if (typeof actual === "object" && actual != null) {
if (actual.constructor?.name) {
msg += ` Received an instance of ${actual.constructor.name}`;
}
}
return msg;
}
var invalid_key_input_default = (actual, ...types) => {
return message("Key must be ", actual, ...types);
};
// src/lib/base64.ts
function encodeBase64(input) {
if (Uint8Array.prototype.toBase64) {
return input.toBase64();
}
const CHUNK_SIZE = 32768;
const arr = [];
for (let i = 0; i < input.length; i += CHUNK_SIZE) {
arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));
}
return btoa(arr.join(""));
}
// src/lib/is_key_like.ts
function isCryptoKey(key) {
return key?.[Symbol.toStringTag] === "CryptoKey";
}
function isKeyObject(key) {
return key?.[Symbol.toStringTag] === "KeyObject";
}
// src/lib/asn1.ts
var formatPEM = (b64, descriptor) => {
const newlined = (b64.match(/.{1,64}/g) || []).join("\n");
return `-----BEGIN ${descriptor}-----
${newlined}
-----END ${descriptor}-----`;
};
var genericExport = async (keyType, keyFormat, key) => {
if (isKeyObject(key)) {
if (key.type !== keyType) {
throw new TypeError(`key is not a ${keyType} key`);
}
return key.export({ format: "pem", type: keyFormat });
}
if (!isCryptoKey(key)) {
throw new TypeError(invalid_key_input_default(key, "CryptoKey", "KeyObject"));
}
if (!key.extractable) {
throw new TypeError("CryptoKey is not extractable");
}
if (key.type !== keyType) {
throw new TypeError(`key is not a ${keyType} key`);
}
return formatPEM(
encodeBase64(new Uint8Array(await crypto.subtle.exportKey(keyFormat, key))),
`${keyType.toUpperCase()} KEY`
);
};
var toSPKI = (key) => {
return genericExport("public", "spki", key);
};
var toPKCS8 = (key) => {
return genericExport("private", "pkcs8", key);
};
// src/lib/buffer_utils.ts
var encoder = new TextEncoder();
var decoder = new TextDecoder();
var MAX_INT32 = 2 ** 32;
// src/util/base64url.ts
function encode(input) {
let unencoded = input;
if (typeof unencoded === "string") {
unencoded = encoder.encode(unencoded);
}
if (Uint8Array.prototype.toBase64) {
return unencoded.toBase64({ alphabet: "base64url", omitPadding: true });
}
return encodeBase64(unencoded).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
}
// src/lib/key_to_jwk.ts
async function keyToJWK(key) {
if (isKeyObject(key)) {
if (key.type === "secret") {
key = key.export();
} else {
return key.export({ format: "jwk" });
}
}
if (key instanceof Uint8Array) {
return {
kty: "oct",
k: encode(key)
};
}
if (!isCryptoKey(key)) {
throw new TypeError(invalid_key_input_default(key, "CryptoKey", "KeyObject", "Uint8Array"));
}
if (!key.extractable) {
throw new TypeError("non-extractable CryptoKey cannot be exported as a JWK");
}
const { ext, key_ops, alg, use, ...jwk } = await crypto.subtle.exportKey("jwk", key);
return jwk;
}
// src/key/export.ts
async function exportSPKI(key) {
return toSPKI(key);
}
async function exportPKCS8(key) {
return toPKCS8(key);
}
async function exportJWK(key) {
return keyToJWK(key);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
exportJWK,
exportPKCS8,
exportSPKI
});