PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-eth/dist/test/unit

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const src_1 = require("../../src");
const nacl = __importStar(require("tweetnacl"));
describe('Eth KeyPair', function () {
    // these are all encodings of the same key so the test suite will show that they we can interchange between them
    const xprv = 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2';
    const xpub = 'xpub661MyMwAqRbcFhCvdhTAfpEEDV58oqDvv65YNHC686NNs4KbH8YZQJWVmrfbve7aAVHzxw8bKFxA7MLeDK6BbLfkE3bqkvHLPgaGHHtYGeY';
    const prv = '82A34E3867EA7EA4E67E27865D500AE84E98D07AB1BAB06526F0A5A5FDCC3EBA';
    const pub = '03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275';
    const uncompressedPub = '04D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A827503E948A2FDBF74A981D4E0054F10EDA7042C2D469F44473D3C7791E0E326E355';
    const address = '0xeb317b9f2e0891d66c061ddc3f5ee7ed42d70a44';
    const invalidPrivateKeyErrorMessage = 'Unsupported private key';
    describe('should create a KeyPair', function () {
        it('from an xpub', () => {
            const keyPair = new src_1.KeyPair({ pub: xpub });
            const defaultKeys = keyPair.getKeys();
            should_1.default.not.exist(defaultKeys.prv);
            defaultKeys.pub.should.equal('03D63D9FD9FD772A989C5B90EDB37716406356E98273E5F98FE07652247A3A8275');
            const extendedKeys = keyPair.getExtendedKeys();
            should_1.default.not.exist(extendedKeys.xprv);
            extendedKeys.xpub.should.equal(xpub);
        });
        it('from an xprv', () => {
            const keyPair = new src_1.KeyPair({ prv: xprv });
            const defaultKeys = keyPair.getKeys();
            defaultKeys.prv.should.equal(prv);
            defaultKeys.pub.should.equal(pub);
            const extendedKeys = keyPair.getExtendedKeys();
            extendedKeys.xprv.should.equal(xprv);
            extendedKeys.xpub.should.equal(xpub);
        });
        it('from an uncompressed public key', () => {
            const keyPair = new src_1.KeyPair({ pub: uncompressedPub });
            const defaultKeys = keyPair.getKeys();
            should_1.default.not.exist(defaultKeys.prv);
            defaultKeys.pub.should.equal(uncompressedPub);
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
        it('from a compressed public key', () => {
            const keyPair = new src_1.KeyPair({ pub });
            const defaultKeys = keyPair.getKeys();
            should_1.default.not.exist(defaultKeys.prv);
            defaultKeys.pub.should.equal(uncompressedPub);
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
        it('from a raw private key', () => {
            const keyPair = new src_1.KeyPair({ prv });
            const defaultKeys = keyPair.getKeys();
            defaultKeys.prv.should.equal(prv);
            defaultKeys.pub.should.equal(uncompressedPub);
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
        it('from an empty value', () => {
            const keyPair = new src_1.KeyPair();
            should_1.default.exists(keyPair.getKeys().prv);
            should_1.default.exists(keyPair.getKeys().pub);
            should_1.default.equal(keyPair.getKeys().prv.length, 64);
            should_1.default.equal(keyPair.getKeys().pub.length, 66);
        });
        it('from seed', () => {
            const seed = nacl.randomBytes(64);
            const keyPair = new src_1.KeyPair({ seed: Buffer.from(seed) });
            keyPair.getKeys().should.have.property('pub');
            keyPair.getKeys().should.have.property('prv');
        });
    });
    describe('should fail to create a KeyPair', function () {
        it('from an invalid public key', () => {
            const source = {
                pub: '01D63D',
            };
            assert_1.default.throws(() => new src_1.KeyPair(source));
        });
        it('from an invalid private key', () => {
            const source = {
                prv: '82A34E',
            };
            assert_1.default.throws(() => new src_1.KeyPair(source));
            assert_1.default.throws(() => new src_1.KeyPair({ prv: prv + pub }), (e) => e.message === invalidPrivateKeyErrorMessage);
        });
    });
    describe('getAddress', function () {
        it('should get an address from xprv', () => {
            const keyPair = new src_1.KeyPair({ prv: xprv });
            const calculatedAddress = keyPair.getAddress();
            calculatedAddress.should.equal(address);
        });
        it('should get an address from xpub', () => {
            const keyPair = new src_1.KeyPair({ pub: xpub });
            const calculatedAddress = keyPair.getAddress();
            calculatedAddress.should.equal(address);
        });
        it('should get an address from prv', () => {
            const keyPair = new src_1.KeyPair({ prv });
            const calculatedAddress = keyPair.getAddress();
            calculatedAddress.should.equal(address);
        });
        it('should get an address from pub', () => {
            const keyPair = new src_1.KeyPair({ pub });
            const calculatedAddress = keyPair.getAddress();
            calculatedAddress.should.equal(address);
        });
        it('should get an address from uncompressed pub', () => {
            const keyPair = new src_1.KeyPair({ pub: uncompressedPub });
            const calculatedAddress = keyPair.getAddress();
            calculatedAddress.should.equal(address);
        });
    });
    describe('getExtendedKeys', function () {
        it('should get the keys in extended format from xprv', () => {
            const keyPair = new src_1.KeyPair({ prv: xprv });
            const { xprv: calculatedXprv, xpub: calculatedXpub } = keyPair.getExtendedKeys();
            calculatedXprv.should.equal(xprv);
            calculatedXpub.should.equal(xpub);
        });
        it('should get the keys in extended format from xpub', () => {
            const keyPair = new src_1.KeyPair({ pub: xpub });
            const { xprv: calculatedXprv, xpub: calculatedXpub } = keyPair.getExtendedKeys();
            should_1.default.not.exist(calculatedXprv);
            calculatedXpub.should.equal(xpub);
        });
        it('should not be able to get keys from prv', () => {
            const keyPair = new src_1.KeyPair({ prv });
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
        it('should get the keys in extended format from pub', () => {
            const keyPair = new src_1.KeyPair({ pub });
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
        it('should get the keys in extended format from uncompressed pub', () => {
            const keyPair = new src_1.KeyPair({ pub: uncompressedPub });
            assert_1.default.throws(() => keyPair.getExtendedKeys());
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1QixtQ0FBb0M7QUFDcEMsZ0RBQWtDO0FBRWxDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsZ0hBQWdIO0lBQ2hILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLG9FQUFvRSxDQUFDO0lBQ2pGLE1BQU0sZUFBZSxHQUNuQixvSUFBb0ksQ0FBQztJQUN2SSxNQUFNLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztJQUM3RCxNQUFNLDZCQUE2QixHQUFHLHlCQUF5QixDQUFDO0lBRWhFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBRW5HLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMvQyxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLFlB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QUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuXG5kZXNjcmliZSgnRXRoIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gIC8vIHRoZXNlIGFyZSBhbGwgZW5jb2RpbmdzIG9mIHRoZSBzYW1lIGtleSBzbyB0aGUgdGVzdCBzdWl0ZSB3aWxsIHNob3cgdGhhdCB0aGV5IHdlIGNhbiBpbnRlcmNoYW5nZSBiZXR3ZWVuIHRoZW1cbiAgY29uc3QgeHBydiA9XG4gICAgJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMic7XG4gIGNvbnN0IHhwdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRmhDdmRoVEFmcEVFRFY1OG9xRHZ2NjVZTkhDNjg2Tk5zNEtiSDhZWlFKV1ZtcmZidmU3YUFWSHp4dzhiS0Z4QTdNTGVESzZCYkxma0UzYnFrdkhMUGdhR0hIdFlHZVknO1xuICBjb25zdCBwcnYgPSAnODJBMzRFMzg2N0VBN0VBNEU2N0UyNzg2NUQ1MDBBRTg0RTk4RDA3QUIxQkFCMDY1MjZGMEE1QTVGRENDM0VCQSc7XG4gIGNvbnN0IHB1YiA9ICcwM0Q2M0Q5RkQ5RkQ3NzJBOTg5QzVCOTBFREIzNzcxNjQwNjM1NkU5ODI3M0U1Rjk4RkUwNzY1MjI0N0EzQTgyNzUnO1xuICBjb25zdCB1bmNvbXByZXNzZWRQdWIgPVxuICAgICcwNEQ2M0Q5RkQ5RkQ3NzJBOTg5QzVCOTBFREIzNzcxNjQwNjM1NkU5ODI3M0U1Rjk4RkUwNzY1MjI0N0EzQTgyNzUwM0U5NDhBMkZEQkY3NEE5ODFENEUwMDU0RjEwRURBNzA0MkMyRDQ2OUY0NDQ3M0QzQzc3OTFFMEUzMjZFMzU1JztcbiAgY29uc3QgYWRkcmVzcyA9ICcweGViMzE3YjlmMmUwODkxZDY2YzA2MWRkYzNmNWVlN2VkNDJkNzBhNDQnO1xuICBjb25zdCBpbnZhbGlkUHJpdmF0ZUtleUVycm9yTWVzc2FnZSA9ICdVbnN1cHBvcnRlZCBwcml2YXRlIGtleSc7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBjcmVhdGUgYSBLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdmcm9tIGFuIHhwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHhwdWIgfSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChkZWZhdWx0S2V5cy5wcnYpO1xuICAgICAgZGVmYXVsdEtleXMucHViLnNob3VsZC5lcXVhbCgnMDNENjNEOUZEOUZENzcyQTk4OUM1QjkwRURCMzc3MTY0MDYzNTZFOTgyNzNFNUY5OEZFMDc2NTIyNDdBM0E4Mjc1Jyk7XG5cbiAgICAgIGNvbnN0IGV4dGVuZGVkS2V5cyA9IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGV4dGVuZGVkS2V5cy54cHJ2KTtcbiAgICAgIGV4dGVuZGVkS2V5cy54cHViLnNob3VsZC5lcXVhbCh4cHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGFuIHhwcnYnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHhwcnYgfSk7XG4gICAgICBjb25zdCBkZWZhdWx0S2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgICAgZGVmYXVsdEtleXMucHJ2IS5zaG91bGQuZXF1YWwocHJ2KTtcbiAgICAgIGRlZmF1bHRLZXlzLnB1Yi5zaG91bGQuZXF1YWwocHViKTtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRLZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICAgIGV4dGVuZGVkS2V5cy54cHJ2IS5zaG91bGQuZXF1YWwoeHBydik7XG4gICAgICBleHRlbmRlZEtleXMueHB1Yi5zaG91bGQuZXF1YWwoeHB1Yik7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiB1bmNvbXByZXNzZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1YjogdW5jb21wcmVzc2VkUHViIH0pO1xuICAgICAgY29uc3QgZGVmYXVsdEtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoZGVmYXVsdEtleXMucHJ2KTtcbiAgICAgIGRlZmF1bHRLZXlzLnB1Yi5zaG91bGQuZXF1YWwodW5jb21wcmVzc2VkUHViKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGEgY29tcHJlc3NlZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHViIH0pO1xuICAgICAgY29uc3QgZGVmYXVsdEtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoZGVmYXVsdEtleXMucHJ2KTtcbiAgICAgIGRlZmF1bHRLZXlzLnB1Yi5zaG91bGQuZXF1YWwodW5jb21wcmVzc2VkUHViKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhIHJhdyBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydiB9KTtcbiAgICAgIGNvbnN0IGRlZmF1bHRLZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBkZWZhdWx0S2V5cy5wcnYhLnNob3VsZC5lcXVhbChwcnYpO1xuICAgICAgZGVmYXVsdEtleXMucHViLnNob3VsZC5lcXVhbCh1bmNvbXByZXNzZWRQdWIpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGtleVBhaXIuZ2V0RXh0ZW5kZWRLZXlzKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gZW1wdHkgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcbiAgICAgIHNob3VsZC5leGlzdHMoa2V5UGFpci5nZXRLZXlzKCkucHJ2KTtcbiAgICAgIHNob3VsZC5leGlzdHMoa2V5UGFpci5nZXRLZXlzKCkucHViKTtcbiAgICAgIHNob3VsZC5lcXVhbChrZXlQYWlyLmdldEtleXMoKS5wcnYhLmxlbmd0aCwgNjQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1Yi5sZW5ndGgsIDY2KTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0gbmFjbC5yYW5kb21CeXRlcyg2NCk7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBzZWVkOiBCdWZmZXIuZnJvbShzZWVkKSB9KTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcnYnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwMUQ2M0QnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICc4MkEzNEUnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBuZXcgS2V5UGFpcih7IHBydjogcHJ2ICsgcHViIH0pLFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGludmFsaWRQcml2YXRlS2V5RXJyb3JNZXNzYWdlXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCBhbiBhZGRyZXNzIGZyb20geHBydicsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogeHBydiB9KTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRBZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgICBjYWxjdWxhdGVkQWRkcmVzcy5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhbiBhZGRyZXNzIGZyb20geHB1YicsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1YjogeHB1YiB9KTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRBZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgICBjYWxjdWxhdGVkQWRkcmVzcy5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhbiBhZGRyZXNzIGZyb20gcHJ2JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2IH0pO1xuICAgICAgY29uc3QgY2FsY3VsYXRlZEFkZHJlc3MgPSBrZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgICAgIGNhbGN1bGF0ZWRBZGRyZXNzLnNob3VsZC5lcXVhbChhZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGFkZHJlc3MgZnJvbSBwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWIgfSk7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkQWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgICAgY2FsY3VsYXRlZEFkZHJlc3Muc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYW4gYWRkcmVzcyBmcm9tIHVuY29tcHJlc3NlZCBwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHVuY29tcHJlc3NlZFB1YiB9KTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRBZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgICBjYWxjdWxhdGVkQWRkcmVzcy5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRFeHRlbmRlZEtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGtleXMgaW4gZXh0ZW5kZWQgZm9ybWF0IGZyb20geHBydicsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogeHBydiB9KTtcbiAgICAgIGNvbnN0IHsgeHBydjogY2FsY3VsYXRlZFhwcnYsIHhwdWI6IGNhbGN1bGF0ZWRYcHViIH0gPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgICAgY2FsY3VsYXRlZFhwcnYhLnNob3VsZC5lcXVhbCh4cHJ2KTtcbiAgICAgIGNhbGN1bGF0ZWRYcHViLnNob3VsZC5lcXVhbCh4cHViKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBrZXlzIGluIGV4dGVuZGVkIGZvcm1hdCBmcm9tIHhwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHhwdWIgfSk7XG4gICAgICBjb25zdCB7IHhwcnY6IGNhbGN1bGF0ZWRYcHJ2LCB4cHViOiBjYWxjdWxhdGVkWHB1YiB9ID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoY2FsY3VsYXRlZFhwcnYpO1xuICAgICAgY2FsY3VsYXRlZFhwdWIuc2hvdWxkLmVxdWFsKHhwdWIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgYmUgYWJsZSB0byBnZXQga2V5cyBmcm9tIHBydicsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydiB9KTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBrZXlzIGluIGV4dGVuZGVkIGZvcm1hdCBmcm9tIHB1YicsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1YiB9KTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBrZXlzIGluIGV4dGVuZGVkIGZvcm1hdCBmcm9tIHVuY29tcHJlc3NlZCBwdWInLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHVuY29tcHJlc3NlZFB1YiB9KTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==

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


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