PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/tss

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_core_1 = require("@bitgo/sdk-core");
const openpgp = require("openpgp");
openpgp.config.rejectCurves = new Set();
describe('commonVerifyWalletSignature', function () {
    let gpgKey1;
    let gpgKey2;
    let gpgKey3;
    let key1Actual;
    let key2Actual;
    let key3Actual;
    let gpgKey1Id;
    let gpgKey2Id;
    before(async function () {
        const keyPromises = [];
        for (let i = 0; i < 3; i++) {
            keyPromises.push(openpgp.generateKey({
                userIDs: [
                    {
                        name: `test${i}`,
                        email: `test${i}@test.com`,
                    },
                ],
                curve: 'secp256k1',
            }));
        }
        [gpgKey1, gpgKey2, gpgKey3] = await Promise.all(keyPromises);
        key1Actual = await openpgp.readKey({ armoredKey: gpgKey1.publicKey });
        key2Actual = await openpgp.readKey({ armoredKey: gpgKey2.publicKey });
        key3Actual = await openpgp.readKey({ armoredKey: gpgKey3.publicKey });
        gpgKey1Id = key1Actual.keyPacket.getFingerprint();
        gpgKey2Id = key2Actual.keyPacket.getFingerprint();
    });
    it('throws error if signature was not done by provided pub', async function () {
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, []);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key2Actual,
            commonKeychain: '',
            userKeyId: '',
            backupKeyId: '',
        })
            .should.be.rejectedWith('Invalid HSM GPG signature');
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key3Actual,
            commonKeychain: '',
            userKeyId: '',
            backupKeyId: '',
        })
            .should.be.rejectedWith('Invalid HSM GPG signature');
    });
    it('throws error when there are not exactly five raw notations in the signature', async function () {
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, [
            { name: '', value: '' },
        ]);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key1Actual,
            commonKeychain: '',
            userKeyId: '',
            backupKeyId: '',
        })
            .should.be.rejectedWith('invalid wallet signatures');
    });
    it('throws error when first raw notation does not match common keychain', async function () {
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, [
            { name: '', value: '1234' },
            { name: '', value: '' },
            { name: '', value: '' },
            { name: '', value: '' },
            { name: '', value: '' },
        ]);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key1Actual,
            commonKeychain: '5678',
            userKeyId: '',
            backupKeyId: '',
        })
            .should.be.rejectedWith('wallet signature does not match common keychain');
    });
    it('throw error when second raw notation does not match userKeyId', async function () {
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, [
            { name: '', value: '1234' },
            { name: '', value: gpgKey1Id },
            { name: '', value: '' },
            { name: '', value: '' },
            { name: '', value: '' },
        ]);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key1Actual,
            commonKeychain: '1234',
            userKeyId: gpgKey2Id,
            backupKeyId: '',
        })
            .should.be.rejectedWith('wallet signature does not match user key id');
    });
    it('throw error when third raw notation does not match backupKeyId', async function () {
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, [
            { name: '', value: '1234' },
            { name: '', value: gpgKey2Id },
            { name: '', value: gpgKey2Id },
            { name: '', value: '' },
            { name: '', value: '' },
        ]);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        await sdk_core_1.commonTssMethods
            .commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key1Actual,
            commonKeychain: '1234',
            userKeyId: gpgKey2Id,
            backupKeyId: gpgKey1Id,
        })
            .should.be.rejectedWith('wallet signature does not match backup key id');
    });
    it('succeeds and returns the raw notations', async function () {
        const rawNotations = [
            { name: '', value: '1234' },
            { name: '', value: gpgKey2Id },
            { name: '', value: gpgKey2Id },
            { name: '', value: '5678' },
            { name: '', value: '9012' },
        ];
        const signatureString = await (0, sdk_core_1.createSharedDataProof)(gpgKey1.privateKey, gpgKey2.publicKey, rawNotations);
        const signature = await openpgp.readKey({ armoredKey: signatureString });
        const returnedRawNotations = await sdk_core_1.commonTssMethods.commonVerifyWalletSignature({
            walletSignature: signature,
            bitgoPub: key1Actual,
            commonKeychain: '1234',
            userKeyId: gpgKey2Id,
            backupKeyId: gpgKey2Id,
        });
        returnedRawNotations.length.should.equal(rawNotations.length);
        for (let i = 0; i < rawNotations.length; i++) {
            Buffer.from(returnedRawNotations[i].value).toString().should.equal(rawNotations[i].value);
        }
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L3Rzcy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBMEU7QUFDMUUsbUNBQW1DO0FBRW5DLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFeEMsUUFBUSxDQUFDLDZCQUE2QixFQUFFO0lBQ3RDLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLE9BQU8sQ0FBQztJQUNaLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxVQUFVLENBQUM7SUFDZixJQUFJLFVBQVUsQ0FBQztJQUNmLElBQUksU0FBUyxDQUFDO0lBQ2QsSUFBSSxTQUFTLENBQUM7SUFFZCxNQUFNLENBQUMsS0FBSztRQUNWLE1BQU0sV0FBVyxHQUFpRCxFQUFFLENBQUM7UUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQ2QsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDbEIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTt3QkFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXO3FCQUMzQjtpQkFDRjtnQkFDRCxLQUFLLEVBQUUsV0FBVzthQUNuQixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFDRCxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEUs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QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2hhcmVkRGF0YVByb29mLCBjb21tb25Uc3NNZXRob2RzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5cbm9wZW5wZ3AuY29uZmlnLnJlamVjdEN1cnZlcyA9IG5ldyBTZXQoKTtcblxuZGVzY3JpYmUoJ2NvbW1vblZlcmlmeVdhbGxldFNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGdwZ0tleTE7XG4gIGxldCBncGdLZXkyO1xuICBsZXQgZ3BnS2V5MztcbiAgbGV0IGtleTFBY3R1YWw7XG4gIGxldCBrZXkyQWN0dWFsO1xuICBsZXQga2V5M0FjdHVhbDtcbiAgbGV0IGdwZ0tleTFJZDtcbiAgbGV0IGdwZ0tleTJJZDtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGtleVByb21pc2VzOiBQcm9taXNlPG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPj5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBrZXlQcm9taXNlcy5wdXNoKFxuICAgICAgICBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICB1c2VySURzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGB0ZXN0JHtpfWAsXG4gICAgICAgICAgICAgIGVtYWlsOiBgdGVzdCR7aX1AdGVzdC5jb21gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGN1cnZlOiAnc2VjcDI1NmsxJyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIFtncGdLZXkxLCBncGdLZXkyLCBncGdLZXkzXSA9IGF3YWl0IFByb21pc2UuYWxsKGtleVByb21pc2VzKTtcbiAgICBrZXkxQWN0dWFsID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogZ3BnS2V5MS5wdWJsaWNLZXkgfSk7XG4gICAga2V5MkFjdHVhbCA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGdwZ0tleTIucHVibGljS2V5IH0pO1xuICAgIGtleTNBY3R1YWwgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBncGdLZXkzLnB1YmxpY0tleSB9KTtcbiAgICBncGdLZXkxSWQgPSBrZXkxQWN0dWFsLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpO1xuICAgIGdwZ0tleTJJZCA9IGtleTJBY3R1YWwua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgZXJyb3IgaWYgc2lnbmF0dXJlIHdhcyBub3QgZG9uZSBieSBwcm92aWRlZCBwdWInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gYXdhaXQgY3JlYXRlU2hhcmVkRGF0YVByb29mKGdwZ0tleTEucHJpdmF0ZUtleSwgZ3BnS2V5Mi5wdWJsaWNLZXksIFtdKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBzaWduYXR1cmVTdHJpbmcgfSk7XG5cbiAgICBhd2FpdCBjb21tb25Uc3NNZXRob2RzXG4gICAgICAuY29tbW9uVmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgICAgd2FsbGV0U2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICAgIGJpdGdvUHViOiBrZXkyQWN0dWFsLFxuICAgICAgICBjb21tb25LZXljaGFpbjogJycsXG4gICAgICAgIHVzZXJLZXlJZDogJycsXG4gICAgICAgIGJhY2t1cEtleUlkOiAnJyxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnSW52YWxpZCBIU00gR1BHIHNpZ25hdHVyZScpO1xuXG4gICAgYXdhaXQgY29tbW9uVHNzTWV0aG9kc1xuICAgICAgLmNvbW1vblZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICAgIHdhbGxldFNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICAgICAgICBiaXRnb1B1Yjoga2V5M0FjdHVhbCxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46ICcnLFxuICAgICAgICB1c2VyS2V5SWQ6ICcnLFxuICAgICAgICBiYWNrdXBLZXlJZDogJycsXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgSFNNIEdQRyBzaWduYXR1cmUnKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciB3aGVuIHRoZXJlIGFyZSBub3QgZXhhY3RseSBmaXZlIHJhdyBub3RhdGlvbnMgaW4gdGhlIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBhd2FpdCBjcmVhdGVTaGFyZWREYXRhUHJvb2YoZ3BnS2V5MS5wcml2YXRlS2V5LCBncGdLZXkyLnB1YmxpY0tleSwgW1xuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6ICcnIH0sXG4gICAgXSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogc2lnbmF0dXJlU3RyaW5nIH0pO1xuXG4gICAgYXdhaXQgY29tbW9uVHNzTWV0aG9kc1xuICAgICAgLmNvbW1vblZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICAgIHdhbGxldFNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICAgICAgICBiaXRnb1B1Yjoga2V5MUFjdHVhbCxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46ICcnLFxuICAgICAgICB1c2VyS2V5SWQ6ICcnLFxuICAgICAgICBiYWNrdXBLZXlJZDogJycsXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciB3aGVuIGZpcnN0IHJhdyBub3RhdGlvbiBkb2VzIG5vdCBtYXRjaCBjb21tb24ga2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gYXdhaXQgY3JlYXRlU2hhcmVkRGF0YVByb29mKGdwZ0tleTEucHJpdmF0ZUtleSwgZ3BnS2V5Mi5wdWJsaWNLZXksIFtcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiAnMTIzNCcgfSxcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiAnJyB9LFxuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6ICcnIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJycgfSxcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiAnJyB9LFxuICAgIF0pO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHNpZ25hdHVyZVN0cmluZyB9KTtcblxuICAgIGF3YWl0IGNvbW1vblRzc01ldGhvZHNcbiAgICAgIC5jb21tb25WZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgICB3YWxsZXRTaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgICAgICAgYml0Z29QdWI6IGtleTFBY3R1YWwsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiAnNTY3OCcsXG4gICAgICAgIHVzZXJLZXlJZDogJycsXG4gICAgICAgIGJhY2t1cEtleUlkOiAnJyxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnd2FsbGV0IHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBjb21tb24ga2V5Y2hhaW4nKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93IGVycm9yIHdoZW4gc2Vjb25kIHJhdyBub3RhdGlvbiBkb2VzIG5vdCBtYXRjaCB1c2VyS2V5SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gYXdhaXQgY3JlYXRlU2hhcmVkRGF0YVByb29mKGdwZ0tleTEucHJpdmF0ZUtleSwgZ3BnS2V5Mi5wdWJsaWNLZXksIFtcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiAnMTIzNCcgfSxcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiBncGdLZXkxSWQgfSxcbiAgICAgIHsgbmFtZTogJycsIHZhbHVlOiAnJyB9LFxuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6ICcnIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJycgfSxcbiAgICBdKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBzaWduYXR1cmVTdHJpbmcgfSk7XG5cbiAgICBhd2FpdCBjb21tb25Uc3NNZXRob2RzXG4gICAgICAuY29tbW9uVmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgICAgd2FsbGV0U2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICAgIGJpdGdvUHViOiBrZXkxQWN0dWFsLFxuICAgICAgICBjb21tb25LZXljaGFpbjogJzEyMzQnLFxuICAgICAgICB1c2VyS2V5SWQ6IGdwZ0tleTJJZCxcbiAgICAgICAgYmFja3VwS2V5SWQ6ICcnLFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd3YWxsZXQgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIHVzZXIga2V5IGlkJyk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvdyBlcnJvciB3aGVuIHRoaXJkIHJhdyBub3RhdGlvbiBkb2VzIG5vdCBtYXRjaCBiYWNrdXBLZXlJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBhd2FpdCBjcmVhdGVTaGFyZWREYXRhUHJvb2YoZ3BnS2V5MS5wcml2YXRlS2V5LCBncGdLZXkyLnB1YmxpY0tleSwgW1xuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6ICcxMjM0JyB9LFxuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6IGdwZ0tleTJJZCB9LFxuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6IGdwZ0tleTJJZCB9LFxuICAgICAgeyBuYW1lOiAnJywgdmFsdWU6ICcnIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJycgfSxcbiAgICBdKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBzaWduYXR1cmVTdHJpbmcgfSk7XG5cbiAgICBhd2FpdCBjb21tb25Uc3NNZXRob2RzXG4gICAgICAuY29tbW9uVmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgICAgd2FsbGV0U2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICAgIGJpdGdvUHViOiBrZXkxQWN0dWFsLFxuICAgICAgICBjb21tb25LZXljaGFpbjogJzEyMzQnLFxuICAgICAgICB1c2VyS2V5SWQ6IGdwZ0tleTJJZCxcbiAgICAgICAgYmFja3VwS2V5SWQ6IGdwZ0tleTFJZCxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnd2FsbGV0IHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBiYWNrdXAga2V5IGlkJyk7XG4gIH0pO1xuXG4gIGl0KCdzdWNjZWVkcyBhbmQgcmV0dXJucyB0aGUgcmF3IG5vdGF0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByYXdOb3RhdGlvbnMgPSBbXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJzEyMzQnIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogZ3BnS2V5MklkIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogZ3BnS2V5MklkIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJzU2NzgnIH0sXG4gICAgICB7IG5hbWU6ICcnLCB2YWx1ZTogJzkwMTInIH0sXG4gICAgXTtcbiAgICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBhd2FpdCBjcmVhdGVTaGFyZWREYXRhUHJvb2YoZ3BnS2V5MS5wcml2YXRlS2V5LCBncGdLZXkyLnB1YmxpY0tleSwgcmF3Tm90YXRpb25zKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBzaWduYXR1cmVTdHJpbmcgfSk7XG5cbiAgICBjb25zdCByZXR1cm5lZFJhd05vdGF0aW9ucyA9IGF3YWl0IGNvbW1vblRzc01ldGhvZHMuY29tbW9uVmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICAgICAgYml0Z29QdWI6IGtleTFBY3R1YWwsXG4gICAgICBjb21tb25LZXljaGFpbjogJzEyMzQnLFxuICAgICAgdXNlcktleUlkOiBncGdLZXkySWQsXG4gICAgICBiYWNrdXBLZXlJZDogZ3BnS2V5MklkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuZWRSYXdOb3RhdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbChyYXdOb3RhdGlvbnMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd05vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgQnVmZmVyLmZyb20ocmV0dXJuZWRSYXdOb3RhdGlvbnNbaV0udmFsdWUpLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHJhd05vdGF0aW9uc1tpXS52YWx1ZSk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19

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


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