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
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 { 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