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
JavaScript
/**
* @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=