tink-crypto
Version:
A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.
100 lines • 11.1 kB
JavaScript
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
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());
});
};
import { SecurityException } from '../exception/security_exception';
import { CryptoFormat } from '../internal/crypto_format';
import { PbKeyStatusType } from '../internal/proto';
import * as Validators from '../subtle/validators';
import { PublicKeyVerify } from './internal/public_key_verify';
/**
* @final
*/
class WrappedPublicKeyVerify extends PublicKeyVerify {
// The constructor should be @private, but it is not supported by Closure
// (see https://github.com/google/closure-compiler/issues/2761).
constructor(primitiveSet) {
super();
this.primitiveSet = primitiveSet;
}
static newPublicKeyVerify(primitiveSet) {
if (!primitiveSet) {
throw new SecurityException('Primitive set has to be non-null.');
}
return new WrappedPublicKeyVerify(primitiveSet);
}
verify(signature, data) {
return __awaiter(this, void 0, void 0, function* () {
Validators.requireUint8Array(signature);
Validators.requireUint8Array(data);
if (signature.length > CryptoFormat.NON_RAW_PREFIX_SIZE) {
const keyId = signature.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE);
const primitives = yield this.primitiveSet.getPrimitives(keyId);
const rawSignature = signature.subarray(CryptoFormat.NON_RAW_PREFIX_SIZE, signature.length);
let isValid = false;
try {
isValid = yield this.tryVerification(primitives, rawSignature, data);
}
catch (e) {
// Ignored.
}
if (isValid) {
return isValid;
}
}
const primitives = yield this.primitiveSet.getRawPrimitives();
return this.tryVerification(primitives, signature, data);
});
}
/**
* Tries to verify the signature using each entry in primitives. It
* returns false if no entry succeeds.
*
*
*/
tryVerification(primitives, signature, data) {
return __awaiter(this, void 0, void 0, function* () {
const primitivesLength = primitives.length;
for (let i = 0; i < primitivesLength; i++) {
if (primitives[i].getKeyStatus() != PbKeyStatusType.ENABLED) {
continue;
}
const primitive = primitives[i].getPrimitive();
let isValid;
try {
isValid = yield primitive.verify(signature, data);
}
catch (e) {
continue;
}
if (isValid) {
return isValid;
}
}
return false;
});
}
}
export class PublicKeyVerifyWrapper {
/**
*/
wrap(primitiveSet) {
return WrappedPublicKeyVerify.newPublicKeyVerify(primitiveSet);
}
/**
*/
getPrimitiveType() {
return PublicKeyVerify;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2tleV92ZXJpZnlfd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NpZ25hdHVyZS9wdWJsaWNfa2V5X3ZlcmlmeV93cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTdEOztHQUVHO0FBQ0gsTUFBTSxzQkFBdUIsU0FBUSxlQUFlO0lBQ2xELHlFQUF5RTtJQUN6RSxnRUFBZ0U7SUFDaEUsWUFBNkIsWUFDNkI7UUFDeEQsS0FBSyxFQUFFLENBQUM7UUFGbUIsaUJBQVksR0FBWixZQUFZLENBQ2lCO0lBRTFELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsWUFDOEM7UUFFdEUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksaUJBQWlCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUssTUFBTSxDQUFDLFNBQXFCLEVBQUUsSUFBZ0I7O1lBQ2xELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDdkQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQ25DLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztnQkFDN0IsSUFBSTtvQkFDRixPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3RFO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLFdBQVc7aUJBQ1o7Z0JBRUQsSUFBSSxPQUFPLEVBQUU7b0JBQ1gsT0FBTyxPQUFPLENBQUM7aUJBQ2hCO2FBQ0Y7WUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxDQUFDO0tBQUE7SUFFRDs7Ozs7T0FLRztJQUNXLGVBQWUsQ0FDekIsVUFBc0QsRUFDdEQsU0FBcUIsRUFBRSxJQUFnQjs7WUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtvQkFDM0QsU0FBUztpQkFDVjtnQkFDRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQy9DLElBQUksT0FBZ0IsQ0FBQztnQkFDckIsSUFBSTtvQkFDRixPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkQ7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsU0FBUztpQkFDVjtnQkFDRCxJQUFJLE9BQU8sRUFBRTtvQkFDWCxPQUFPLE9BQU8sQ0FBQztpQkFDaEI7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUFBO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDO09BQ0c7SUFDSCxJQUFJLENBQUMsWUFBd0Q7UUFDM0QsT0FBTyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7T0FDRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHtTZWN1cml0eUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhjZXB0aW9uL3NlY3VyaXR5X2V4Y2VwdGlvbic7XG5pbXBvcnQge0NyeXB0b0Zvcm1hdH0gZnJvbSAnLi4vaW50ZXJuYWwvY3J5cHRvX2Zvcm1hdCc7XG5pbXBvcnQgKiBhcyBQcmltaXRpdmVTZXQgZnJvbSAnLi4vaW50ZXJuYWwvcHJpbWl0aXZlX3NldCc7XG5pbXBvcnQge1ByaW1pdGl2ZVdyYXBwZXJ9IGZyb20gJy4uL2ludGVybmFsL3ByaW1pdGl2ZV93cmFwcGVyJztcbmltcG9ydCB7UGJLZXlTdGF0dXNUeXBlfSBmcm9tICcuLi9pbnRlcm5hbC9wcm90byc7XG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzIGZyb20gJy4uL3N1YnRsZS92YWxpZGF0b3JzJztcblxuaW1wb3J0IHtQdWJsaWNLZXlWZXJpZnl9IGZyb20gJy4vaW50ZXJuYWwvcHVibGljX2tleV92ZXJpZnknO1xuXG4vKipcbiAqIEBmaW5hbFxuICovXG5jbGFzcyBXcmFwcGVkUHVibGljS2V5VmVyaWZ5IGV4dGVuZHMgUHVibGljS2V5VmVyaWZ5IHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBAcHJpdmF0ZSwgYnV0IGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ2xvc3VyZVxuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMjc2MSkuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlU2V0OlxuICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlU2V0LlByaW1pdGl2ZVNldDxQdWJsaWNLZXlWZXJpZnk+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHN0YXRpYyBuZXdQdWJsaWNLZXlWZXJpZnkocHJpbWl0aXZlU2V0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVTZXQuUHJpbWl0aXZlU2V0PFB1YmxpY0tleVZlcmlmeT4pOlxuICAgICAgUHVibGljS2V5VmVyaWZ5IHtcbiAgICBpZiAoIXByaW1pdGl2ZVNldCkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdQcmltaXRpdmUgc2V0IGhhcyB0byBiZSBub24tbnVsbC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXcmFwcGVkUHVibGljS2V5VmVyaWZ5KHByaW1pdGl2ZVNldCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnkoc2lnbmF0dXJlOiBVaW50OEFycmF5LCBkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlVWludDhBcnJheShzaWduYXR1cmUpO1xuICAgIFZhbGlkYXRvcnMucmVxdWlyZVVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggPiBDcnlwdG9Gb3JtYXQuTk9OX1JBV19QUkVGSVhfU0laRSkge1xuICAgICAgY29uc3Qga2V5SWQgPSBzaWduYXR1cmUuc3ViYXJyYXkoMCwgQ3J5cHRvRm9ybWF0Lk5PTl9SQVdfUFJFRklYX1NJWkUpO1xuICAgICAgY29uc3QgcHJpbWl0aXZlcyA9IGF3YWl0IHRoaXMucHJpbWl0aXZlU2V0LmdldFByaW1pdGl2ZXMoa2V5SWQpO1xuICAgICAgY29uc3QgcmF3U2lnbmF0dXJlID0gc2lnbmF0dXJlLnN1YmFycmF5KFxuICAgICAgICAgIENyeXB0b0Zvcm1hdC5OT05fUkFXX1BSRUZJWF9TSVpFLCBzaWduYXR1cmUubGVuZ3RoKTtcbiAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBpc1ZhbGlkID0gYXdhaXQgdGhpcy50cnlWZXJpZmljYXRpb24ocHJpbWl0aXZlcywgcmF3U2lnbmF0dXJlLCBkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlZC5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByaW1pdGl2ZXMgPSBhd2FpdCB0aGlzLnByaW1pdGl2ZVNldC5nZXRSYXdQcmltaXRpdmVzKCk7XG4gICAgcmV0dXJuIHRoaXMudHJ5VmVyaWZpY2F0aW9uKHByaW1pdGl2ZXMsIHNpZ25hdHVyZSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgdXNpbmcgZWFjaCBlbnRyeSBpbiBwcmltaXRpdmVzLiBJdFxuICAgKiByZXR1cm5zIGZhbHNlIGlmIG5vIGVudHJ5IHN1Y2NlZWRzLlxuICAgKlxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlWZXJpZmljYXRpb24oXG4gICAgICBwcmltaXRpdmVzOiBBcnJheTxQcmltaXRpdmVTZXQuRW50cnk8UHVibGljS2V5VmVyaWZ5Pj4sXG4gICAgICBzaWduYXR1cmU6IFVpbnQ4QXJyYXksIGRhdGE6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwcmltaXRpdmVzTGVuZ3RoID0gcHJpbWl0aXZlcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltaXRpdmVzTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcmltaXRpdmVzW2ldLmdldEtleVN0YXR1cygpICE9IFBiS2V5U3RhdHVzVHlwZS5FTkFCTEVEKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJpbWl0aXZlID0gcHJpbWl0aXZlc1tpXS5nZXRQcmltaXRpdmUoKTtcbiAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaXNWYWxpZCA9IGF3YWl0IHByaW1pdGl2ZS52ZXJpZnkoc2lnbmF0dXJlLCBkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdWJsaWNLZXlWZXJpZnlXcmFwcGVyIGltcGxlbWVudHNcbiAgICBQcmltaXRpdmVXcmFwcGVyPFB1YmxpY0tleVZlcmlmeT4ge1xuICAvKipcbiAgICovXG4gIHdyYXAocHJpbWl0aXZlU2V0OiBQcmltaXRpdmVTZXQuUHJpbWl0aXZlU2V0PFB1YmxpY0tleVZlcmlmeT4pIHtcbiAgICByZXR1cm4gV3JhcHBlZFB1YmxpY0tleVZlcmlmeS5uZXdQdWJsaWNLZXlWZXJpZnkocHJpbWl0aXZlU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgZ2V0UHJpbWl0aXZlVHlwZSgpIHtcbiAgICByZXR1cm4gUHVibGljS2V5VmVyaWZ5O1xuICB9XG59XG4iXX0=