parse-cosekey
Version:
Parse COSE(CBOR Object Signing and Encryption) to JWK(JSON Web Key) or PEM.
106 lines • 4.63 kB
JavaScript
;
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