UNPKG

parse-cosekey

Version:

Parse COSE(CBOR Object Signing and Encryption) to JWK(JSON Web Key) or PEM.

106 lines 4.63 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const crypto_1 = __importDefault(require("crypto")); const coseKey_1 = require("./coseKey"); const keyParseError_1 = __importDefault(require("./exception/keyParseError")); const joseKey_1 = require("./joseKey"); const keyParser_1 = __importDefault(require("./keyParser")); /** * Verify data using signature and key(COSE, JWK or PEM). */ class Verifier { constructor() { // private constructor } /** * Verify data using signature and COSE key. * * @param data verification content * @param signature calculated signature for data * @param key public key * @returns Validity of signature * @throws {@link KeyParseError} if COSE key is imperfect */ static verifyWithCOSEKey(data, signature, key) { return __awaiter(this, void 0, void 0, function* () { const cosealg = coseKey_1.COSEAlgorithm.fromValue(key.get(coseKey_1.COSEKeyCommonParameter.ALG.label)); if (cosealg == null) { throw new keyParseError_1.default('Cose map does not have valid alg value.'); } const pem = yield keyParser_1.default.cose2pem(key); return Verifier.verifyWithPEM(data, signature, pem, cosealg.name, cosealg.nodeCryptoHashAlg || 'sha256'); }); } /** * Verify data using signature and JWK. * * @param data verification content * @param signature calculated signature for data * @param key public key * @returns Validity of signature * @throws {@link KeyParseError} if JWK is imperfect */ static verifyWithJWK(data, signature, key) { return __awaiter(this, void 0, void 0, function* () { const rawJwkalg = key[joseKey_1.JSONWebKeyParameter.ALG.name]; if (typeof rawJwkalg !== 'string') { throw new keyParseError_1.default('JWK does not have valid alg value.'); } const jwkalg = joseKey_1.JSONWebSignatureAndEncryptionAlgorithm.fromName(rawJwkalg); if (jwkalg == null) { throw new keyParseError_1.default('JWK does not have valid alg value.'); } const pem = yield keyParser_1.default.jwk2pem(key); return Verifier.verifyWithPEM(data, signature, pem, jwkalg.name, jwkalg.nodeCryptoHashAlg || 'sha256'); }); } /** * Verify data using signature and PEM. * * @param data verification content * @param signature calculated signature for data * @param key public key * @returns Validity of signature */ static verifyWithPEM(data, signature, key, algorithm, hashAlgorithm) { if (algorithm === 'EdDSA') { return crypto_1.default.verify(null, data, key, signature); } let hashAlg = hashAlgorithm; if (hashAlg == null) { const matches = /^(PS|RS|ES|HS|RSA-OAEP-)(1|256|384|512)K?$/.exec(algorithm); if (matches != null) { hashAlg = 'sha' + matches[2]; } else { hashAlg = 'sha256'; } } const verify = crypto_1.default.createVerify(hashAlg); verify.update(data); if (/^PS(256|384|512)$/.test(algorithm)) { return verify.verify({ key, padding: crypto_1.default.constants.RSA_PKCS1_PSS_PADDING, saltLength: crypto_1.default.constants.RSA_PSS_SALTLEN_DIGEST, }, signature); } else { return verify.verify(key, signature); } } } exports.default = Verifier; //# sourceMappingURL=verifier.js.map