UNPKG

cose-kit

Version:

This is an early prototype of a RFC8152 COSE library for node.js.

80 lines (79 loc) 3.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.COSEKeyFromJWK = exports.importCOSEKey = exports.COSEKeyToJWK = void 0; const kty_js_1 = require("./kty.js"); const labels_js_1 = require("./labels.js"); const cbor_js_1 = require("../cbor.js"); const jose_1 = require("jose"); const crv_js_1 = require("./crv.js"); const key_ops_js_1 = require("./key_ops.js"); const base64_js_1 = require("#runtime/base64.js"); const alg_js_1 = require("./alg.js"); const toArray = (v) => Array.isArray(v) ? v : [v]; const parameterParsers = new Map([ ['kty', (value) => kty_js_1.KEY_TYPE.get(value)], ['crv', (value) => crv_js_1.CURVE.get(value)], ['alg', (value) => alg_js_1.ALG.get(value)], ['crit', (value) => { const values = Array.isArray(value) ? value : [value]; return values.map(v => labels_js_1.LABEL.get(v)); }], ['kid', (v) => v], ['key_ops', (v) => toArray(v).map((value) => key_ops_js_1.KEY_OPS.get(value))], ...(labels_js_1.BufferTypes.map((label) => [label, (v) => (0, base64_js_1.encodeBase64URL)(v)])) ]); function decodedCOSEKeyToJWK(decoded) { var _a; const result = {}; const kty = kty_js_1.KEY_TYPE.get(decoded.get(labels_js_1.COSE_LABEL.get('kty'))); for (const [key, value] of decoded) { const jwkKey = labels_js_1.LABEL.get(key) || (kty && ((_a = labels_js_1.KEY_TYPE_LABELS[kty]) === null || _a === void 0 ? void 0 : _a.get(key))); const parser = jwkKey && parameterParsers.get(jwkKey); if (parser && jwkKey) { result[jwkKey] = parser(value); } } return result; } function COSEKeyToJWK(coseKey) { let decoded; if (coseKey instanceof Uint8Array) { decoded = cbor_js_1.encoder.decode(coseKey); } else { decoded = coseKey; } const result = decodedCOSEKeyToJWK(decoded); return result; } exports.COSEKeyToJWK = COSEKeyToJWK; async function importCOSEKey(coseKey) { const jwk = coseKey instanceof Uint8Array ? COSEKeyToJWK(coseKey) : decodedCOSEKeyToJWK(coseKey); return (0, jose_1.importJWK)(jwk); } exports.importCOSEKey = importCOSEKey; const parameterFormatter = new Map([ ['kty', (value) => kty_js_1.COSE_KEY_TYPE.get(value)], ['crv', (value) => crv_js_1.COSE_CURVE.get(value)], ['alg', (value) => alg_js_1.COSE_ALG.get(value)], ['crit', (value) => toArray(value).map(v => labels_js_1.COSE_LABEL.get(v))], ['kid', (v) => v], ['key_ops', (v) => toArray(v).map((value) => key_ops_js_1.COSE_KEY_OPS.get(value))], ...(labels_js_1.BufferTypes.map((label) => [label, (v) => (0, base64_js_1.decodeBase64URL)(v)])) ]); function COSEKeyFromJWK(jwk) { var _a; const coseKey = new Map(); const { kty } = jwk; for (const [key, value] of Object.entries(jwk)) { const coseKeyLabel = labels_js_1.COSE_LABEL.get(key) || ((_a = labels_js_1.COSE_KEY_TYPE_LABELS[kty]) === null || _a === void 0 ? void 0 : _a.get(key)); const formatter = parameterFormatter.get(key); if (coseKeyLabel && formatter) { coseKey.set(coseKeyLabel, formatter(value)); } } return cbor_js_1.encoder.encode(coseKey); } exports.COSEKeyFromJWK = COSEKeyFromJWK;