PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/bitgo/utils/tss/ecdsa/SMC

Просмотр файла: utils.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MPCv2SMCUtils = void 0;
const assert_1 = __importDefault(require("assert"));
const public_types_1 = require("@bitgo/public-types");
const ecdsaMPCv2_1 = require("../ecdsaMPCv2");
const __1 = require("../../../..");
const ecdsaMPCv2KeyGenSender_1 = require("../ecdsaMPCv2KeyGenSender");
class MPCv2SMCUtils {
    constructor(bitgo, baseCoin) {
        this.bitgo = bitgo;
        this.baseCoin = baseCoin;
        this.MPCv2Utils = new ecdsaMPCv2_1.EcdsaMPCv2Utils(bitgo, baseCoin);
    }
    async keyGenRound1(enterprise, payload) {
        return this.keyGenRound1BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
    }
    async keyGenRound2(enterprise, payload) {
        return this.keyGenRound2BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
    }
    async keyGenRound3(enterprise, payload) {
        return this.keyGenRound3BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
    }
    async keyGenRound1BySender(senderFn, payload) {
        (0, assert_1.default)(payload.state === public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound1Data, `Invalid state for round 1, expected: ${public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound1Data}, got: ${payload.state}`);
        (0, __1.decodeOrElse)(public_types_1.OVC2ToBitgoRound1Payload.name, public_types_1.OVC2ToBitgoRound1Payload, payload, (errors) => {
            throw new Error(`error(s) parsing payload: ${errors}`);
        });
        const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
        const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
        const userGpgPublicKey = ovc1.gpgPubKey;
        const backupGpgPublicKey = ovc2.gpgPubKey;
        const messages = { p2pMessages: [], broadcastMessages: [ovc1.ovcMsg1, ovc2.ovcMsg1] };
        const result = await this.MPCv2Utils.sendKeyGenerationRound1BySender(senderFn, userGpgPublicKey, backupGpgPublicKey, messages);
        const response = {
            state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1Round2Data,
            tssVersion: payload.tssVersion,
            walletType: payload.walletType,
            coin: payload.coin,
            ovc: payload.ovc,
            platform: {
                walletGpgPubKeySigs: result.walletGpgPubKeySigs,
                sessionId: result.sessionId,
                bitgoMsg1: this.MPCv2Utils.formatBitgoBroadcastMessage(result.bitgoMsg1),
                ovc: {
                    [public_types_1.OVCIndexEnum.ONE]: { bitgoToOvcMsg2: this.MPCv2Utils.formatP2PMessage(result.bitgoToUserMsg2) },
                    [public_types_1.OVCIndexEnum.TWO]: { bitgoToOvcMsg2: this.MPCv2Utils.formatP2PMessage(result.bitgoToBackupMsg2) },
                },
            },
        };
        return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round1Response.name, public_types_1.BitgoToOVC1Round1Response, response, (errors) => {
            throw new Error(`error(s) parsing response: ${errors}`);
        });
    }
    async keyGenRound2BySender(senderFn, payload) {
        (0, assert_1.default)(payload.state === public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound2Data, `Invalid state for round 2, expected: ${public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound2Data}, got: ${payload.state}`);
        (0, __1.decodeOrElse)(public_types_1.OVC2ToBitgoRound2Payload.name, public_types_1.OVC2ToBitgoRound2Payload, payload, (errors) => {
            throw new Error(`error(s) parsing payload: ${errors}`);
        });
        const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
        const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
        const sessionId = payload.platform.sessionId;
        const messages = { p2pMessages: [ovc1.ovcToBitgoMsg2, ovc2.ovcToBitgoMsg2], broadcastMessages: [] };
        const result = await this.MPCv2Utils.sendKeyGenerationRound2BySender(senderFn, sessionId, messages);
        const response = {
            state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1Round3aData,
            tssVersion: payload.tssVersion,
            walletType: payload.walletType,
            coin: payload.coin,
            ovc: payload.ovc,
            platform: {
                ...payload.platform,
                sessionId: result.sessionId,
                bitgoCommitment2: result.bitgoCommitment2,
                ovc: {
                    [public_types_1.OVCIndexEnum.ONE]: {
                        ...payload.platform.ovc[public_types_1.OVCIndexEnum.ONE],
                        bitgoToOvcMsg3: this.MPCv2Utils.formatP2PMessage(result.bitgoToUserMsg3),
                    },
                    [public_types_1.OVCIndexEnum.TWO]: {
                        ...payload.platform.ovc[public_types_1.OVCIndexEnum.TWO],
                        bitgoToOvcMsg3: this.MPCv2Utils.formatP2PMessage(result.bitgoToBackupMsg3),
                    },
                },
            },
        };
        return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round2Response.name, public_types_1.BitgoToOVC1Round2Response, response, (errors) => {
            throw new Error(`error(s) parsing response: ${errors}`);
        });
    }
    async keyGenRound3BySender(senderFn, payload) {
        (0, assert_1.default)(payload.state === public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound3Data, `Invalid state for round 3, expected: ${public_types_1.KeyCreationMPCv2StateEnum.WaitingForBitgoRound3Data}, got: ${payload.state}`);
        (0, __1.decodeOrElse)(public_types_1.OVC1ToBitgoRound3Payload.name, public_types_1.OVC1ToBitgoRound3Payload, payload, (errors) => {
            throw new Error(`error(s) parsing payload: ${errors}`);
        });
        const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
        const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
        const sessionId = payload.platform.sessionId;
        const messages = {
            p2pMessages: [ovc1.ovcToBitgoMsg3, ovc2.ovcToBitgoMsg3],
            broadcastMessages: [ovc1.ovcMsg4, ovc2.ovcMsg4],
        };
        const result = await this.MPCv2Utils.sendKeyGenerationRound3BySender(senderFn, sessionId, messages);
        const keychains = this.baseCoin.keychains();
        const bitgoKeychain = await keychains.add({
            source: 'bitgo',
            keyType: 'tss',
            commonKeychain: result.commonKeychain,
            isMPCv2: true,
        });
        const response = {
            state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1GenerateKey,
            bitGoKeyId: bitgoKeychain.id,
            tssVersion: payload.tssVersion,
            walletType: payload.walletType,
            coin: payload.coin,
            ovc: payload.ovc,
            platform: {
                ...payload.platform,
                commonKeychain: result.commonKeychain,
                bitgoMsg4: this.MPCv2Utils.formatBitgoBroadcastMessage(result.bitgoMsg4),
            },
        };
        return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round3Response.name, public_types_1.BitgoToOVC1Round3Response, response, (errors) => {
            throw new Error(`error(s) parsing response: ${errors}`);
        });
    }
    async uploadClientKeys(bitgoKeyId, userCommonKeychain, backupCommonKeychain) {
        (0, assert_1.default)(userCommonKeychain === backupCommonKeychain, 'Common keychain mismatch between the user and backup keychains');
        const keychains = this.baseCoin.keychains();
        const bitgoKeychain = await keychains.get({ id: bitgoKeyId });
        (0, assert_1.default)(bitgoKeychain, 'Keychain not found');
        (0, assert_1.default)(bitgoKeychain.source === 'bitgo', 'The keychain is not a BitGo keychain');
        (0, assert_1.default)(bitgoKeychain.type === 'tss', 'BitGo keychain is not a TSS keychain');
        (0, assert_1.default)(bitgoKeychain.commonKeychain, 'BitGo keychain does not have a common keychain');
        (0, assert_1.default)(bitgoKeychain.commonKeychain === userCommonKeychain, 'Common keychain mismatch between the OVCs and BitGo');
        const userKeychainPromise = keychains.add({
            source: 'user',
            keyType: 'tss',
            commonKeychain: userCommonKeychain,
            isMPCv2: true,
        });
        const backupKeychainPromise = keychains.add({
            source: 'backup',
            keyType: 'tss',
            commonKeychain: backupCommonKeychain,
            isMPCv2: true,
        });
        const [userKeychain, backupKeychain] = await Promise.all([userKeychainPromise, backupKeychainPromise]);
        return { userKeychain, backupKeychain, bitgoKeychain };
    }
}
exports.MPCv2SMCUtils = MPCv2SMCUtils;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL1NNQy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsc0RBWTZCO0FBRzdCLDhDQUFnRDtBQUNoRCxtQ0FBcUQ7QUFDckQsc0VBQThGO0FBRTlGLE1BQWEsYUFBYTtJQUd4QixZQUFvQixLQUFnQixFQUFVLFFBQW1CO1FBQTdDLFVBQUssR0FBTCxLQUFLLENBQVc7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLE9BQWlDO1FBQzdFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUEsa0RBQXlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLE9BQWlDO1FBQzdFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUEsa0RBQXlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLE9BQWlDO1FBQzdFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUEsa0RBQXlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU0sS0FBSyxDQUFDLG9CQUFvQixDQUMvQixRQUEyRCxFQUMzRCxPQUFpQztRQUVqQyxJ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LG9CQUFvQjtZQUNwQyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQS9MRCxzQ0ErTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBCaXRnb1RvT1ZDMVJvdW5kMVJlc3BvbnNlLFxuICBCaXRnb1RvT1ZDMVJvdW5kMlJlc3BvbnNlLFxuICBCaXRnb1RvT1ZDMVJvdW5kM1Jlc3BvbnNlLFxuICBLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLFxuICBNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlLFxuICBNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlLFxuICBPVkMxVG9CaXRnb1JvdW5kM1BheWxvYWQsXG4gIE9WQzJUb0JpdGdvUm91bmQxUGF5bG9hZCxcbiAgT1ZDMlRvQml0Z29Sb3VuZDJQYXlsb2FkLFxuICBPVkNJbmRleEVudW0sXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscyB9IGZyb20gJy4uL2VjZHNhTVBDdjInO1xuaW1wb3J0IHsgZGVjb2RlT3JFbHNlLCBLZXljaGFpbiB9IGZyb20gJy4uLy4uLy4uLy4uJztcbmltcG9ydCB7IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm4sIEtleUdlblNlbmRlckZvckVudGVycHJpc2UgfSBmcm9tICcuLi9lY2RzYU1QQ3YyS2V5R2VuU2VuZGVyJztcblxuZXhwb3J0IGNsYXNzIE1QQ3YyU01DVXRpbHMge1xuICBwcml2YXRlIE1QQ3YyVXRpbHM6IEVjZHNhTVBDdjJVdGlscztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJpdGdvOiBCaXRHb0Jhc2UsIHByaXZhdGUgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuTVBDdjJVdGlscyA9IG5ldyBFY2RzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBrZXlHZW5Sb3VuZDEoZW50ZXJwcmlzZTogc3RyaW5nLCBwYXlsb2FkOiBPVkMyVG9CaXRnb1JvdW5kMVBheWxvYWQpOiBQcm9taXNlPEJpdGdvVG9PVkMxUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5rZXlHZW5Sb3VuZDFCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBrZXlHZW5Sb3VuZDIoZW50ZXJwcmlzZTogc3RyaW5nLCBwYXlsb2FkOiBPVkMyVG9CaXRnb1JvdW5kMlBheWxvYWQpOiBQcm9taXNlPEJpdGdvVG9PVkMxUm91bmQyUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5rZXlHZW5Sb3VuZDJCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBrZXlHZW5Sb3VuZDMoZW50ZXJwcmlzZTogc3RyaW5nLCBwYXlsb2FkOiBPVkMxVG9CaXRnb1JvdW5kM1BheWxvYWQpOiBQcm9taXNlPEJpdGdvVG9PVkMxUm91bmQzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5rZXlHZW5Sb3VuZDNCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBrZXlHZW5Sb3VuZDFCeVNlbmRlcihcbiAgICBzZW5kZXJGbjogRWNkc2FNUEN2MktleUdlblNlbmRGbjxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBPVkMyVG9CaXRnb1JvdW5kMVBheWxvYWRcbiAgKTogUHJvbWlzZTxCaXRnb1RvT1ZDMVJvdW5kMVJlc3BvbnNlPiB7XG4gICAgYXNzZXJ0KFxuICAgICAgcGF5bG9hZC5zdGF0ZSA9PT0gS2V5Q3JlYXRpb25NUEN2MlN0YXRlRW51bS5XYWl0aW5nRm9yQml0Z29Sb3VuZDFEYXRhLFxuICAgICAgYEludmFsaWQgc3RhdGUgZm9yIHJvdW5kIDEsIGV4cGVjdGVkOiAke0tleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0ZvckJpdGdvUm91bmQxRGF0YX0sIGdvdDogJHtwYXlsb2FkLnN0YXRlfWBcbiAgICApO1xuICAgIGRlY29kZU9yRWxzZShPVkMyVG9CaXRnb1JvdW5kMVBheWxvYWQubmFtZSwgT1ZDMlRvQml0Z29Sb3VuZDFQYXlsb2FkLCBwYXlsb2FkLCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgcGF5bG9hZDogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvdmMxID0gcGF5bG9hZC5vdmNbT1ZDSW5kZXhFbnVtLk9ORV07XG4gICAgY29uc3Qgb3ZjMiA9IHBheWxvYWQub3ZjW09WQ0luZGV4RW51bS5UV09dO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJsaWNLZXkgPSBvdmMxLmdwZ1B1YktleTtcbiAgICBjb25zdCBiYWNrdXBHcGdQdWJsaWNLZXkgPSBvdmMyLmdwZ1B1YktleTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW292YzEub3ZjTXNnMSwgb3ZjMi5vdmNNc2cxXSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuTVBDdjJVdGlscy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgICAgc2VuZGVyRm4sXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgbWVzc2FnZXNcbiAgICApO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICBzdGF0ZTogS2V5Q3JlYXRpb25NUEN2MlN0YXRlRW51bS5XYWl0aW5nRm9yT1ZDMVJvdW5kMkRhdGEsXG4gICAgICB0c3NWZXJzaW9uOiBwYXlsb2FkLnRzc1ZlcnNpb24sXG4gICAgICB3YWxsZXRUeXBlOiBwYXlsb2FkLndhbGxldFR5cGUsXG4gICAgICBjb2luOiBwYXlsb2FkLmNvaW4sXG4gICAgICBvdmM6IHBheWxvYWQub3ZjLFxuICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgd2FsbGV0R3BnUHViS2V5U2lnczogcmVzdWx0LndhbGxldEdwZ1B1YktleVNpZ3MsXG4gICAgICAgIHNlc3Npb25JZDogcmVzdWx0LnNlc3Npb25JZCxcbiAgICAgICAgYml0Z29Nc2cxOiB0aGlzLk1QQ3YyVXRpbHMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKHJlc3VsdC5iaXRnb01zZzEpLFxuICAgICAgICBvdmM6IHtcbiAgICAgICAgICBbT1ZDSW5kZXhFbnVtLk9ORV06IHsgYml0Z29Ub092Y01zZzI6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvVXNlck1zZzIpIH0sXG4gICAgICAgICAgW09WQ0luZGV4RW51bS5UV09dOiB7IGJpdGdvVG9PdmNNc2cyOiB0aGlzLk1QQ3YyVXRpbHMuZm9ybWF0UDJQTWVzc2FnZShyZXN1bHQuYml0Z29Ub0JhY2t1cE1zZzIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKEJpdGdvVG9PVkMxUm91bmQxUmVzcG9uc2UubmFtZSwgQml0Z29Ub09WQzFSb3VuZDFSZXNwb25zZSwgcmVzcG9uc2UsIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyByZXNwb25zZTogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMga2V5R2VuUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogT1ZDMlRvQml0Z29Sb3VuZDJQYXlsb2FkXG4gICk6IFByb21pc2U8Qml0Z29Ub09WQzFSb3VuZDJSZXNwb25zZT4ge1xuICAgIGFzc2VydChcbiAgICAgIHBheWxvYWQuc3RhdGUgPT09IEtleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0ZvckJpdGdvUm91bmQyRGF0YSxcbiAgICAgIGBJbnZhbGlkIHN0YXRlIGZvciByb3VuZCAyLCBleHBlY3RlZDogJHtLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLldhaXRpbmdGb3JCaXRnb1JvdW5kMkRhdGF9LCBnb3Q6ICR7cGF5bG9hZC5zdGF0ZX1gXG4gICAgKTtcbiAgICBkZWNvZGVPckVsc2UoT1ZDMlRvQml0Z29Sb3VuZDJQYXlsb2FkLm5hbWUsIE9WQzJUb0JpdGdvUm91bmQyUGF5bG9hZCwgcGF5bG9hZCwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIHBheWxvYWQ6ICR7ZXJyb3JzfWApO1xuICAgIH0pO1xuICAgIGNvbnN0IG92YzEgPSBwYXlsb2FkLm92Y1tPVkNJbmRleEVudW0uT05FXTtcbiAgICBjb25zdCBvdmMyID0gcGF5bG9hZC5vdmNbT1ZDSW5kZXhFbnVtLlRXT107XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gcGF5bG9hZC5wbGF0Zm9ybS5zZXNzaW9uSWQ7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB7IHAycE1lc3NhZ2VzOiBbb3ZjMS5vdmNUb0JpdGdvTXNnMiwgb3ZjMi5vdmNUb0JpdGdvTXNnMl0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuTVBDdjJVdGlscy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMkJ5U2VuZGVyKHNlbmRlckZuLCBzZXNzaW9uSWQsIG1lc3NhZ2VzKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgc3RhdGU6IEtleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0Zvck9WQzFSb3VuZDNhRGF0YSxcbiAgICAgIHRzc1ZlcnNpb246IHBheWxvYWQudHNzVmVyc2lvbixcbiAgICAgIHdhbGxldFR5cGU6IHBheWxvYWQud2FsbGV0VHlwZSxcbiAgICAgIGNvaW46IHBheWxvYWQuY29pbixcbiAgICAgIG92YzogcGF5bG9hZC5vdmMsXG4gICAgICBwbGF0Zm9ybToge1xuICAgICAgICAuLi5wYXlsb2FkLnBsYXRmb3JtLFxuICAgICAgICBzZXNzaW9uSWQ6IHJlc3VsdC5zZXNzaW9uSWQsXG4gICAgICAgIGJpdGdvQ29tbWl0bWVudDI6IHJlc3VsdC5iaXRnb0NvbW1pdG1lbnQyLFxuICAgICAgICBvdmM6IHtcbiAgICAgICAgICBbT1ZDSW5kZXhFbnVtLk9ORV06IHtcbiAgICAgICAgICAgIC4uLnBheWxvYWQucGxhdGZvcm0ub3ZjW09WQ0luZGV4RW51bS5PTkVdLFxuICAgICAgICAgICAgYml0Z29Ub092Y01zZzM6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvVXNlck1zZzMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09WQ0luZGV4RW51bS5UV09dOiB7XG4gICAgICAgICAgICAuLi5wYXlsb2FkLnBsYXRmb3JtLm92Y1tPVkNJbmRleEVudW0uVFdPXSxcbiAgICAgICAgICAgIGJpdGdvVG9PdmNNc2czOiB0aGlzLk1QQ3YyVXRpbHMuZm9ybWF0UDJQTWVzc2FnZShyZXN1bHQuYml0Z29Ub0JhY2t1cE1zZzMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKEJpdGdvVG9PVkMxUm91bmQyUmVzcG9uc2UubmFtZSwgQml0Z29Ub09WQzFSb3VuZDJSZXNwb25zZSwgcmVzcG9uc2UsIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyByZXNwb25zZTogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMga2V5R2VuUm91bmQzQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJLZXlHZW5TZW5kRm48TVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogT1ZDMVRvQml0Z29Sb3VuZDNQYXlsb2FkXG4gICk6IFByb21pc2U8Qml0Z29Ub09WQzFSb3VuZDNSZXNwb25zZT4ge1xuICAgIGFzc2VydChcbiAgICAgIHBheWxvYWQuc3RhdGUgPT09IEtleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0ZvckJpdGdvUm91bmQzRGF0YSxcbiAgICAgIGBJbnZhbGlkIHN0YXRlIGZvciByb3VuZCAzLCBleHBlY3RlZDogJHtLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLldhaXRpbmdGb3JCaXRnb1JvdW5kM0RhdGF9LCBnb3Q6ICR7cGF5bG9hZC5zdGF0ZX1gXG4gICAgKTtcbiAgICBkZWNvZGVPckVsc2UoT1ZDMVRvQml0Z29Sb3VuZDNQYXlsb2FkLm5hbWUsIE9WQzFUb0JpdGdvUm91bmQzUGF5bG9hZCwgcGF5bG9hZCwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIHBheWxvYWQ6ICR7ZXJyb3JzfWApO1xuICAgIH0pO1xuICAgIGNvbnN0IG92YzEgPSBwYXlsb2FkLm92Y1tPVkNJbmRleEVudW0uT05FXTtcbiAgICBjb25zdCBvdmMyID0gcGF5bG9hZC5vdmNbT1ZDSW5kZXhFbnVtLlRXT107XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gcGF5bG9hZC5wbGF0Zm9ybS5zZXNzaW9uSWQ7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB7XG4gICAgICBwMnBNZXNzYWdlczogW292YzEub3ZjVG9CaXRnb01zZzMsIG92YzIub3ZjVG9CaXRnb01zZzNdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtvdmMxLm92Y01zZzQsIG92YzIub3ZjTXNnNF0sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLk1QQ3YyVXRpbHMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDNCeVNlbmRlcihzZW5kZXJGbiwgc2Vzc2lvbklkLCBtZXNzYWdlcyk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IHJlc3VsdC5jb21tb25LZXljaGFpbixcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgIHN0YXRlOiBLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLldhaXRpbmdGb3JPVkMxR2VuZXJhdGVLZXksXG4gICAgICBiaXRHb0tleUlkOiBiaXRnb0tleWNoYWluLmlkLFxuICAgICAgdHNzVmVyc2lvbjogcGF5bG9hZC50c3NWZXJzaW9uLFxuICAgICAgd2FsbGV0VHlwZTogcGF5bG9hZC53YWxsZXRUeXBlLFxuICAgICAgY29pbjogcGF5bG9hZC5jb2luLFxuICAgICAgb3ZjOiBwYXlsb2FkLm92YyxcbiAgICAgIHBsYXRmb3JtOiB7XG4gICAgICAgIC4uLnBheWxvYWQucGxhdGZvcm0sXG4gICAgICAgIGNvbW1vbktleWNoYWluOiByZXN1bHQuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvTXNnNDogdGhpcy5NUEN2MlV0aWxzLmZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShyZXN1bHQuYml0Z29Nc2c0KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBkZWNvZGVPckVsc2UoQml0Z29Ub09WQzFSb3VuZDNSZXNwb25zZS5uYW1lLCBCaXRnb1RvT1ZDMVJvdW5kM1Jlc3BvbnNlLCByZXNwb25zZSwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIHJlc3BvbnNlOiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGxvYWRDbGllbnRLZXlzKFxuICAgIGJpdGdvS2V5SWQ6IHN0cmluZyxcbiAgICB1c2VyQ29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBiYWNrdXBDb21tb25LZXljaGFpbjogc3RyaW5nXG4gICk6IFByb21pc2U8eyB1c2VyS2V5Y2hhaW46IEtleWNoYWluOyBiYWNrdXBLZXljaGFpbjogS2V5Y2hhaW47IGJpdGdvS2V5Y2hhaW46IEtleWNoYWluIH0+IHtcbiAgICBhc3NlcnQoXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4gPT09IGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgJ0NvbW1vbiBrZXljaGFpbiBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zJ1xuICAgICk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IGJpdGdvS2V5SWQgfSk7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4sICdLZXljaGFpbiBub3QgZm91bmQnKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5zb3VyY2UgPT09ICdiaXRnbycsICdUaGUga2V5Y2hhaW4gaXMgbm90IGEgQml0R28ga2V5Y2hhaW4nKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi50eXBlID09PSAndHNzJywgJ0JpdEdvIGtleWNoYWluIGlzIG5vdCBhIFRTUyBrZXljaGFpbicpO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLCAnQml0R28ga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBhIGNvbW1vbiBrZXljaGFpbicpO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluID09PSB1c2VyQ29tbW9uS2V5Y2hhaW4sICdDb21tb24ga2V5Y2hhaW4gbWlzbWF0Y2ggYmV0d2VlbiB0aGUgT1ZDcyBhbmQgQml0R28nKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG4gICAgcmV0dXJuIHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9O1xuICB9XG59XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!