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.

158 lines 15.2 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { PbEcdsaKeyFormat, PbEcdsaParams, PbEcdsaSignatureEncoding, PbEllipticCurveType, PbHashType, PbKeyTemplate, PbOutputPrefixType } from '../internal/proto'; import * as SignatureConfig from './signature_config'; /** * Pre-generated KeyTemplates for keys for digital signatures. * * One can use these templates to generate new Keyset with * KeysetHandle.generateNew method. To generate a new keyset that contains a * single EcdsaKey, one can do: * * SignatureConfig.Register(); * KeysetHandle handle = KeysetHandle.generateNew( * SignatureKeyTemplates.ecdsaP256()); * * @final */ export class SignatureKeyTemplates { /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA256 * Curve: NIST P-256 * Signature encoding: DER (this is the encoding that Java uses) * OutputPrefixType: TINK * */ static ecdsaP256() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P256, /* hashType = */ PbHashType.SHA256, /* encoding = */ PbEcdsaSignatureEncoding.DER, /* outputPrefixType = */ PbOutputPrefixType.TINK); } /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA512 * Curve: NIST P-384 * Signature encoding: DER (this is the encoding that Java uses) * OutputPrefixType: TINK * */ static ecdsaP384() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P384, /* hashType = */ PbHashType.SHA512, /* encoding = */ PbEcdsaSignatureEncoding.DER, /* outputPrefixType = */ PbOutputPrefixType.TINK); } /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA512 * Curve: NIST P-521 * Signature encoding: DER (this is the encoding that Java uses). * OutputPrefixType: TINK * */ static ecdsaP521() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P521, /* hashType = */ PbHashType.SHA512, /* encoding = */ PbEcdsaSignatureEncoding.DER, /* outputPrefixType = */ PbOutputPrefixType.TINK); } /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA256 * Curve: NIST P-256 * Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses) * OutputPrefixType: TINK * */ static ecdsaP256IeeeEncoding() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P256, /* hashType = */ PbHashType.SHA256, /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363, /* outputPrefixType = */ PbOutputPrefixType.TINK); } /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA512 * Curve: NIST P-384 * Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses) * OutputPrefixType: TINK * */ static ecdsaP384IeeeEncoding() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P384, /* hashType = */ PbHashType.SHA512, /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363, /* outputPrefixType = */ PbOutputPrefixType.TINK); } /** * Returns a KeyTemplate that generates new instances of * EcdsaPrivateKey with the following parameters: * Hash function: SHA512 * Curve: NIST P-521 * Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses) * OutputPrefixType: TINK * */ static ecdsaP521IeeeEncoding() { return createEcdsaKeyTemplate( /* curveType = */ PbEllipticCurveType.NIST_P521, /* hashType = */ PbHashType.SHA512, /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363, /* outputPrefixType = */ PbOutputPrefixType.TINK); } } function createEcdsaKeyTemplate(curveType, hashType, encoding, outputPrefixType) { // key format const keyFormat = new PbEcdsaKeyFormat(); const params = (new PbEcdsaParams()) .setCurve(curveType) .setHashType(hashType) .setEncoding(encoding); keyFormat.setParams(params); // key template const keyTemplate = (new PbKeyTemplate()) .setTypeUrl(SignatureConfig.ECDSA_PRIVATE_KEY_TYPE) .setValue(keyFormat.serializeBinary()) .setOutputPrefixType(outputPrefixType); return keyTemplate; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlX2tleV90ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zaWduYXR1cmUvc2lnbmF0dXJlX2tleV90ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhLLE9BQU8sS0FBSyxlQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQzs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxTQUFTO1FBQ2QsT0FBTyxzQkFBc0I7UUFDekIsaUJBQWlCO1FBQ2pCLG1CQUFtQixDQUFDLFNBQVM7UUFDN0IsZ0JBQWdCO1FBQ2hCLFVBQVUsQ0FBQyxNQUFNO1FBQ2pCLGdCQUFnQjtRQUNoQix3QkFBd0IsQ0FBQyxHQUFHO1FBQzVCLHdCQUF3QjtRQUN4QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsU0FBUztRQUNkLE9BQU8sc0JBQXNCO1FBQ3pCLGlCQUFpQjtRQUNqQixtQkFBbUIsQ0FBQyxTQUFTO1FBQzdCLGdCQUFnQjtRQUNoQixVQUFVLENBQUMsTUFBTTtRQUNqQixnQkFBZ0I7UUFDaEIsd0JBQXdCLENBQUMsR0FBRztRQUM1Qix3QkFBd0I7UUFDeEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLFNBQVM7UUFDZCxPQUFPLHNCQUFzQjtRQUN6QixpQkFBaUI7UUFDakIsbUJBQW1CLENBQUMsU0FBUztRQUM3QixnQkFBZ0I7UUFDaEIsVUFBVSxDQUFDLE1BQU07UUFDakIsZ0JBQWdCO1FBQ2hCLHdCQUF3QixDQUFDLEdBQUc7UUFDNUIsd0JBQXdCO1FBQ3hCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxxQkFBcUI7UUFDMUIsT0FBTyxzQkFBc0I7UUFDekIsaUJBQWlCO1FBQ2pCLG1CQUFtQixDQUFDLFNBQVM7UUFDN0IsZ0JBQWdCO1FBQ2hCLFVBQVUsQ0FBQyxNQUFNO1FBQ2pCLGdCQUFnQjtRQUNoQix3QkFBd0IsQ0FBQyxVQUFVO1FBQ25DLHdCQUF3QjtRQUN4QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMscUJBQXFCO1FBQzFCLE9BQU8sc0JBQXNCO1FBQ3pCLGlCQUFpQjtRQUNqQixtQkFBbUIsQ0FBQyxTQUFTO1FBQzdCLGdCQUFnQjtRQUNoQixVQUFVLENBQUMsTUFBTTtRQUNqQixnQkFBZ0I7UUFDaEIsd0JBQXdCLENBQUMsVUFBVTtRQUNuQyx3QkFBd0I7UUFDeEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQjtRQUMxQixPQUFPLHNCQUFzQjtRQUN6QixpQkFBaUI7UUFDakIsbUJBQW1CLENBQUMsU0FBUztRQUM3QixnQkFBZ0I7UUFDaEIsVUFBVSxDQUFDLE1BQU07UUFDakIsZ0JBQWdCO1FBQ2hCLHdCQUF3QixDQUFDLFVBQVU7UUFDbkMsd0JBQXdCO1FBQ3hCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELFNBQVMsc0JBQXNCLENBQzNCLFNBQThCLEVBQUUsUUFBb0IsRUFDcEQsUUFBa0MsRUFDbEMsZ0JBQW9DO0lBQ3RDLGFBQWE7SUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ2hCLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDbkIsV0FBVyxDQUFDLFFBQVEsQ0FBQztTQUNyQixXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QixlQUFlO0lBQ2YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ2hCLFVBQVUsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUM7U0FDbEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNyQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbmltcG9ydCB7UGJFY2RzYUtleUZvcm1hdCwgUGJFY2RzYVBhcmFtcywgUGJFY2RzYVNpZ25hdHVyZUVuY29kaW5nLCBQYkVsbGlwdGljQ3VydmVUeXBlLCBQYkhhc2hUeXBlLCBQYktleVRlbXBsYXRlLCBQYk91dHB1dFByZWZpeFR5cGV9IGZyb20gJy4uL2ludGVybmFsL3Byb3RvJztcblxuaW1wb3J0ICogYXMgU2lnbmF0dXJlQ29uZmlnIGZyb20gJy4vc2lnbmF0dXJlX2NvbmZpZyc7XG5cbi8qKlxuICogUHJlLWdlbmVyYXRlZCBLZXlUZW1wbGF0ZXMgZm9yIGtleXMgZm9yIGRpZ2l0YWwgc2lnbmF0dXJlcy5cbiAqXG4gKiBPbmUgY2FuIHVzZSB0aGVzZSB0ZW1wbGF0ZXMgdG8gZ2VuZXJhdGUgbmV3IEtleXNldCB3aXRoXG4gKiBLZXlzZXRIYW5kbGUuZ2VuZXJhdGVOZXcgbWV0aG9kLiBUbyBnZW5lcmF0ZSBhIG5ldyBrZXlzZXQgdGhhdCBjb250YWlucyBhXG4gKiBzaW5nbGUgRWNkc2FLZXksIG9uZSBjYW4gZG86XG4gKlxuICogU2lnbmF0dXJlQ29uZmlnLlJlZ2lzdGVyKCk7XG4gKiBLZXlzZXRIYW5kbGUgaGFuZGxlID0gS2V5c2V0SGFuZGxlLmdlbmVyYXRlTmV3KFxuICogICAgIFNpZ25hdHVyZUtleVRlbXBsYXRlcy5lY2RzYVAyNTYoKSk7XG4gKlxuICogQGZpbmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWduYXR1cmVLZXlUZW1wbGF0ZXMge1xuICAvKipcbiAgICogUmV0dXJucyBhIEtleVRlbXBsYXRlIHRoYXQgZ2VuZXJhdGVzIG5ldyBpbnN0YW5jZXMgb2ZcbiAgICogRWNkc2FQcml2YXRlS2V5IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICAgKiAgSGFzaCBmdW5jdGlvbjogU0hBMjU2XG4gICAqICBDdXJ2ZTogTklTVCBQLTI1NlxuICAgKiAgU2lnbmF0dXJlIGVuY29kaW5nOiBERVIgKHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgSmF2YSB1c2VzKVxuICAgKiAgT3V0cHV0UHJlZml4VHlwZTogVElOS1xuICAgKlxuICAgKi9cbiAgc3RhdGljIGVjZHNhUDI1NigpOiBQYktleVRlbXBsYXRlIHtcbiAgICByZXR1cm4gY3JlYXRlRWNkc2FLZXlUZW1wbGF0ZShcbiAgICAgICAgLyogY3VydmVUeXBlID0gKi9cbiAgICAgICAgUGJFbGxpcHRpY0N1cnZlVHlwZS5OSVNUX1AyNTYsXG4gICAgICAgIC8qIGhhc2hUeXBlID0gKi9cbiAgICAgICAgUGJIYXNoVHlwZS5TSEEyNTYsXG4gICAgICAgIC8qIGVuY29kaW5nID0gKi9cbiAgICAgICAgUGJFY2RzYVNpZ25hdHVyZUVuY29kaW5nLkRFUixcbiAgICAgICAgLyogb3V0cHV0UHJlZml4VHlwZSA9ICovXG4gICAgICAgIFBiT3V0cHV0UHJlZml4VHlwZS5USU5LKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgS2V5VGVtcGxhdGUgdGhhdCBnZW5lcmF0ZXMgbmV3IGluc3RhbmNlcyBvZlxuICAgKiBFY2RzYVByaXZhdGVLZXkgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gICAqICBIYXNoIGZ1bmN0aW9uOiBTSEE1MTJcbiAgICogIEN1cnZlOiBOSVNUIFAtMzg0XG4gICAqICBTaWduYXR1cmUgZW5jb2Rpbmc6IERFUiAodGhpcyBpcyB0aGUgZW5jb2RpbmcgdGhhdCBKYXZhIHVzZXMpXG4gICAqICBPdXRwdXRQcmVmaXhUeXBlOiBUSU5LXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZWNkc2FQMzg0KCk6IFBiS2V5VGVtcGxhdGUge1xuICAgIHJldHVybiBjcmVhdGVFY2RzYUtleVRlbXBsYXRlKFxuICAgICAgICAvKiBjdXJ2ZVR5cGUgPSAqL1xuICAgICAgICBQYkVsbGlwdGljQ3VydmVUeXBlLk5JU1RfUDM4NCxcbiAgICAgICAgLyogaGFzaFR5cGUgPSAqL1xuICAgICAgICBQYkhhc2hUeXBlLlNIQTUxMixcbiAgICAgICAgLyogZW5jb2RpbmcgPSAqL1xuICAgICAgICBQYkVjZHNhU2lnbmF0dXJlRW5jb2RpbmcuREVSLFxuICAgICAgICAvKiBvdXRwdXRQcmVmaXhUeXBlID0gKi9cbiAgICAgICAgUGJPdXRwdXRQcmVmaXhUeXBlLlRJTkspO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBLZXlUZW1wbGF0ZSB0aGF0IGdlbmVyYXRlcyBuZXcgaW5zdGFuY2VzIG9mXG4gICAqIEVjZHNhUHJpdmF0ZUtleSB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICogIEhhc2ggZnVuY3Rpb246IFNIQTUxMlxuICAgKiAgQ3VydmU6IE5JU1QgUC01MjFcbiAgICogIFNpZ25hdHVyZSBlbmNvZGluZzogREVSICh0aGlzIGlzIHRoZSBlbmNvZGluZyB0aGF0IEphdmEgdXNlcykuXG4gICAqICBPdXRwdXRQcmVmaXhUeXBlOiBUSU5LXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZWNkc2FQNTIxKCk6IFBiS2V5VGVtcGxhdGUge1xuICAgIHJldHVybiBjcmVhdGVFY2RzYUtleVRlbXBsYXRlKFxuICAgICAgICAvKiBjdXJ2ZVR5cGUgPSAqL1xuICAgICAgICBQYkVsbGlwdGljQ3VydmVUeXBlLk5JU1RfUDUyMSxcbiAgICAgICAgLyogaGFzaFR5cGUgPSAqL1xuICAgICAgICBQYkhhc2hUeXBlLlNIQTUxMixcbiAgICAgICAgLyogZW5jb2RpbmcgPSAqL1xuICAgICAgICBQYkVjZHNhU2lnbmF0dXJlRW5jb2RpbmcuREVSLFxuICAgICAgICAvKiBvdXRwdXRQcmVmaXhUeXBlID0gKi9cbiAgICAgICAgUGJPdXRwdXRQcmVmaXhUeXBlLlRJTkspO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBLZXlUZW1wbGF0ZSB0aGF0IGdlbmVyYXRlcyBuZXcgaW5zdGFuY2VzIG9mXG4gICAqIEVjZHNhUHJpdmF0ZUtleSB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICogIEhhc2ggZnVuY3Rpb246IFNIQTI1NlxuICAgKiAgQ3VydmU6IE5JU1QgUC0yNTZcbiAgICogIFNpZ25hdHVyZSBlbmNvZGluZzogSUVFRV9QMTM2MyAodGhpcyBpcyB0aGUgZW5jb2RpbmcgdGhhdCBXZWJDcnlwdG8gdXNlcylcbiAgICogIE91dHB1dFByZWZpeFR5cGU6IFRJTktcbiAgICpcbiAgICovXG4gIHN0YXRpYyBlY2RzYVAyNTZJZWVlRW5jb2RpbmcoKTogUGJLZXlUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVjZHNhS2V5VGVtcGxhdGUoXG4gICAgICAgIC8qIGN1cnZlVHlwZSA9ICovXG4gICAgICAgIFBiRWxsaXB0aWNDdXJ2ZVR5cGUuTklTVF9QMjU2LFxuICAgICAgICAvKiBoYXNoVHlwZSA9ICovXG4gICAgICAgIFBiSGFzaFR5cGUuU0hBMjU2LFxuICAgICAgICAvKiBlbmNvZGluZyA9ICovXG4gICAgICAgIFBiRWNkc2FTaWduYXR1cmVFbmNvZGluZy5JRUVFX1AxMzYzLFxuICAgICAgICAvKiBvdXRwdXRQcmVmaXhUeXBlID0gKi9cbiAgICAgICAgUGJPdXRwdXRQcmVmaXhUeXBlLlRJTkspO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBLZXlUZW1wbGF0ZSB0aGF0IGdlbmVyYXRlcyBuZXcgaW5zdGFuY2VzIG9mXG4gICAqIEVjZHNhUHJpdmF0ZUtleSB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICogIEhhc2ggZnVuY3Rpb246IFNIQTUxMlxuICAgKiAgQ3VydmU6IE5JU1QgUC0zODRcbiAgICogIFNpZ25hdHVyZSBlbmNvZGluZzogSUVFRV9QMTM2MyAodGhpcyBpcyB0aGUgZW5jb2RpbmcgdGhhdCBXZWJDcnlwdG8gdXNlcylcbiAgICogIE91dHB1dFByZWZpeFR5cGU6IFRJTktcbiAgICpcbiAgICovXG4gIHN0YXRpYyBlY2RzYVAzODRJZWVlRW5jb2RpbmcoKTogUGJLZXlUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVjZHNhS2V5VGVtcGxhdGUoXG4gICAgICAgIC8qIGN1cnZlVHlwZSA9ICovXG4gICAgICAgIFBiRWxsaXB0aWNDdXJ2ZVR5cGUuTklTVF9QMzg0LFxuICAgICAgICAvKiBoYXNoVHlwZSA9ICovXG4gICAgICAgIFBiSGFzaFR5cGUuU0hBNTEyLFxuICAgICAgICAvKiBlbmNvZGluZyA9ICovXG4gICAgICAgIFBiRWNkc2FTaWduYXR1cmVFbmNvZGluZy5JRUVFX1AxMzYzLFxuICAgICAgICAvKiBvdXRwdXRQcmVmaXhUeXBlID0gKi9cbiAgICAgICAgUGJPdXRwdXRQcmVmaXhUeXBlLlRJTkspO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBLZXlUZW1wbGF0ZSB0aGF0IGdlbmVyYXRlcyBuZXcgaW5zdGFuY2VzIG9mXG4gICAqIEVjZHNhUHJpdmF0ZUtleSB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAgICogIEhhc2ggZnVuY3Rpb246IFNIQTUxMlxuICAgKiAgQ3VydmU6IE5JU1QgUC01MjFcbiAgICogIFNpZ25hdHVyZSBlbmNvZGluZzogSUVFRV9QMTM2MyAodGhpcyBpcyB0aGUgZW5jb2RpbmcgdGhhdCBXZWJDcnlwdG8gdXNlcylcbiAgICogIE91dHB1dFByZWZpeFR5cGU6IFRJTktcbiAgICpcbiAgICovXG4gIHN0YXRpYyBlY2RzYVA1MjFJZWVlRW5jb2RpbmcoKTogUGJLZXlUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVjZHNhS2V5VGVtcGxhdGUoXG4gICAgICAgIC8qIGN1cnZlVHlwZSA9ICovXG4gICAgICAgIFBiRWxsaXB0aWNDdXJ2ZVR5cGUuTklTVF9QNTIxLFxuICAgICAgICAvKiBoYXNoVHlwZSA9ICovXG4gICAgICAgIFBiSGFzaFR5cGUuU0hBNTEyLFxuICAgICAgICAvKiBlbmNvZGluZyA9ICovXG4gICAgICAgIFBiRWNkc2FTaWduYXR1cmVFbmNvZGluZy5JRUVFX1AxMzYzLFxuICAgICAgICAvKiBvdXRwdXRQcmVmaXhUeXBlID0gKi9cbiAgICAgICAgUGJPdXRwdXRQcmVmaXhUeXBlLlRJTkspO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVjZHNhS2V5VGVtcGxhdGUoXG4gICAgY3VydmVUeXBlOiBQYkVsbGlwdGljQ3VydmVUeXBlLCBoYXNoVHlwZTogUGJIYXNoVHlwZSxcbiAgICBlbmNvZGluZzogUGJFY2RzYVNpZ25hdHVyZUVuY29kaW5nLFxuICAgIG91dHB1dFByZWZpeFR5cGU6IFBiT3V0cHV0UHJlZml4VHlwZSk6IFBiS2V5VGVtcGxhdGUge1xuICAvLyBrZXkgZm9ybWF0XG4gIGNvbnN0IGtleUZvcm1hdCA9IG5ldyBQYkVjZHNhS2V5Rm9ybWF0KCk7XG4gIGNvbnN0IHBhcmFtcyA9IChuZXcgUGJFY2RzYVBhcmFtcygpKVxuICAgICAgICAgICAgICAgICAgICAgLnNldEN1cnZlKGN1cnZlVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgIC5zZXRIYXNoVHlwZShoYXNoVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmNvZGluZyhlbmNvZGluZyk7XG4gIGtleUZvcm1hdC5zZXRQYXJhbXMocGFyYW1zKTtcblxuICAvLyBrZXkgdGVtcGxhdGVcbiAgY29uc3Qga2V5VGVtcGxhdGUgPSAobmV3IFBiS2V5VGVtcGxhdGUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFR5cGVVcmwoU2lnbmF0dXJlQ29uZmlnLkVDRFNBX1BSSVZBVEVfS0VZX1RZUEUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShrZXlGb3JtYXQuc2VyaWFsaXplQmluYXJ5KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPdXRwdXRQcmVmaXhUeXBlKG91dHB1dFByZWZpeFR5cGUpO1xuICByZXR1cm4ga2V5VGVtcGxhdGU7XG59XG4iXX0=