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.
73 lines • 8.29 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 { PublicKeyVerify } from '../signature/internal/public_key_verify';
import * as EllipticCurves from './elliptic_curves';
import * as Validators from './validators';
/**
* Implementation of ECDSA verifying.
*
* @final
*/
export class EcdsaVerify extends PublicKeyVerify {
/**
* @param encoding The
* encoding of the signature.
*/
constructor(key, hash, encoding) {
super();
this.key = key;
this.hash = hash;
this.encoding = encoding;
const { namedCurve } = key.algorithm;
if (!namedCurve) {
throw new SecurityException('Curve has to be defined.');
}
this.ieeeSignatureLength = 2 *
EllipticCurves.fieldSizeInBytes(EllipticCurves.curveFromString(namedCurve));
}
/**
*/
verify(signature, message) {
return __awaiter(this, void 0, void 0, function* () {
Validators.requireUint8Array(signature);
Validators.requireUint8Array(message);
if (this.encoding === EllipticCurves.EcdsaSignatureEncodingType.DER) {
signature =
EllipticCurves.ecdsaDer2Ieee(signature, this.ieeeSignatureLength);
}
return window.crypto.subtle.verify({ name: 'ECDSA', hash: { name: this.hash } }, this.key, signature, message);
});
}
}
/**
* @param opt_encoding The
* optional encoding of the signature. If absent, default is IEEE P1363.
*/
export function fromJsonWebKey(jwk, hash, encoding = EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363) {
return __awaiter(this, void 0, void 0, function* () {
if (!jwk) {
throw new SecurityException('public key has to be non-null');
}
const { crv } = jwk;
if (!crv) {
throw new SecurityException('curve has to be defined');
}
Validators.validateEcdsaParams(crv, hash);
const cryptoKey = yield EllipticCurves.importPublicKey('ECDSA', jwk);
return new EcdsaVerify(cryptoKey, hash, encoding);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FfdmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3VidGxlL2VjZHNhX3ZlcmlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHOzs7Ozs7Ozs7O0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBRXhFLE9BQU8sS0FBSyxjQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsZUFBZTtJQUc5Qzs7O09BR0c7SUFDSCxZQUNxQixHQUFjLEVBQW1CLElBQVksRUFDN0MsUUFBbUQ7UUFDdEUsS0FBSyxFQUFFLENBQUM7UUFGVyxRQUFHLEdBQUgsR0FBRyxDQUFXO1FBQW1CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDN0MsYUFBUSxHQUFSLFFBQVEsQ0FBMkM7UUFFdEUsTUFBTSxFQUFDLFVBQVUsRUFBQyxHQUE0QixHQUFHLENBQUMsU0FBUyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixNQUFNLElBQUksaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDO1lBQ3hCLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FDM0IsY0FBYyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDtPQUNHO0lBQ0csTUFBTSxDQUFDLFNBQXFCLEVBQUUsT0FBbUI7O1lBQ3JELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25FLFNBQVM7b0JBQ0wsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDdkU7WUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDOUIsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RSxDQUFDO0tBQUE7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBZ0IsY0FBYyxDQUNoQyxHQUFlLEVBQUUsSUFBWSxFQUM3QixXQUNJLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVOztRQUUxRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDOUQ7UUFDRCxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLElBQUksaUJBQWlCLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUN4RDtRQUNELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQge1NlY3VyaXR5RXhjZXB0aW9ufSBmcm9tICcuLi9leGNlcHRpb24vc2VjdXJpdHlfZXhjZXB0aW9uJztcbmltcG9ydCB7UHVibGljS2V5VmVyaWZ5fSBmcm9tICcuLi9zaWduYXR1cmUvaW50ZXJuYWwvcHVibGljX2tleV92ZXJpZnknO1xuXG5pbXBvcnQgKiBhcyBFbGxpcHRpY0N1cnZlcyBmcm9tICcuL2VsbGlwdGljX2N1cnZlcyc7XG5pbXBvcnQgKiBhcyBWYWxpZGF0b3JzIGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgRUNEU0EgdmVyaWZ5aW5nLlxuICpcbiAqIEBmaW5hbFxuICovXG5leHBvcnQgY2xhc3MgRWNkc2FWZXJpZnkgZXh0ZW5kcyBQdWJsaWNLZXlWZXJpZnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGllZWVTaWduYXR1cmVMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGVuY29kaW5nIFRoZVxuICAgKiAgICAgZW5jb2Rpbmcgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBrZXk6IENyeXB0b0tleSwgcHJpdmF0ZSByZWFkb25seSBoYXNoOiBzdHJpbmcsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGVuY29kaW5nOiBFbGxpcHRpY0N1cnZlcy5FY2RzYVNpZ25hdHVyZUVuY29kaW5nVHlwZSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge25hbWVkQ3VydmV9OiBQYXJ0aWFsPEVjS2V5QWxnb3JpdGhtPiA9IGtleS5hbGdvcml0aG07XG4gICAgaWYgKCFuYW1lZEN1cnZlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0N1cnZlIGhhcyB0byBiZSBkZWZpbmVkLicpO1xuICAgIH1cbiAgICB0aGlzLmllZWVTaWduYXR1cmVMZW5ndGggPSAyICpcbiAgICAgICAgRWxsaXB0aWNDdXJ2ZXMuZmllbGRTaXplSW5CeXRlcyhcbiAgICAgICAgICAgIEVsbGlwdGljQ3VydmVzLmN1cnZlRnJvbVN0cmluZyhuYW1lZEN1cnZlKSk7XG4gIH1cblxuICAvKipcbiAgICovXG4gIGFzeW5jIHZlcmlmeShzaWduYXR1cmU6IFVpbnQ4QXJyYXksIG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBWYWxpZGF0b3JzLnJlcXVpcmVVaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlVWludDhBcnJheShtZXNzYWdlKTtcbiAgICBpZiAodGhpcy5lbmNvZGluZyA9PT0gRWxsaXB0aWNDdXJ2ZXMuRWNkc2FTaWduYXR1cmVFbmNvZGluZ1R5cGUuREVSKSB7XG4gICAgICBzaWduYXR1cmUgPVxuICAgICAgICAgIEVsbGlwdGljQ3VydmVzLmVjZHNhRGVyMkllZWUoc2lnbmF0dXJlLCB0aGlzLmllZWVTaWduYXR1cmVMZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUudmVyaWZ5KFxuICAgICAgICB7bmFtZTogJ0VDRFNBJywgaGFzaDoge25hbWU6IHRoaXMuaGFzaH19LCB0aGlzLmtleSwgc2lnbmF0dXJlLCBtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBvcHRfZW5jb2RpbmcgVGhlXG4gKiAgICAgb3B0aW9uYWwgZW5jb2Rpbmcgb2YgdGhlIHNpZ25hdHVyZS4gSWYgYWJzZW50LCBkZWZhdWx0IGlzIElFRUUgUDEzNjMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmcm9tSnNvbldlYktleShcbiAgICBqd2s6IEpzb25XZWJLZXksIGhhc2g6IHN0cmluZyxcbiAgICBlbmNvZGluZzogRWxsaXB0aWNDdXJ2ZXMuRWNkc2FTaWduYXR1cmVFbmNvZGluZ1R5cGUgPVxuICAgICAgICBFbGxpcHRpY0N1cnZlcy5FY2RzYVNpZ25hdHVyZUVuY29kaW5nVHlwZS5JRUVFX1AxMzYzKTpcbiAgICBQcm9taXNlPFB1YmxpY0tleVZlcmlmeT4ge1xuICBpZiAoIWp3aykge1xuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigncHVibGljIGtleSBoYXMgdG8gYmUgbm9uLW51bGwnKTtcbiAgfVxuICBjb25zdCB7Y3J2fSA9IGp3aztcbiAgaWYgKCFjcnYpIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ2N1cnZlIGhhcyB0byBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgVmFsaWRhdG9ycy52YWxpZGF0ZUVjZHNhUGFyYW1zKGNydiwgaGFzaCk7XG4gIGNvbnN0IGNyeXB0b0tleSA9IGF3YWl0IEVsbGlwdGljQ3VydmVzLmltcG9ydFB1YmxpY0tleSgnRUNEU0EnLCBqd2spO1xuICByZXR1cm4gbmV3IEVjZHNhVmVyaWZ5KGNyeXB0b0tleSwgaGFzaCwgZW5jb2RpbmcpO1xufVxuIl19