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.

118 lines 16.3 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 { PbEciesAeadHkdfPublicKey, PbKeyData } from '../internal/proto'; import { bytesAsU8 } from '../internal/proto_shims'; import * as Util from '../internal/util'; import * as eciesAeadHkdfHybridEncrypt from '../subtle/ecies_aead_hkdf_hybrid_encrypt'; import * as EciesAeadHkdfUtil from './ecies_aead_hkdf_util'; import * as EciesAeadHkdfValidators from './ecies_aead_hkdf_validators'; import { HybridEncrypt } from './internal/hybrid_encrypt'; import { RegistryEciesAeadHkdfDemHelper } from './registry_ecies_aead_hkdf_dem_helper'; /** * @final */ class EciesAeadHkdfPublicKeyFactory { newKey(keyFormat) { throw new SecurityException('This operation is not supported for public keys. ' + 'Use EciesAeadHkdfPrivateKeyManager to generate new keys.'); } newKeyData(serializedKeyFormat) { throw new SecurityException('This operation is not supported for public keys. ' + 'Use EciesAeadHkdfPrivateKeyManager to generate new keys.'); } } /** * @final */ export class EciesAeadHkdfPublicKeyManager { constructor() { this.keyFactory = new EciesAeadHkdfPublicKeyFactory(); } 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 = EciesAeadHkdfPublicKeyManager.getKeyProto(key); EciesAeadHkdfValidators.validatePublicKey(keyProto, this.getVersion()); const recepientPublicKey = EciesAeadHkdfUtil.getJsonWebKeyFromProto(keyProto); const params = keyProto.getParams(); const demParams = params.getDemParams(); if (!demParams) { throw new SecurityException('DEM params not set'); } const keyTemplate = demParams.getAeadDem(); const demHelper = new RegistryEciesAeadHkdfDemHelper(keyTemplate); const pointFormat = Util.pointFormatProtoToSubtle(params.getEcPointFormat()); const kemParams = params.getKemParams(); if (!kemParams) { throw new SecurityException('KEM params not set'); } const hkdfHash = Util.hashTypeProtoToString(kemParams.getHkdfHashType()); const hkdfSalt = bytesAsU8(kemParams.getHkdfSalt()); return eciesAeadHkdfHybridEncrypt.fromJsonWebKey(recepientPublicKey, hkdfHash, pointFormat, demHelper, hkdfSalt); }); } doesSupport(keyType) { return keyType === this.getKeyType(); } getKeyType() { return EciesAeadHkdfPublicKeyManager.KEY_TYPE; } getPrimitiveType() { return EciesAeadHkdfPublicKeyManager.SUPPORTED_PRIMITIVE; } getVersion() { return EciesAeadHkdfPublicKeyManager.VERSION; } getKeyFactory() { return this.keyFactory; } static getKeyProto(keyMaterial) { if (keyMaterial instanceof PbKeyData) { return EciesAeadHkdfPublicKeyManager.getKeyProtoFromKeyData(keyMaterial); } if (keyMaterial instanceof PbEciesAeadHkdfPublicKey) { return keyMaterial; } throw new SecurityException('Key type is not supported. This key manager supports ' + EciesAeadHkdfPublicKeyManager.KEY_TYPE + '.'); } static getKeyProtoFromKeyData(keyData) { if (keyData.getTypeUrl() !== EciesAeadHkdfPublicKeyManager.KEY_TYPE) { throw new SecurityException('Key type ' + keyData.getTypeUrl() + ' is not supported. This key ' + 'manager supports ' + EciesAeadHkdfPublicKeyManager.KEY_TYPE + '.'); } let key; try { key = PbEciesAeadHkdfPublicKey.deserializeBinary(keyData.getValue()); } catch (e) { throw new SecurityException('Input cannot be parsed as ' + EciesAeadHkdfPublicKeyManager.KEY_TYPE + ' key-proto.'); } if (!key.getParams() || !key.getX() || !key.getY()) { throw new SecurityException('Input cannot be parsed as ' + EciesAeadHkdfPublicKeyManager.KEY_TYPE + ' key-proto.'); } return key; } } EciesAeadHkdfPublicKeyManager.KEY_TYPE = 'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey'; EciesAeadHkdfPublicKeyManager.SUPPORTED_PRIMITIVE = HybridEncrypt; EciesAeadHkdfPublicKeyManager.VERSION = 0; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNpZXNfYWVhZF9oa2RmX3B1YmxpY19rZXlfbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2h5YnJpZC9lY2llc19hZWFkX2hrZGZfcHVibGljX2tleV9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUVsRSxPQUFPLEVBQXdCLHdCQUF3QixFQUFFLFNBQVMsRUFBMkIsTUFBTSxtQkFBbUIsQ0FBQztBQUN2SCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssMEJBQTBCLE1BQU0sMENBQTBDLENBQUM7QUFFdkYsT0FBTyxLQUFLLGlCQUFpQixNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sS0FBSyx1QkFBdUIsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFckY7O0dBRUc7QUFDSCxNQUFNLDZCQUE2QjtJQUNqQyxNQUFNLENBQUMsU0FBK0I7UUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUN2QixtREFBbUQ7WUFDbkQsMERBQTBELENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsVUFBVSxDQUFDLG1CQUErQjtRQUN4QyxNQUFNLElBQUksaUJBQWlCLENBQ3ZCLG1EQUFtRDtZQUNuRCwwREFBMEQsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDZCQUE2QjtJQUExQztRQU1FLGVBQVUsR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7SUF3Rm5ELENBQUM7SUF0Rk8sWUFBWSxD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QUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLEdBQTZCLENBQUM7UUFDbEMsSUFBSTtZQUNGLEdBQUcsR0FBRyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUN0RTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLGlCQUFpQixDQUN2Qiw0QkFBNEI7Z0JBQzVCLDZCQUE2QixDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEQsTUFBTSxJQUFJLGlCQUFpQixDQUN2Qiw0QkFBNEI7Z0JBQzVCLDZCQUE2QixDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQztTQUM3RDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUEzRk0sc0NBQVEsR0FDWCwrREFBK0QsQ0FBQztBQUM1QyxpREFBbUIsR0FBRyxhQUFhLENBQUM7QUFDckQscUNBQU8sR0FBVyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7U2VjdXJpdHlFeGNlcHRpb259IGZyb20gJy4uL2V4Y2VwdGlvbi9zZWN1cml0eV9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgS2V5TWFuYWdlciBmcm9tICcuLi9pbnRlcm5hbC9rZXlfbWFuYWdlcic7XG5pbXBvcnQge1BiRWNpZXNBZWFkSGtkZlBhcmFtcywgUGJFY2llc0FlYWRIa2RmUHVibGljS2V5LCBQYktleURhdGEsIFBiS2V5VGVtcGxhdGUsIFBiTWVzc2FnZX0gZnJvbSAnLi4vaW50ZXJuYWwvcHJvdG8nO1xuaW1wb3J0IHtieXRlc0FzVTh9IGZyb20gJy4uL2ludGVybmFsL3Byb3RvX3NoaW1zJztcbmltcG9ydCAqIGFzIFV0aWwgZnJvbSAnLi4vaW50ZXJuYWwvdXRpbCc7XG5pbXBvcnQgKiBhcyBlY2llc0FlYWRIa2RmSHlicmlkRW5jcnlwdCBmcm9tICcuLi9zdWJ0bGUvZWNpZXNfYWVhZF9oa2RmX2h5YnJpZF9lbmNyeXB0JztcblxuaW1wb3J0ICogYXMgRWNpZXNBZWFkSGtkZlV0aWwgZnJvbSAnLi9lY2llc19hZWFkX2hrZGZfdXRpbCc7XG5pbXBvcnQgKiBhcyBFY2llc0FlYWRIa2RmVmFsaWRhdG9ycyBmcm9tICcuL2VjaWVzX2FlYWRfaGtkZl92YWxpZGF0b3JzJztcbmltcG9ydCB7SHlicmlkRW5jcnlwdH0gZnJvbSAnLi9pbnRlcm5hbC9oeWJyaWRfZW5jcnlwdCc7XG5pbXBvcnQge1JlZ2lzdHJ5RWNpZXNBZWFkSGtkZkRlbUhlbHBlcn0gZnJvbSAnLi9yZWdpc3RyeV9lY2llc19hZWFkX2hrZGZfZGVtX2hlbHBlcic7XG5cbi8qKlxuICogQGZpbmFsXG4gKi9cbmNsYXNzIEVjaWVzQWVhZEhrZGZQdWJsaWNLZXlGYWN0b3J5IGltcGxlbWVudHMgS2V5TWFuYWdlci5LZXlGYWN0b3J5IHtcbiAgbmV3S2V5KGtleUZvcm1hdDogUGJNZXNzYWdlfFVpbnQ4QXJyYXkpOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgcHVibGljIGtleXMuICcgK1xuICAgICAgICAnVXNlIEVjaWVzQWVhZEhrZGZQcml2YXRlS2V5TWFuYWdlciB0byBnZW5lcmF0ZSBuZXcga2V5cy4nKTtcbiAgfVxuXG4gIG5ld0tleURhdGEoc2VyaWFsaXplZEtleUZvcm1hdDogVWludDhBcnJheSk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBwdWJsaWMga2V5cy4gJyArXG4gICAgICAgICdVc2UgRWNpZXNBZWFkSGtkZlByaXZhdGVLZXlNYW5hZ2VyIHRvIGdlbmVyYXRlIG5ldyBrZXlzLicpO1xuICB9XG59XG5cbi8qKlxuICogQGZpbmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlciBpbXBsZW1lbnRzXG4gICAgS2V5TWFuYWdlci5LZXlNYW5hZ2VyPEh5YnJpZEVuY3J5cHQ+IHtcbiAgc3RhdGljIEtFWV9UWVBFOiBzdHJpbmcgPVxuICAgICAgJ3R5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLmNyeXB0by50aW5rLkVjaWVzQWVhZEhrZGZQdWJsaWNLZXknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVVBQT1JURURfUFJJTUlUSVZFID0gSHlicmlkRW5jcnlwdDtcbiAgc3RhdGljIFZFUlNJT046IG51bWJlciA9IDA7XG4gIGtleUZhY3RvcnkgPSBuZXcgRWNpZXNBZWFkSGtkZlB1YmxpY0tleUZhY3RvcnkoKTtcblxuICBhc3luYyBnZXRQcmltaXRpdmUoXG4gICAgICBwcmltaXRpdmVUeXBlOiBVdGlsLkNvbnN0cnVjdG9yPEh5YnJpZEVuY3J5cHQ+LFxuICAgICAga2V5OiBQYktleURhdGF8UGJNZXNzYWdlKSB7XG4gICAgaWYgKHByaW1pdGl2ZVR5cGUgIT09IHRoaXMuZ2V0UHJpbWl0aXZlVHlwZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgJ1JlcXVlc3RlZCBwcmltaXRpdmUgdHlwZSB3aGljaCBpcyBub3QgJyArXG4gICAgICAgICAgJ3N1cHBvcnRlZCBieSB0aGlzIGtleSBtYW5hZ2VyLicpO1xuICAgIH1cbiAgICBjb25zdCBrZXlQcm90byA9IEVjaWVzQWVhZEhrZGZQdWJsaWNLZXlNYW5hZ2VyLmdldEtleVByb3RvKGtleSk7XG4gICAgRWNpZXNBZWFkSGtkZlZhbGlkYXRvcnMudmFsaWRhdGVQdWJsaWNLZXkoa2V5UHJvdG8sIHRoaXMuZ2V0VmVyc2lvbigpKTtcbiAgICBjb25zdCByZWNlcGllbnRQdWJsaWNLZXkgPVxuICAgICAgICBFY2llc0FlYWRIa2RmVXRpbC5nZXRKc29uV2ViS2V5RnJvbVByb3RvKGtleVByb3RvKTtcbiAgICBjb25zdCBwYXJhbXMgPSAoa2V5UHJvdG8uZ2V0UGFyYW1zKCkgYXMgUGJFY2llc0FlYWRIa2RmUGFyYW1zKTtcbiAgICBjb25zdCBkZW1QYXJhbXMgPSBwYXJhbXMuZ2V0RGVtUGFyYW1zKCk7XG4gICAgaWYgKCFkZW1QYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignREVNIHBhcmFtcyBub3Qgc2V0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGtleVRlbXBsYXRlID0gKGRlbVBhcmFtcy5nZXRBZWFkRGVtKCkgYXMgUGJLZXlUZW1wbGF0ZSk7XG4gICAgY29uc3QgZGVtSGVscGVyID0gbmV3IFJlZ2lzdHJ5RWNpZXNBZWFkSGtkZkRlbUhlbHBlcihrZXlUZW1wbGF0ZSk7XG4gICAgY29uc3QgcG9pbnRGb3JtYXQgPVxuICAgICAgICBVdGlsLnBvaW50Rm9ybWF0UHJvdG9Ub1N1YnRsZShwYXJhbXMuZ2V0RWNQb2ludEZvcm1hdCgpKTtcbiAgICBjb25zdCBrZW1QYXJhbXMgPSBwYXJhbXMuZ2V0S2VtUGFyYW1zKCk7XG4gICAgaWYgKCFrZW1QYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignS0VNIHBhcmFtcyBub3Qgc2V0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGhrZGZIYXNoID0gVXRpbC5oYXNoVHlwZVByb3RvVG9TdHJpbmcoa2VtUGFyYW1zLmdldEhrZGZIYXNoVHlwZSgpKTtcbiAgICBjb25zdCBoa2RmU2FsdCA9IGJ5dGVzQXNVOChrZW1QYXJhbXMuZ2V0SGtkZlNhbHQoKSk7XG4gICAgcmV0dXJuIGVjaWVzQWVhZEhrZGZIeWJyaWRFbmNyeXB0LmZyb21Kc29uV2ViS2V5KFxuICAgICAgICByZWNlcGllbnRQdWJsaWNLZXksIGhrZGZIYXNoLCBwb2ludEZvcm1hdCwgZGVtSGVscGVyLCBoa2RmU2FsdCk7XG4gIH1cblxuICBkb2VzU3VwcG9ydChrZXlUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ga2V5VHlwZSA9PT0gdGhpcy5nZXRLZXlUeXBlKCk7XG4gIH1cblxuICBnZXRLZXlUeXBlKCkge1xuICAgIHJldHVybiBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlci5LRVlfVFlQRTtcbiAgfVxuXG4gIGdldFByaW1pdGl2ZVR5cGUoKSB7XG4gICAgcmV0dXJuIEVjaWVzQWVhZEhrZGZQdWJsaWNLZXlNYW5hZ2VyLlNVUFBPUlRFRF9QUklNSVRJVkU7XG4gIH1cblxuICBnZXRWZXJzaW9uKCkge1xuICAgIHJldHVybiBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlci5WRVJTSU9OO1xuICB9XG5cbiAgZ2V0S2V5RmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlGYWN0b3J5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0S2V5UHJvdG8oa2V5TWF0ZXJpYWw6IFBiS2V5RGF0YXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGJNZXNzYWdlKTogUGJFY2llc0FlYWRIa2RmUHVibGljS2V5IHtcbiAgICBpZiAoa2V5TWF0ZXJpYWwgaW5zdGFuY2VvZiBQYktleURhdGEpIHtcbiAgICAgIHJldHVybiBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlci5nZXRLZXlQcm90b0Zyb21LZXlEYXRhKGtleU1hdGVyaWFsKTtcbiAgICB9XG4gICAgaWYgKGtleU1hdGVyaWFsIGluc3RhbmNlb2YgUGJFY2llc0FlYWRIa2RmUHVibGljS2V5KSB7XG4gICAgICByZXR1cm4ga2V5TWF0ZXJpYWw7XG4gICAgfVxuICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgJ0tleSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMga2V5IG1hbmFnZXIgc3VwcG9ydHMgJyArXG4gICAgICAgIEVjaWVzQWVhZEhrZGZQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICsgJy4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEtleVByb3RvRnJvbUtleURhdGEoa2V5RGF0YTogUGJLZXlEYXRhKTpcbiAgICAgIFBiRWNpZXNBZWFkSGtkZlB1YmxpY0tleSB7XG4gICAgaWYgKGtleURhdGEuZ2V0VHlwZVVybCgpICE9PSBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlci5LRVlfVFlQRSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAgICdLZXkgdHlwZSAnICsga2V5RGF0YS5nZXRUeXBlVXJsKCkgKyAnIGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMga2V5ICcgK1xuICAgICAgICAgICdtYW5hZ2VyIHN1cHBvcnRzICcgKyBFY2llc0FlYWRIa2RmUHVibGljS2V5TWFuYWdlci5LRVlfVFlQRSArICcuJyk7XG4gICAgfVxuICAgIGxldCBrZXk6IFBiRWNpZXNBZWFkSGtkZlB1YmxpY0tleTtcbiAgICB0cnkge1xuICAgICAga2V5ID0gUGJFY2llc0FlYWRIa2RmUHVibGljS2V5LmRlc2VyaWFsaXplQmluYXJ5KGtleURhdGEuZ2V0VmFsdWUoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAgICdJbnB1dCBjYW5ub3QgYmUgcGFyc2VkIGFzICcgK1xuICAgICAgICAgIEVjaWVzQWVhZEhrZGZQdWJsaWNLZXlNYW5hZ2VyLktFWV9UWVBFICsgJyBrZXktcHJvdG8uJyk7XG4gICAgfVxuICAgIGlmICgha2V5LmdldFBhcmFtcygpIHx8ICFrZXkuZ2V0WCgpIHx8ICFrZXkuZ2V0WSgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgJ0lucHV0IGNhbm5vdCBiZSBwYXJzZWQgYXMgJyArXG4gICAgICAgICAgRWNpZXNBZWFkSGtkZlB1YmxpY0tleU1hbmFnZXIuS0VZX1RZUEUgKyAnIGtleS1wcm90by4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxufVxuIl19