cose-kit
Version:
**DEPRECATED:** Use [@auth0/cose](https://www.npmjs.com/package/@auth0/cose).
102 lines (101 loc) • 3.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.COSEKey = exports.JWKToCOSEValue = exports.JWKFromCOSEValue = void 0;
const kty_js_1 = require("./kty.js");
const cbor_js_1 = require("../cbor.js");
const curve_js_1 = require("./curve.js");
const typedmap_1 = require("@jfromaniello/typedmap");
const headers_js_1 = require("../headers.js");
const jose_1 = require("jose");
const params_js_1 = require("./params.js");
const key_ops_js_1 = require("./key_ops.js");
const base64_js_1 = require("#runtime/base64.js");
const buffer_js_1 = require("#runtime/buffer.js");
const toArray = (v) => Array.isArray(v) ? v : [v];
exports.JWKFromCOSEValue = new Map([
['kty', (value) => kty_js_1.JWKKeyType[value]],
['crv', (value) => curve_js_1.Curve[value]],
['alg', (value) => headers_js_1.Algorithms[value]],
['kid', (v) => {
if (typeof v === 'string') {
return v;
}
return new TextDecoder().decode(v);
}],
['key_ops', (v) => toArray(v).map((value) => key_ops_js_1.JWKKeyOps.get(value))],
...([
'x',
'y',
'd',
'k',
].map((param) => [param, (v) => (0, base64_js_1.encodeBase64URL)(v)]))
]);
exports.JWKToCOSEValue = new Map([
['kty', (value) => kty_js_1.JWKKeyType[value]],
['crv', (value) => curve_js_1.Curve[value]],
['alg', (value) => headers_js_1.Algorithms[value]],
['kid', (v) => (0, buffer_js_1.toBuffer)(v)],
['key_ops', (v) => toArray(v).map((value) => key_ops_js_1.JWKKeyOpsToCOSE.get(value)).flat()],
...([
'x',
'y',
'd',
'k',
].map((label) => [label, (v) => (0, base64_js_1.decodeBase64URL)(v)]))
]);
class COSEKey extends typedmap_1.TypedMap {
static import(data) {
if (data instanceof Uint8Array) {
const decoded = cbor_js_1.encoder.decode(data);
return new COSEKey(decoded);
}
else {
return new COSEKey(data);
}
}
static fromJWK(jwk) {
var _a;
const coseKey = new COSEKey();
const kty = jwk.kty;
for (const [key, value] of Object.entries(jwk)) {
const jwkKey = ((_a = params_js_1.KTYSpecificJWKParamsRev[kty]) === null || _a === void 0 ? void 0 : _a.get(key)) ||
params_js_1.JWKParam[key];
const formatter = exports.JWKToCOSEValue.get(key);
if (jwkKey && formatter) {
coseKey.set(jwkKey, formatter(value));
}
}
return coseKey;
}
static async generate(alg, options = {}) {
const { privateKey, publicKey } = await (0, jose_1.generateKeyPair)(headers_js_1.Algorithms[alg], {
...options !== null && options !== void 0 ? options : {},
extractable: true
});
return {
privateKey: COSEKey.fromJWK(await (0, jose_1.exportJWK)(privateKey)),
publicKey: COSEKey.fromJWK(await (0, jose_1.exportJWK)(publicKey)),
};
}
toJWK() {
var _a, _b;
const result = {};
const kty = kty_js_1.JWKKeyType[this.get(params_js_1.COSEKeyParam.KeyType)];
for (const [key, value] of this) {
const jwkKey = (_b = (_a = params_js_1.KTYSpecificJWKParams[kty]) === null || _a === void 0 ? void 0 : _a.get(key)) !== null && _b !== void 0 ? _b : params_js_1.JWKParam[key];
const parser = exports.JWKFromCOSEValue.get(jwkKey);
if (parser && jwkKey) {
const parsed = parser(value);
result[jwkKey] = parsed;
}
}
return result;
}
toKeyLike() {
return (0, jose_1.importJWK)(this.toJWK());
}
encode() {
return cbor_js_1.encoder.encode(this.esMap);
}
}
exports.COSEKey = COSEKey;