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.

138 lines 18 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 { Aead } from '../aead'; import { AeadConfig } from '../aead/aead_config'; import { SecurityException } from '../exception/security_exception'; import { PbAesCtrHmacAeadKeyFormat, PbAesGcmKey, PbAesGcmKeyFormat } from '../internal/proto'; import * as Registry from '../internal/registry'; /** * @final */ export class RegistryEciesAeadHkdfDemHelper { constructor(keyTemplate) { let demKeySize; let aesCtrKeySize; let keyFormat; const keyTypeUrl = keyTemplate.getTypeUrl(); switch (keyTypeUrl) { case AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL: keyFormat = RegistryEciesAeadHkdfDemHelper.getAesCtrHmacKeyFormat(keyTemplate); const aesCtrKeyFormat = keyFormat.getAesCtrKeyFormat(); if (!aesCtrKeyFormat) { throw new SecurityException('AES-CTR key format not set'); } aesCtrKeySize = aesCtrKeyFormat.getKeySize(); const hmacKeyFormat = keyFormat.getHmacKeyFormat(); if (!hmacKeyFormat) { throw new SecurityException('HMAC key format not set'); } const hmacKeySize = hmacKeyFormat.getKeySize(); demKeySize = aesCtrKeySize + hmacKeySize; break; case AeadConfig.AES_GCM_TYPE_URL: keyFormat = RegistryEciesAeadHkdfDemHelper.getAesGcmKeyFormat(keyTemplate); demKeySize = keyFormat.getKeySize(); break; default: throw new SecurityException('Key type URL ' + keyTypeUrl + ' is not supported.'); } const keyFactory = Registry.getKeyManager(keyTypeUrl).getKeyFactory(); this.key = keyFactory.newKey(keyFormat); this.demKeyTypeUrl = keyTypeUrl; this.demKeySize = demKeySize; this.aesCtrKeySize = aesCtrKeySize; } /** */ getDemKeySizeInBytes() { return this.demKeySize; } /** */ getAead(demKey) { return __awaiter(this, void 0, void 0, function* () { if (demKey.length !== this.demKeySize) { throw new SecurityException(`Key is not of the correct length, expected length: ${this.demKeySize}, but got key of length: ${demKey.length}.`); } let key; if (this.demKeyTypeUrl === AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL) { key = this.replaceAesCtrHmacKeyValue(demKey); } else { key = this.replaceAesGcmKeyValue(demKey); } return Registry.getPrimitive(Aead, key, this.demKeyTypeUrl); }); } static getAesGcmKeyFormat(keyTemplate) { let keyFormat; try { keyFormat = PbAesGcmKeyFormat.deserializeBinary(keyTemplate.getValue()); } catch (e) { throw new SecurityException('Could not parse the given Uint8Array as a serialized proto of ' + AeadConfig.AES_GCM_TYPE_URL + '.'); } if (!keyFormat.getKeySize()) { throw new SecurityException('Could not parse the given Uint8Array as a serialized proto of ' + AeadConfig.AES_GCM_TYPE_URL + '.'); } return keyFormat; } static getAesCtrHmacKeyFormat(keyTemplate) { let keyFormat; try { keyFormat = PbAesCtrHmacAeadKeyFormat.deserializeBinary(keyTemplate.getValue()); } catch (e) { throw new SecurityException('Could not parse the given Uint8Array ' + 'as a serialized proto of ' + AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL + '.'); } if (!keyFormat.getAesCtrKeyFormat() || !keyFormat.getHmacKeyFormat()) { throw new SecurityException('Could not parse the given Uint8Array as a serialized proto of ' + AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL + '.'); } return keyFormat; } replaceAesGcmKeyValue(symmetricKey) { if (!(this.key instanceof PbAesGcmKey)) { throw new SecurityException('Key is not an AES-CTR key'); } const key = this.key.setKeyValue(symmetricKey); return key; } replaceAesCtrHmacKeyValue(symmetricKey) { const key = this.key; const aesCtrKey = key.getAesCtrKey(); if (!aesCtrKey) { throw new SecurityException('AES-CTR key not set'); } const aesCtrKeyValue = symmetricKey.slice(0, this.aesCtrKeySize); aesCtrKey.setKeyValue(aesCtrKeyValue); const hmacKey = key.getHmacKey(); if (!hmacKey) { throw new SecurityException('HMAC key not set'); } const hmacKeyValue = symmetricKey.slice(this.aesCtrKeySize, this.demKeySize); hmacKey.setKeyValue(hmacKeyValue); return key; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnlfZWNpZXNfYWVhZF9oa2RmX2RlbV9oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9oeWJyaWQvcmVnaXN0cnlfZWNpZXNfYWVhZF9oa2RmX2RlbV9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRzs7Ozs7Ozs7OztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBc0IseUJBQXlCLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFnQixNQUFNLG1CQUFtQixDQUFDO0FBQ2hJLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFHakQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sOEJBQThCO0lBTXpDLFlBQVksV0FBMEI7UUFDcEMsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksYUFBK0IsQ0FBQztRQUNwQyxJQUFJLFNBQXNELENBQUM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLFFBQVEsVUFBVSxFQUFFO1lBQ2xCLEtBQUssVUFBVSxDQUFDLDBCQUEwQjtnQkFDeEMsU0FBUztvQkFDTCw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkUsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2lCQUMzRDtnQkFDRCxhQUFhLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMs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QUFNLFlBQVksR0FDZCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7QWVhZH0gZnJvbSAnLi4vYWVhZCc7XG5pbXBvcnQge0FlYWRDb25maWd9IGZyb20gJy4uL2FlYWQvYWVhZF9jb25maWcnO1xuaW1wb3J0IHtTZWN1cml0eUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhjZXB0aW9uL3NlY3VyaXR5X2V4Y2VwdGlvbic7XG5pbXBvcnQge1BiQWVzQ3RySG1hY0FlYWRLZXksIFBiQWVzQ3RySG1hY0FlYWRLZXlGb3JtYXQsIFBiQWVzR2NtS2V5LCBQYkFlc0djbUtleUZvcm1hdCwgUGJLZXlUZW1wbGF0ZX0gZnJvbSAnLi4vaW50ZXJuYWwvcHJvdG8nO1xuaW1wb3J0ICogYXMgUmVnaXN0cnkgZnJvbSAnLi4vaW50ZXJuYWwvcmVnaXN0cnknO1xuaW1wb3J0IHtFY2llc0FlYWRIa2RmRGVtSGVscGVyfSBmcm9tICcuLi9zdWJ0bGUvZWNpZXNfYWVhZF9oa2RmX2RlbV9oZWxwZXInO1xuXG4vKipcbiAqIEBmaW5hbFxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cnlFY2llc0FlYWRIa2RmRGVtSGVscGVyIGltcGxlbWVudHMgRWNpZXNBZWFkSGtkZkRlbUhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5OiBQYkFlc0N0ckhtYWNBZWFkS2V5fFBiQWVzR2NtS2V5O1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbUtleVR5cGVVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZW1LZXlTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWVzQ3RyS2V5U2l6ZT86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihrZXlUZW1wbGF0ZTogUGJLZXlUZW1wbGF0ZSkge1xuICAgIGxldCBkZW1LZXlTaXplOiBudW1iZXI7XG4gICAgbGV0IGFlc0N0cktleVNpemU6IG51bWJlcnx1bmRlZmluZWQ7XG4gICAgbGV0IGtleUZvcm1hdDogUGJBZXNDdHJIbWFjQWVhZEtleUZvcm1hdHxQYkFlc0djbUtleUZvcm1hdDtcbiAgICBjb25zdCBrZXlUeXBlVXJsID0ga2V5VGVtcGxhdGUuZ2V0VHlwZVVybCgpO1xuICAgIHN3aXRjaCAoa2V5VHlwZVVybCkge1xuICAgICAgY2FzZSBBZWFkQ29uZmlnLkFFU19DVFJfSE1BQ19BRUFEX1RZUEVfVVJMOlxuICAgICAgICBrZXlGb3JtYXQgPVxuICAgICAgICAgICAgUmVnaXN0cnlFY2llc0FlYWRIa2RmRGVtSGVscGVyLmdldEFlc0N0ckhtYWNLZXlGb3JtYXQoa2V5VGVtcGxhdGUpO1xuICAgICAgICBjb25zdCBhZXNDdHJLZXlGb3JtYXQgPSBrZXlGb3JtYXQuZ2V0QWVzQ3RyS2V5Rm9ybWF0KCk7XG4gICAgICAgIGlmICghYWVzQ3RyS2V5Rm9ybWF0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdBRVMtQ1RSIGtleSBmb3JtYXQgbm90IHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGFlc0N0cktleVNpemUgPSBhZXNDdHJLZXlGb3JtYXQuZ2V0S2V5U2l6ZSgpO1xuICAgICAgICBjb25zdCBobWFjS2V5Rm9ybWF0ID0ga2V5Rm9ybWF0LmdldEhtYWNLZXlGb3JtYXQoKTtcbiAgICAgICAgaWYgKCFobWFjS2V5Rm9ybWF0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCdITUFDIGtleSBmb3JtYXQgbm90IHNldCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhtYWNLZXlTaXplID0gaG1hY0tleUZvcm1hdC5nZXRLZXlTaXplKCk7XG4gICAgICAgIGRlbUtleVNpemUgPSBhZXNDdHJLZXlTaXplICsgaG1hY0tleVNpemU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBZWFkQ29uZmlnLkFFU19HQ01fVFlQRV9VUkw6XG4gICAgICAgIGtleUZvcm1hdCA9XG4gICAgICAgICAgICBSZWdpc3RyeUVjaWVzQWVhZEhrZGZEZW1IZWxwZXIuZ2V0QWVzR2NtS2V5Rm9ybWF0KGtleVRlbXBsYXRlKTtcbiAgICAgICAgZGVtS2V5U2l6ZSA9IGtleUZvcm1hdC5nZXRLZXlTaXplKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKFxuICAgICAgICAgICAgJ0tleSB0eXBlIFVSTCAnICsga2V5VHlwZVVybCArICcgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gICAgY29uc3Qga2V5RmFjdG9yeSA9IFJlZ2lzdHJ5LmdldEtleU1hbmFnZXIoa2V5VHlwZVVybCkuZ2V0S2V5RmFjdG9yeSgpO1xuICAgIHRoaXMua2V5ID1cbiAgICAgICAgKGtleUZhY3RvcnkubmV3S2V5KGtleUZvcm1hdCkgYXMgUGJBZXNDdHJIbWFjQWVhZEtleSB8IFBiQWVzR2NtS2V5KTtcbiAgICB0aGlzLmRlbUtleVR5cGVVcmwgPSBrZXlUeXBlVXJsO1xuICAgIHRoaXMuZGVtS2V5U2l6ZSA9IGRlbUtleVNpemU7XG4gICAgdGhpcy5hZXNDdHJLZXlTaXplID0gYWVzQ3RyS2V5U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgZ2V0RGVtS2V5U2l6ZUluQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVtS2V5U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgYXN5bmMgZ2V0QWVhZChkZW1LZXk6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPEFlYWQ+IHtcbiAgICBpZiAoZGVtS2V5Lmxlbmd0aCAhPT0gdGhpcy5kZW1LZXlTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgYEtleSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoLCBleHBlY3RlZCBsZW5ndGg6ICR7XG4gICAgICAgICAgICAgIHRoaXMuZGVtS2V5U2l6ZX0sIGJ1dCBnb3Qga2V5IG9mIGxlbmd0aDogJHtkZW1LZXkubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgbGV0IGtleTogUGJBZXNDdHJIbWFjQWVhZEtleXxQYkFlc0djbUtleTtcbiAgICBpZiAodGhpcy5kZW1LZXlUeXBlVXJsID09PSBBZWFkQ29uZmlnLkFFU19DVFJfSE1BQ19BRUFEX1RZUEVfVVJMKSB7XG4gICAgICBrZXkgPSB0aGlzLnJlcGxhY2VBZXNDdHJIbWFjS2V5VmFsdWUoZGVtS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gdGhpcy5yZXBsYWNlQWVzR2NtS2V5VmFsdWUoZGVtS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZ2lzdHJ5LmdldFByaW1pdGl2ZTxBZWFkPihBZWFkLCBrZXksIHRoaXMuZGVtS2V5VHlwZVVybCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRBZXNHY21LZXlGb3JtYXQoa2V5VGVtcGxhdGU6IFBiS2V5VGVtcGxhdGUpOlxuICAgICAgUGJBZXNHY21LZXlGb3JtYXQge1xuICAgIGxldCBrZXlGb3JtYXQ6IFBiQWVzR2NtS2V5Rm9ybWF0O1xuICAgIHRyeSB7XG4gICAgICBrZXlGb3JtYXQgPSBQYkFlc0djbUtleUZvcm1hdC5kZXNlcmlhbGl6ZUJpbmFyeShrZXlUZW1wbGF0ZS5nZXRWYWx1ZSgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvdWxkIG5vdCBwYXJzZSB0aGUgZ2l2ZW4gVWludDhBcnJheSBhcyBhIHNlcmlhbGl6ZWQgcHJvdG8gb2YgJyArXG4gICAgICAgICAgQWVhZENvbmZpZy5BRVNfR0NNX1RZUEVfVVJMICsgJy4nKTtcbiAgICB9XG4gICAgaWYgKCFrZXlGb3JtYXQuZ2V0S2V5U2l6ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvdWxkIG5vdCBwYXJzZSB0aGUgZ2l2ZW4gVWludDhBcnJheSBhcyBhIHNlcmlhbGl6ZWQgcHJvdG8gb2YgJyArXG4gICAgICAgICAgQWVhZENvbmZpZy5BRVNfR0NNX1RZUEVfVVJMICsgJy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleUZvcm1hdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEFlc0N0ckhtYWNLZXlGb3JtYXQoa2V5VGVtcGxhdGU6IFBiS2V5VGVtcGxhdGUpOlxuICAgICAgUGJBZXNDdHJIbWFjQWVhZEtleUZvcm1hdCB7XG4gICAgbGV0IGtleUZvcm1hdDogUGJBZXNDdHJIbWFjQWVhZEtleUZvcm1hdDtcbiAgICB0cnkge1xuICAgICAga2V5Rm9ybWF0ID1cbiAgICAgICAgICBQYkFlc0N0ckhtYWNBZWFkS2V5Rm9ybWF0LmRlc2VyaWFsaXplQmluYXJ5KGtleVRlbXBsYXRlLmdldFZhbHVlKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbihcbiAgICAgICAgICAnQ291bGQgbm90IHBhcnNlIHRoZSBnaXZlbiBVaW50OEFycmF5ICcgK1xuICAgICAgICAgICdhcyBhIHNlcmlhbGl6ZWQgcHJvdG8gb2YgJyArIEFlYWRDb25maWcuQUVTX0NUUl9ITUFDX0FFQURfVFlQRV9VUkwgK1xuICAgICAgICAgICcuJyk7XG4gICAgfVxuICAgIGlmICgha2V5Rm9ybWF0LmdldEFlc0N0cktleUZvcm1hdCgpIHx8ICFrZXlGb3JtYXQuZ2V0SG1hY0tleUZvcm1hdCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvdWxkIG5vdCBwYXJzZSB0aGUgZ2l2ZW4gVWludDhBcnJheSBhcyBhIHNlcmlhbGl6ZWQgcHJvdG8gb2YgJyArXG4gICAgICAgICAgQWVhZENvbmZpZy5BRVNfQ1RSX0hNQUNfQUVBRF9UWVBFX1VSTCArICcuJyk7XG4gICAgfVxuICAgIHJldHVybiBrZXlGb3JtYXQ7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VBZXNHY21LZXlWYWx1ZShzeW1tZXRyaWNLZXk6IFVpbnQ4QXJyYXkpOiBQYkFlc0djbUtleSB7XG4gICAgaWYgKCEodGhpcy5rZXkgaW5zdGFuY2VvZiBQYkFlc0djbUtleSkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignS2V5IGlzIG5vdCBhbiBBRVMtQ1RSIGtleScpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSB0aGlzLmtleS5zZXRLZXlWYWx1ZShzeW1tZXRyaWNLZXkpO1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VBZXNDdHJIbWFjS2V5VmFsdWUoc3ltbWV0cmljS2V5OiBVaW50OEFycmF5KTpcbiAgICAgIFBiQWVzQ3RySG1hY0FlYWRLZXkge1xuICAgIGNvbnN0IGtleSA9ICh0aGlzLmtleSBhcyBQYkFlc0N0ckhtYWNBZWFkS2V5KTtcbiAgICBjb25zdCBhZXNDdHJLZXkgPSBrZXkuZ2V0QWVzQ3RyS2V5KCk7XG4gICAgaWYgKCFhZXNDdHJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbignQUVTLUNUUiBrZXkgbm90IHNldCcpO1xuICAgIH1cbiAgICBjb25zdCBhZXNDdHJLZXlWYWx1ZSA9IHN5bW1ldHJpY0tleS5zbGljZSgwLCB0aGlzLmFlc0N0cktleVNpemUpO1xuICAgIGFlc0N0cktleS5zZXRLZXlWYWx1ZShhZXNDdHJLZXlWYWx1ZSk7XG4gICAgY29uc3QgaG1hY0tleSA9IGtleS5nZXRIbWFjS2V5KCk7XG4gICAgaWYgKCFobWFjS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oJ0hNQUMga2V5IG5vdCBzZXQnKTtcbiAgICB9XG4gICAgY29uc3QgaG1hY0tleVZhbHVlID1cbiAgICAgICAgc3ltbWV0cmljS2V5LnNsaWNlKHRoaXMuYWVzQ3RyS2V5U2l6ZSwgdGhpcy5kZW1LZXlTaXplKTtcbiAgICBobWFjS2V5LnNldEtleVZhbHVlKGhtYWNLZXlWYWx1ZSk7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxufVxuIl19