UNPKG

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.

104 lines 13.1 kB
/** * @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 { PbEcdsaPublicKey, PbKeyData } from '../internal/proto'; import * as Util from '../internal/util'; import * as ecdsaVerify from '../subtle/ecdsa_verify'; import * as EcdsaUtil from './ecdsa_util'; import { PublicKeyVerify } from './internal/public_key_verify'; /** * @final */ class EcdsaPublicKeyFactory { newKey(keyFormat) { throw new SecurityException('This operation is not supported for public keys. ' + 'Use EcdsaPrivateKeyManager to generate new keys.'); } newKeyData(serializedKeyFormat) { throw new SecurityException('This operation is not supported for public keys. ' + 'Use EcdsaPrivateKeyManager to generate new keys.'); } } /** * @final */ export class EcdsaPublicKeyManager { constructor() { this.keyFactory = new EcdsaPublicKeyFactory(); } getPrimitive(primitiveType, key) { return __awaiter(this, void 0, void 0, function* () { if (primitiveType !== this.getPrimitiveType()) { throw new SecurityException('Requested primitive type which is not ' + 'supported by this key manager.'); } const keyProto = EcdsaPublicKeyManager.getKeyProto(key); EcdsaUtil.validatePublicKey(keyProto, this.getVersion()); const jwk = EcdsaUtil.getJsonWebKeyFromProto(keyProto); const params = keyProto.getParams(); const hash = Util.hashTypeProtoToString(params.getHashType()); const encoding = EcdsaUtil.encodingTypeProtoToEnum(params.getEncoding()); return ecdsaVerify.fromJsonWebKey(jwk, hash, encoding); }); } doesSupport(keyType) { return keyType === this.getKeyType(); } getKeyType() { return EcdsaPublicKeyManager.KEY_TYPE; } getPrimitiveType() { return EcdsaPublicKeyManager.SUPPORTED_PRIMITIVE; } getVersion() { return EcdsaPublicKeyManager.VERSION; } getKeyFactory() { return this.keyFactory; } static getKeyProto(keyMaterial) { if (keyMaterial instanceof PbKeyData) { return EcdsaPublicKeyManager.getKeyProtoFromKeyData(keyMaterial); } if (keyMaterial instanceof PbEcdsaPublicKey) { return keyMaterial; } throw new SecurityException('Key type is not supported. This key manager supports ' + EcdsaPublicKeyManager.KEY_TYPE + '.'); } static getKeyProtoFromKeyData(keyData) { if (keyData.getTypeUrl() !== EcdsaPublicKeyManager.KEY_TYPE) { throw new SecurityException('Key type ' + keyData.getTypeUrl() + ' is not supported. This key ' + 'manager supports ' + EcdsaPublicKeyManager.KEY_TYPE + '.'); } let key; try { key = PbEcdsaPublicKey.deserializeBinary(keyData.getValue()); } catch (e) { throw new SecurityException('Input cannot be parsed as ' + EcdsaPublicKeyManager.KEY_TYPE + ' key-proto.'); } if (!key.getParams() || !key.getX() || !key.getY()) { throw new SecurityException('Input cannot be parsed as ' + EcdsaPublicKeyManager.KEY_TYPE + ' key-proto.'); } return key; } } EcdsaPublicKeyManager.KEY_TYPE = 'type.googleapis.com/google.crypto.tink.EcdsaPublicKey'; EcdsaPublicKeyManager.SUPPORTED_PRIMITIVE = PublicKeyVerify; EcdsaPublicKeyManager.VERSION = 0; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FfcHVibGljX2tleV9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc2lnbmF0dXJlL2VjZHNhX3B1YmxpY19rZXlfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHOzs7Ozs7Ozs7O0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxFQUFnQixnQkFBZ0IsRUFBRSxTQUFTLEVBQVksTUFBTSxtQkFBbUIsQ0FBQztBQUN4RixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTdEOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUI7SUFDekIsTUFBTSxDQUFDLFNBQStCO1FBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FDdkIsbURBQW1EO1lBQ25ELGtEQUFrRCxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFVBQVUsQ0FBQyxtQkFBK0I7UUFDeEMsTUFBTSxJQUFJLGlCQUFpQixDQUN2QixtREFBbUQ7WUFDbkQsa0RBQWtELENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFBbEM7UUFNRSxlQUFVLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBeUUzQyxDQUFDO0lBdkVPLFlBQVksQ0FDZCxhQUFnRCxFQUNoRCxHQUF3Qjs7WUFDMUIsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7Z0JBQzdDLE1BQU0sSUFBSSxpQkFBaUIsQ0FDdkIsd0NBQXdDO29CQUN4QyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsTUFBTSxRQUFR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TExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7U2VjdXJpdHlFeGNlcHRpb259IGZyb20gJy4uL2V4Y2VwdGlvbi9zZWN1cml0eV9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgS2V5TWFuYWdlciBmcm9tICcuLi9pbnRlcm5hbC9rZXlfbWFuYWdlcic7XG5pbXBvcnQge1BiRWNkc2FQYXJhbXMsIFBiRWNkc2FQdWJsaWNLZXksIFBiS2V5RGF0YSwgUGJNZXNzYWdlfSBmcm9tICcuLi9pbnRlcm5hbC9wcm90byc7XG5pbXBvcnQgKiBhcyBVdGlsIGZyb20gJy4uL2ludGVybmFsL3V0aWwnO1xuaW1wb3J0ICogYXMgZWNkc2FWZXJpZnkgZnJvbSAnLi4vc3VidGxlL2VjZHNhX3ZlcmlmeSc7XG5cbmltcG9ydCAqIGFzIEVjZHNhVXRpbCBmcm9tICcuL2VjZHNhX3V0aWwnO1xuaW1wb3J0IHtQdWJsaWNLZXlWZXJpZnl9IGZyb20gJy4vaW50ZXJuYWwvcHVibGljX2tleV92ZXJpZnknO1xuXG4vKipcbiAqIEBmaW5hbFxuICovXG5jbGFzcyBFY2RzYVB1YmxpY0tleUZhY3RvcnkgaW1wbGVtZW50cyBLZXlNYW5hZ2VyLktleUZhY3Rvcnkge1xuICBuZXdLZXkoa2V5Rm9ybWF0OiBQYk1lc3NhZ2V8VWludDhBcnJheSk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBwdWJsaWMga2V5cy4gJyArXG4gICAgICAgICdVc2UgRWNkc2FQcml2YXRlS2V5TWFuYWdlciB0byBnZW5lcmF0ZSBuZXcga2V5cy4nKTtcbiAgfVxuXG4gIG5ld0tleURhdGEoc2VyaWFsaXplZEtleUZvcm1hdDogVWludDhBcnJheSk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBwdWJsaWMga2V5cy4gJyArXG4gICAgICAgICdVc2UgRWNkc2FQcml2YXRlS2V5TWFuYWdlciB0byBnZW5lcmF0ZSBuZXcga2V5cy4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEBmaW5hbFxuICovXG5leHBvcnQgY2xhc3MgRWNkc2FQdWJsaWNLZXlNYW5hZ2VyIGltcGxlbWVudHNcbiAgICBLZXlNYW5hZ2VyLktleU1hbmFnZXI8UHVibGljS2V5VmVyaWZ5PiB7XG4gIHN0YXRpYyBLRVlfVFlQRTogc3RyaW5nID1cbiAgICAgICd0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5jcnlwdG8udGluay5FY2RzYVB1YmxpY0tleSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUFBPUlRFRF9QUklNSVRJVkUgPSBQdWJsaWNLZXlWZXJpZnk7XG4gIHN0YXRpYyBWRVJTSU9OOiBudW1iZXIgPSAwO1xuICBrZXlGYWN0b3J5ID0gbmV3IEVjZHNhUHVibGljS2V5RmFjdG9yeSgpO1xuXG4gIGFzeW5jIGdldFByaW1pdGl2ZShcbiAgICAgIHByaW1pdGl2ZVR5cGU6IFV0aWwuQ29uc3RydWN0b3I8UHVibGljS2V5VmVyaWZ5PixcbiAgICAgIGtleTogUGJLZXlEYXRhfFBiTWVzc2FnZSkge1xuICAgIGlmIChwcmltaXRpdmVUeXBlICE9PSB0aGlzLmdldFByaW1pdGl2ZVR5cGUoKSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAgICdSZXF1ZXN0ZWQgcHJpbWl0aXZlIHR5cGUgd2hpY2ggaXMgbm90ICcgK1xuICAgICAgICAgICdzdXBwb3J0ZWQgYnkgdGhpcyBrZXkgbWFuYWdlci4nKTtcbiAgICB9XG4gICAgY29uc3Qga2V5UHJvdG8gPSBFY2RzYVB1YmxpY0tleU1hbmFnZXIuZ2V0S2V5UHJvdG8oa2V5KTtcbiAgICBFY2RzYVV0aWwudmFsaWRhdGVQdWJsaWNLZXkoa2V5UHJvdG8sIHRoaXMuZ2V0VmVyc2lvbigpKTtcbiAgICBjb25zdCBqd2sgPSBFY2RzYVV0aWwuZ2V0SnNvbldlYktleUZyb21Qcm90byhrZXlQcm90byk7XG4gICAgY29uc3QgcGFyYW1zID0gKGtleVByb3RvLmdldFBhcmFtcygpIGFzIFBiRWNkc2FQYXJhbXMpO1xuICAgIGNvbnN0IGhhc2ggPSBVdGlsLmhhc2hUeXBlUHJvdG9Ub1N0cmluZyhwYXJhbXMuZ2V0SGFzaFR5cGUoKSk7XG4gICAgY29uc3QgZW5jb2RpbmcgPSBFY2RzYVV0aWwuZW5jb2RpbmdUeXBlUHJvdG9Ub0VudW0ocGFyYW1zLmdldEVuY29kaW5nKCkpO1xuICAgIHJldHVybiBlY2RzYVZlcmlmeS5mcm9tSnNvbldlYktleShqd2ssIGhhc2gsIGVuY29kaW5nKTtcbiAgfVxuXG4gIGRvZXNTdXBwb3J0KGtleVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBrZXlUeXBlID09PSB0aGlzLmdldEtleVR5cGUoKTtcbiAgfVxuXG4gIGdldEtleVR5cGUoKSB7XG4gICAgcmV0dXJuIEVjZHNhUHVibGljS2V5TWFuYWdlci5LRVlfVFlQRTtcbiAgfVxuXG4gIGdldFByaW1pdGl2ZVR5cGUoKSB7XG4gICAgcmV0dXJuIEVjZHNhUHVibGljS2V5TWFuYWdlci5TVVBQT1JURURfUFJJTUlUSVZFO1xuICB9XG5cbiAgZ2V0VmVyc2lvbigpIHtcbiAgICByZXR1cm4gRWNkc2FQdWJsaWNLZXlNYW5hZ2VyLlZFUlNJT047XG4gIH1cblxuICBnZXRLZXlGYWN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLmtleUZhY3Rvcnk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRLZXlQcm90byhrZXlNYXRlcmlhbDogUGJLZXlEYXRhfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYk1lc3NhZ2UpOiBQYkVjZHNhUHVibGljS2V5IHtcbiAgICBpZiAoa2V5TWF0ZXJpYWwgaW5zdGFuY2VvZiBQYktleURhdGEpIHtcbiAgICAgIHJldHVybiBFY2RzYVB1YmxpY0tleU1hbmFnZXIuZ2V0S2V5UHJvdG9Gcm9tS2V5RGF0YShrZXlNYXRlcmlhbCk7XG4gICAgfVxuICAgIGlmIChrZXlNYXRlcmlhbCBpbnN0YW5jZW9mIFBiRWNkc2FQdWJsaWNLZXkpIHtcbiAgICAgIHJldHVybiBrZXlNYXRlcmlhbDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnS2V5IHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBrZXkgbWFuYWdlciBzdXBwb3J0cyAnICtcbiAgICAgICAgRWNkc2FQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICsgJy4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEtleVByb3RvRnJvbUtleURhdGEoa2V5RGF0YTogUGJLZXlEYXRhKTogUGJFY2RzYVB1YmxpY0tleSB7XG4gICAgaWYgKGtleURhdGEuZ2V0VHlwZVVybCgpICE9PSBFY2RzYVB1YmxpY0tleU1hbmFnZXIuS0VZX1RZUEUpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgICAnS2V5IHR5cGUgJyArIGtleURhdGEuZ2V0VHlwZVVybCgpICsgJyBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGtleSAnICtcbiAgICAgICAgICAnbWFuYWdlciBzdXBwb3J0cyAnICsgRWNkc2FQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICsgJy4nKTtcbiAgICB9XG4gICAgbGV0IGtleTogUGJFY2RzYVB1YmxpY0tleTtcbiAgICB0cnkge1xuICAgICAga2V5ID0gUGJFY2RzYVB1YmxpY0tleS5kZXNlcmlhbGl6ZUJpbmFyeShrZXlEYXRhLmdldFZhbHVlKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgICAnSW5wdXQgY2Fubm90IGJlIHBhcnNlZCBhcyAnICsgRWNkc2FQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICtcbiAgICAgICAgICAnIGtleS1wcm90by4nKTtcbiAgICB9XG4gICAgaWYgKCFrZXkuZ2V0UGFyYW1zKCkgfHwgIWtleS5nZXRYKCkgfHwgIWtleS5nZXRZKCkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgICAnSW5wdXQgY2Fubm90IGJlIHBhcnNlZCBhcyAnICsgRWNkc2FQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICtcbiAgICAgICAgICAnIGtleS1wcm90by4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxufVxuIl19