PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-trx/dist/test/unit
Просмотр файла: keyPair.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_test_1 = require("node:test");
const assert_1 = __importDefault(require("assert"));
const src_1 = require("../../src");
const sdk_core_1 = require("@bitgo/sdk-core");
(0, node_test_1.describe)('Trx KeyPair', function () {
const defaultSeed = { seed: Buffer.alloc(32) };
(0, node_test_1.describe)('should create a KeyPair', function () {
(0, node_test_1.it)('from an xpub', () => {
const source = {
pub: 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY',
};
const keyPair = new src_1.KeyPair(source);
const defaultKeys = keyPair.getKeys();
assert_1.default.equal(defaultKeys.prv, undefined);
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
const extendedKeys = keyPair.getExtendedKeys();
assert_1.default.equal(extendedKeys.xprv, undefined);
assert_1.default.equal(extendedKeys.xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
});
(0, node_test_1.it)('from an xprv', () => {
const source = {
prv: 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2',
};
const keyPair = new src_1.KeyPair(source);
const defaultKeys = keyPair.getKeys();
assert_1.default.equal(defaultKeys.prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
const extendedKeys = keyPair.getExtendedKeys();
assert_1.default.equal(extendedKeys.xprv, 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2');
assert_1.default.equal(extendedKeys.xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
});
(0, node_test_1.it)('from an uncompressed public key', () => {
const source = {
pub: '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355',
};
const keyPair = new src_1.KeyPair(source);
const defaultKeys = keyPair.getKeys();
assert_1.default.equal(defaultKeys.prv, undefined);
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
assert_1.default.throws(() => keyPair.getExtendedKeys());
});
(0, node_test_1.it)('from a compressed public key', () => {
const source = {
pub: '03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275',
};
const keyPair = new src_1.KeyPair(source);
const defaultKeys = keyPair.getKeys();
assert_1.default.equal(defaultKeys.prv, undefined);
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
assert_1.default.throws(() => keyPair.getExtendedKeys());
});
(0, node_test_1.it)('from a raw private key', () => {
const source = {
prv: '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA',
};
const keyPair = new src_1.KeyPair(source);
const defaultKeys = keyPair.getKeys();
assert_1.default.equal(defaultKeys.prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
assert_1.default.equal(defaultKeys.pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
assert_1.default.throws(() => keyPair.getExtendedKeys());
});
});
(0, node_test_1.describe)('should fail to create a KeyPair', function () {
(0, node_test_1.it)('from an invalid seed', () => {
const seed = { seed: Buffer.alloc(8) }; // Seed should be at least 128 bits (16 bytes, not 8)
assert_1.default.throws(() => new src_1.KeyPair(seed));
});
(0, node_test_1.it)('from an invalid public key', () => {
const source = {
pub: '01D63D',
};
assert_1.default.throws(() => new src_1.KeyPair(source));
});
(0, node_test_1.it)('from an invalid private key', () => {
const source = {
prv: '82A34E',
};
assert_1.default.throws(() => new src_1.KeyPair(source));
});
});
(0, node_test_1.describe)('getAddress', function () {
(0, node_test_1.it)('should get a new hex address', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const address = keyPair.getAddress(sdk_core_1.AddressFormat.hex);
assert_1.default.equal(address, '41EB317B9F2E0891D66C061DDC3F5EE7ED42D70A44');
});
(0, node_test_1.it)('should get a new base58 address', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const address = keyPair.getAddress(sdk_core_1.AddressFormat.base58);
assert_1.default.equal(address, 'TXQo5GgQQJYVzreX5yzqqVnzBQP5Ek2iQW');
});
(0, node_test_1.it)('should get a new base58 address by default', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const address = keyPair.getAddress();
assert_1.default.equal(address, 'TXQo5GgQQJYVzreX5yzqqVnzBQP5Ek2iQW');
});
});
(0, node_test_1.describe)('getKeys', function () {
(0, node_test_1.it)('should get private and public keys in the protocol default format', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const { prv, pub } = keyPair.getKeys();
assert_1.default.equal(prv, '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA');
assert_1.default.equal(pub, '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355');
});
(0, node_test_1.it)('should get private and public keys for a random seed', () => {
const keyPair = new src_1.KeyPair();
const { prv, pub } = keyPair.getKeys();
assert_1.default.ok(prv);
assert_1.default.ok(pub);
});
});
(0, node_test_1.describe)('getExtendedKeys', function () {
(0, node_test_1.it)('should get the keys in extended format', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const { xprv, xpub } = keyPair.getExtendedKeys();
assert_1.default.equal(xprv, 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2');
assert_1.default.equal(xpub, 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY');
});
(0, node_test_1.it)('should get the keys in extended format for a random seed', () => {
const keyPair = new src_1.KeyPair();
const { xprv, xpub } = keyPair.getExtendedKeys();
assert_1.default.ok(xprv);
assert_1.default.ok(xpub);
});
});
(0, node_test_1.describe)('signMessage', function () {
(0, node_test_1.it)('should sign a message', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const message = 'Hello world';
const signature = keyPair.signMessage(message);
assert_1.default.equal(signature.toString('hex'), '83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b');
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), true);
});
(0, node_test_1.it)('should fail if there is no private key', () => {
const source = {
pub: '03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275',
};
const keyPair = new src_1.KeyPair(source);
const message = 'Hello world';
assert_1.default.throws(() => keyPair.signMessage(message));
});
});
(0, node_test_1.describe)('verifySignature', function () {
(0, node_test_1.it)('should be true for a properly signed message', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const message = 'Hello world';
const signature = Buffer.from('83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b', 'hex');
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), true);
});
(0, node_test_1.it)('should be false for a message with the wrong signature', () => {
const keyPair = new src_1.KeyPair(defaultSeed);
const message = 'Not the message you expected';
const signature = Buffer.from('83eec642ee0215c5d645393fa3f23b586bfe426ec4206fdb2b66d1620d308a4d4df57cc10cc4207c4a4c19e2ed572229bb1afe26ca0018eaed2bd2a44528f67d1b', 'hex');
assert_1.default.strictEqual(keyPair.verifySignature(message, signature), false);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUU1QixtQ0FBb0M7QUFDcEMsOENBQWdEO0FBRWhELElBQUEsb0JBQVEsRUFBQyxhQUFhLEVBQUU7SUFDdEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRS9DLElBQUEsb0JBQVEsRUFBQyx5QkFBeUIsRUFBRTtRQUNsQyxJQUFBLGNBQUUsRUFBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1lBQ3RCLE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsRUFBRSxpSEFBaUg7YUFDdkgsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUNWLFdBQVcsQ0FBQyxHQUFHLEVBQ2Ysb0lBQW9JLENBQ3JJLENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FDVixZQUFZLENBQUMsSUFBSSxFQUNqQixpSEFBaUgsQ0FDbEgsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRztnQkFDYixHQUFHLEVB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QUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDM0Isb0lBQW9JLEVBQ3BJLEtBQUssQ0FDTixDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBBZGRyZXNzRm9ybWF0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ1RyeCBLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkZWZhdWx0U2VlZCA9IHsgc2VlZDogQnVmZmVyLmFsbG9jKDMyKSB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgY3JlYXRlIGEgS2V5UGFpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZnJvbSBhbiB4cHViJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjRmhDdmRoVEFmcEVFRFY1OG9xRHZ2NjVZTkhDNjg2Tk5zNEtiSDhZWlFKV1ZtcmZidmU3YUFWSHp4dzhiS0Z4QTdNTGVESzZCYkxma0UzYnFrdkhMUGdhR0hIdFlHZVknLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihzb3VyY2UpO1xuICAgICAgY29uc3QgZGVmYXVsdEtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWZhdWx0S2V5cy5wcnYsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGRlZmF1bHRLZXlzLnB1YixcbiAgICAgICAgJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleHRlbmRlZEtleXMgPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4dGVuZGVkS2V5cy54cHJ2LCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBleHRlbmRlZEtleXMueHB1YixcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGaEN2ZGhUQWZwRUVEVjU4b3FEdnY2NVlOSEM2ODZOTnM0S2JIOFlaUUpXVm1yZmJ2ZTdhQVZIenh3OGJLRnhBN01MZURLNkJiTGZrRTNicWt2SExQZ2FHSEh0WUdlWSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiB4cHJ2JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICd4cHJ2OXMyMVpyUUgxNDNLM0Q4VFhmdkFKZ0hWZlRFZVFOVzVZczl3WnRuVVprcVB6RnpTamJFSnJXQzF2WjRHblhDdlI3clFMMlVGWDNSU3VZZVU5TXJFUm0xWEJ2QUNvdzdjMzZ2bno1aVl5ajInLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihzb3VyY2UpO1xuICAgICAgY29uc3QgZGVmYXVsdEtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWZhdWx0S2V5cy5wcnYhLCAnODJBMzRFMzg2N0VBN0VBNEU2N0UyNzg2NUQ1MDBBRTg0RTk4RDA3QUIxQkFCMDY1MjZGMEE1QTVGRENDM0VCQScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBkZWZhdWx0S2V5cy5wdWIsXG4gICAgICAgICcwNEQ2M0Q5RkQ5RkQ3NzJBOTg5QzVCOTBFREIzNzcxNjQwNjM1NkU5ODI3M0U1Rjk4RkUwNzY1MjI0N0EzQTgyNzUwM0U5NDhBMkZEQkY3NEE5ODFENEUwMDU0RjEwRURBNzA0MkMyRDQ2OUY0NDQ3M0QzQzc3OTFFMEUzMjZFMzU1J1xuICAgICAgKTtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRLZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZXh0ZW5kZWRLZXlzLnhwcnYhLFxuICAgICAgICAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZXh0ZW5kZWRLZXlzLnhwdWIsXG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRmhDdmRoVEFmcEVFRFY1OG9xRHZ2NjVZTkhDNjg2Tk5zNEtiSDhZWlFKV1ZtcmZidmU3YUFWSHp4dzhiS0Z4QTdNTGVESzZCYkxma0UzYnFrdkhMUGdhR0hIdFlHZVknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHB1YjogJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihzb3VyY2UpO1xuICAgICAgY29uc3QgZGVmYXVsdEtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWZhdWx0S2V5cy5wcnYsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGRlZmF1bHRLZXlzLnB1YixcbiAgICAgICAgJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYSBjb21wcmVzc2VkIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB7XG4gICAgICAgIHB1YjogJzAzRDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NScsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRLZXlzLnBydiwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZGVmYXVsdEtleXMucHViLFxuICAgICAgICAnMDRENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1MDNFOTQ4QTJGREJGNzRBOTgxRDRFMDA1NEYxMEVEQTcwNDJDMkQ0NjlGNDQ0NzNEM0M3NzkxRTBFMzI2RTM1NSdcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhIHJhdyBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHJ2OiAnODJBMzRFMzg2N0VBN0VBNEU2N0UyNzg2NUQ1MDBBRTg0RTk4RDA3QUIxQkFCMDY1MjZGMEE1QTVGRENDM0VCQScsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHNvdXJjZSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRLZXlzLnBydiEsICc4MkEzNEUzODY3RUE3RUE0RTY3RTI3ODY1RDUwMEFFODRFOThEMDdBQjFCQUIwNjUyNkYwQTVBNUZEQ0MzRUJBJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGRlZmF1bHRLZXlzLnB1YixcbiAgICAgICAgJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gY3JlYXRlIGEgS2V5UGFpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0geyBzZWVkOiBCdWZmZXIuYWxsb2MoOCkgfTsgLy8gIFNlZWQgc2hvdWxkIGJlIGF0IGxlYXN0IDEyOCBiaXRzICgxNiBieXRlcywgbm90IDgpXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IG5ldyBLZXlQYWlyKHNlZWQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGFuIGludmFsaWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHViOiAnMDFENjNEJyxcbiAgICAgIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IG5ldyBLZXlQYWlyKHNvdXJjZSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHJ2OiAnODJBMzRFJyxcbiAgICAgIH07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IG5ldyBLZXlQYWlyKHNvdXJjZSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCBhIG5ldyBoZXggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKEFkZHJlc3NGb3JtYXQuaGV4KTtcbiAgICAgIGFzc2VydC5lcXVhbChhZGRyZXNzLCAnNDFFQjMxN0I5RjJFMDg5MUQ2NkMwNjFEREMzRjVFRTdFRDQyRDcwQTQ0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIG5ldyBiYXNlNTggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKEFkZHJlc3NGb3JtYXQuYmFzZTU4KTtcbiAgICAgIGFzc2VydC5lcXVhbChhZGRyZXNzLCAnVFhRbzVHZ1FRSllWenJlWDV5enFxVm56QlFQNUVrMmlRVycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBuZXcgYmFzZTU4IGFkZHJlc3MgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYWRkcmVzcywgJ1RYUW81R2dRUUpZVnpyZVg1eXpxcVZuekJRUDVFazJpUVcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgcHJpdmF0ZSBhbmQgcHVibGljIGtleXMgaW4gdGhlIHByb3RvY29sIGRlZmF1bHQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IHsgcHJ2LCBwdWIgfSA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBydiEsICc4MkEzNEUzODY3RUE3RUE0RTY3RTI3ODY1RDUwMEFFODRFOThEMDdBQjFCQUIwNjUyNkYwQTVBNUZEQ0MzRUJBJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHB1YixcbiAgICAgICAgJzA0RDYzRDlGRDlGRDc3MkE5ODlDNUI5MEVEQjM3NzE2NDA2MzU2RTk4MjczRTVGOThGRTA3NjUyMjQ3QTNBODI3NTAzRTk0OEEyRkRCRjc0QTk4MUQ0RTAwNTRGMTBFREE3MDQyQzJENDY5RjQ0NDczRDNDNzc5MUUwRTMyNkUzNTUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgcHJpdmF0ZSBhbmQgcHVibGljIGtleXMgZm9yIGEgcmFuZG9tIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcbiAgICAgIGNvbnN0IHsgcHJ2LCBwdWIgfSA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgYXNzZXJ0Lm9rKHBydik7XG4gICAgICBhc3NlcnQub2socHViKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEV4dGVuZGVkS2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCB0aGUga2V5cyBpbiBleHRlbmRlZCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgeyB4cHJ2LCB4cHViIH0gPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB4cHJ2ISxcbiAgICAgICAgJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMidcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHhwdWIsXG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRmhDdmRoVEFmcEVFRFY1OG9xRHZ2NjVZTkhDNjg2Tk5zNEtiSDhZWlFKV1ZtcmZidmU3YUFWSHp4dzhiS0Z4QTdNTGVESzZCYkxma0UzYnFrdkhMUGdhR0hIdFlHZVknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGtleXMgaW4gZXh0ZW5kZWQgZm9ybWF0ICBmb3IgYSByYW5kb20gc2VlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcigpO1xuICAgICAgY29uc3QgeyB4cHJ2LCB4cHViIH0gPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgYXNzZXJ0Lm9rKHhwcnYpO1xuICAgICAgYXNzZXJ0Lm9rKHhwdWIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbk1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcihkZWZhdWx0U2VlZCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0hlbGxvIHdvcmxkJztcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHNpZ25hdHVyZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICc4M2VlYzY0MmVlMDIxNWM1ZDY0NTM5M2ZhM2YyM2I1ODZiZmU0MjZlYzQyMDZmZGIyYjY2ZDE2MjBkMzA4YTRkNGRmNTdjYzEwY2M0MjA3YzRhNGMxOWUyZWQ1NzIyMjliYjFhZmUyNmNhMDAxOGVhZWQyYmQyYTQ0NTI4ZjY3ZDFiJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGVyZSBpcyBubyBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHtcbiAgICAgICAgcHViOiAnMDNENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1JyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoc291cmNlKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSGVsbG8gd29ybGQnO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeVNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJlIHRydWUgZm9yIGEgcHJvcGVybHkgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdIZWxsbyB3b3JsZCc7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgJzgzZWVjNjQyZWUwMjE1YzVkNjQ1MzkzZmEzZjIzYjU4NmJmZTQyNmVjNDIwNmZkYjJiNjZkMTYyMGQzMDhhNGQ0ZGY1N2NjMTBjYzQyMDdjNGE0YzE5ZTJlZDU3MjIyOWJiMWFmZTI2Y2EwMDE4ZWFlZDJiZDJhNDQ1MjhmNjdkMWInLFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgZmFsc2UgZm9yIGEgbWVzc2FnZSB3aXRoIHRoZSB3cm9uZyBzaWduYXR1cmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdOb3QgdGhlIG1lc3NhZ2UgeW91IGV4cGVjdGVkJztcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAnODNlZWM2NDJlZTAyMTVjNWQ2NDUzOTNmYTNmMjNiNTg2YmZlNDI2ZWM0MjA2ZmRiMmI2NmQxNjIwZDMwOGE0ZDRkZjU3Y2MxMGNjNDIwN2M0YTRjMTllMmVkNTcyMjI5YmIxYWZlMjZjYTAwMThlYWVkMmJkMmE0NDUyOGY2N2QxYicsXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGtleVBhaXIudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2UsIHNpZ25hdHVyZSksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!