UNPKG

@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
"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); // 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 });