cose-kit
Version:
This is an early prototype of a RFC8152 COSE library for node.js.
80 lines (79 loc) • 3.25 kB
JavaScript
;
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;