PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/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 src_1 = require("../../src");
const should_1 = __importDefault(require("should"));
const testData = __importStar(require("../resources/sol"));
const utils_1 = require("../../src/lib/utils");
describe('Sol KeyPair', function () {
    const defaultSeed = { seed: testData.accountWithSeed.seed };
    describe('should create a valid KeyPair', () => {
        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);
            keyPair.getKeys().prv?.length.should.be.belowOrEqual(88);
            keyPair.getKeys().prv?.length.should.be.aboveOrEqual(76);
            keyPair.getKeys().pub.length.should.be.belowOrEqual(44);
            keyPair.getKeys().pub.length.should.be.aboveOrEqual(32);
        });
        it('from a private key', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
            should_1.default.equal(keyPair.getKeys().pub, testData.accountWithSeed.publicKey);
            should_1.default.equal(keyPair.getKeys().prv, testData.accountWithSeed.privateKey.base58);
            should_1.default.equal(keyPair.getKeys(true).pub, testData.accountWithSeed.publicKey);
            should_1.default.deepEqual(keyPair.getKeys(true).prv, testData.accountWithSeed.privateKey.uint8Array);
        });
        it('from an public key', () => {
            const keyPair = new src_1.KeyPair({ pub: testData.accountWithSeed.publicKey });
            should_1.default.equal(keyPair.getKeys().pub, testData.accountWithSeed.publicKey);
        });
        it('should always generate and regenerate valid key pairs', () => {
            for (let i = 0; i < 50; i++) {
                const keyPair = new src_1.KeyPair();
                (0, utils_1.isValidPublicKey)(keyPair.getKeys().pub).should.be.true();
                (0, utils_1.isValidAddress)(keyPair.getAddress()).should.be.true();
                const prv = keyPair.getKeys().prv;
                should_1.default.exist(prv);
                // verify key pair can be re-generated from private portion
                const regeneratedKeyPairFromPrv = new src_1.KeyPair({ prv: prv });
                regeneratedKeyPairFromPrv.getKeys().should.deepEqual(keyPair.getKeys());
                regeneratedKeyPairFromPrv.getAddress().should.equal(keyPair.getAddress());
                regeneratedKeyPairFromPrv.should.deepEqual(keyPair);
                should_1.default.exist(regeneratedKeyPairFromPrv.getKeys().prv);
                // verify key pair can be re-generated from public portion
                const pub = keyPair.getKeys().pub;
                const regeneratedKeyPairFromPub = new src_1.KeyPair({ pub: pub });
                regeneratedKeyPairFromPub.getKeys().pub.should.deepEqual(keyPair.getKeys().pub);
                regeneratedKeyPairFromPub.getAddress().should.equal(keyPair.getAddress());
                should_1.default.not.exist(regeneratedKeyPairFromPub.getKeys().prv);
            }
        });
    });
    describe('should fail to create a KeyPair', function () {
        it('from invalid options', () => {
            // @ts-expect-error Testing for an params, should throw error
            (0, should_1.default)(() => new src_1.KeyPair({ random: 'random' })).throwError('Invalid key pair options');
        });
        it('from an invalid seed', () => {
            const seed = { seed: Buffer.alloc(8) }; //  Seed should be 512 bits (64 bytes)
            assert_1.default.throws(() => new src_1.KeyPair(seed));
        });
        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));
        });
    });
    describe('getAddress', function () {
        it('should get an address', () => {
            const keyPair = new src_1.KeyPair(defaultSeed);
            const address = keyPair.getAddress();
            address.should.equal(testData.accountWithSeed.publicKey);
        });
    });
    describe('getKeys', function () {
        it('should get public keys in base58 and private in Uint8Array', () => {
            const keyPair = new src_1.KeyPair(defaultSeed);
            const { prv, pub } = keyPair.getKeys(true);
            prv?.should.deepEqual(testData.accountWithSeed.privateKey.uint8Array);
            pub.should.equal(testData.accountWithSeed.publicKey);
        });
        it('should get private and public keys base58', () => {
            const keyPair = new src_1.KeyPair(defaultSeed);
            const { prv, pub } = keyPair.getKeys();
            prv?.should.equal(testData.accountWithSeed.privateKey.base58);
            pub.should.equal(testData.accountWithSeed.publicKey);
        });
        it('should get private and public keys for a random seed', () => {
            const keyPair = new src_1.KeyPair();
            const { prv, pub } = keyPair.getKeys();
            should_1.default.exist(prv);
            should_1.default.exist(pub);
        });
    });
    describe('signMessage and verifySignature', function () {
        const message = 'test message pls ignore';
        it('should succeed to sign a msg ', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
            const signedMessage = keyPair.signMessage(message);
            signedMessage.should.deepEqual(testData.SIGNED_MESSAGE_SIGNATURE);
        });
        it('should fail to sign a msg if prv key is missing', () => {
            const keyPair = new src_1.KeyPair({ pub: testData.pubKeys.validPubKeys[0] });
            (0, should_1.default)(() => keyPair.signMessage(message)).throwError('Missing private key');
        });
    });
    describe('verifySignature', function () {
        it('should succeed to verify a signature', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
            const signature = testData.SIGNED_MESSAGE_SIGNATURE;
            const message = 'test message pls ignore';
            keyPair.verifySignature(message, signature).should.equal(true);
        });
        it('should succeed to verify a signature if the msg is a UInt8Array', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
            const signature = testData.SIGNED_MESSAGE_SIGNATURE;
            const message = new Uint8Array(Buffer.from('test message pls ignore'));
            keyPair.verifySignature(message, signature).should.equal(true);
        });
        it('should fail to verify a signature if the prv key is not correct', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 });
            const signature = testData.SIGNED_MESSAGE_SIGNATURE;
            const message = 'test message pls ignore';
            keyPair.verifySignature(message, signature).should.equal(false);
        });
        it('should fail to verify a signature if the message is not correct', () => {
            const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
            const signature = testData.SIGNED_MESSAGE_SIGNATURE;
            const message = 'incorrect msg';
            keyPair.verifySignature(message, signature).should.equal(false);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFvQztBQUNwQyxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLCtDQUF1RTtBQUV2RSxRQUFRLENBQUMsYUFBYSxFQUFFO0lBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFNUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUM3QyxFQUFFLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxFQUFFLENBQUM7WUFDOUIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0s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ZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBpc1ZhbGlkUHVibGljS2V5LCBpc1ZhbGlkQWRkcmVzcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnU29sIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRlZmF1bHRTZWVkID0geyBzZWVkOiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQuc2VlZCB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgY3JlYXRlIGEgdmFsaWQgS2V5UGFpcicsICgpID0+IHtcbiAgICBpdCgnZnJvbSBhbiBlbXB0eSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcigpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlQYWlyLmdldEtleXMoKS5wcnYpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlQYWlyLmdldEtleXMoKS5wdWIpO1xuICAgICAga2V5UGFpci5nZXRLZXlzKCkucHJ2Py5sZW5ndGguc2hvdWxkLmJlLmJlbG93T3JFcXVhbCg4OCk7XG4gICAgICBrZXlQYWlyLmdldEtleXMoKS5wcnY/Lmxlbmd0aC5zaG91bGQuYmUuYWJvdmVPckVxdWFsKDc2KTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnB1Yi5sZW5ndGguc2hvdWxkLmJlLmJlbG93T3JFcXVhbCg0NCk7XG4gICAgICBrZXlQYWlyLmdldEtleXMoKS5wdWIubGVuZ3RoLnNob3VsZC5iZS5hYm92ZU9yRXF1YWwoMzIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1YiwgdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHJ2LCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cyh0cnVlKS5wdWIsIHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChrZXlQYWlyLmdldEtleXModHJ1ZSkucHJ2LCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS51aW50OEFycmF5KTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGFuIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkgfSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHViLCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWx3YXlzIGdlbmVyYXRlIGFuZCByZWdlbmVyYXRlIHZhbGlkIGtleSBwYWlycycsICgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTA7IGkrKykge1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcbiAgICAgICAgaXNWYWxpZFB1YmxpY0tleShrZXlQYWlyLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGlzVmFsaWRBZGRyZXNzKGtleVBhaXIuZ2V0QWRkcmVzcygpKS5zaG91bGQuYmUudHJ1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gICAgICAgIHNob3VsZC5leGlzdChwcnYpO1xuXG4gICAgICAgIC8vIHZlcmlmeSBrZXkgcGFpciBjYW4gYmUgcmUtZ2VuZXJhdGVkIGZyb20gcHJpdmF0ZSBwb3J0aW9uXG4gICAgICAgIGNvbnN0IHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QcnYgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuICAgICAgICByZWdlbmVyYXRlZEtleVBhaXJGcm9tUHJ2LmdldEtleXMoKS5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIuZ2V0S2V5cygpKTtcbiAgICAgICAgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5nZXRBZGRyZXNzKCkuc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgICAgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5nZXRLZXlzKCkucHJ2KTtcblxuICAgICAgICAvLyB2ZXJpZnkga2V5IHBhaXIgY2FuIGJlIHJlLWdlbmVyYXRlZCBmcm9tIHB1YmxpYyBwb3J0aW9uXG4gICAgICAgIGNvbnN0IHB1YiA9IGtleVBhaXIuZ2V0S2V5cygpLnB1YjtcbiAgICAgICAgY29uc3QgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVB1YiA9IG5ldyBLZXlQYWlyKHsgcHViOiBwdWIgfSk7XG4gICAgICAgIHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QdWIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICAgIHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QdWIuZ2V0QWRkcmVzcygpLnNob3VsZC5lcXVhbChrZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QocmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVB1Yi5nZXRLZXlzKCkucHJ2KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Zyb20gaW52YWxpZCBvcHRpb25zJywgKCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBhbiBwYXJhbXMsIHNob3VsZCB0aHJvdyBlcnJvclxuICAgICAgc2hvdWxkKCgpID0+IG5ldyBLZXlQYWlyKHsgcmFuZG9tOiAncmFuZG9tJyB9KSkudGhyb3dFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0geyBzZWVkOiBCdWZmZXIuYWxsb2MoOCkgfTsgLy8gIFNlZWQgc2hvdWxkIGJlIDUxMiBiaXRzICg2NCBieXRlcylcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc2VlZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwMUQ2M0QnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICc4MkEzNEUnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgICAgYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRLZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IHB1YmxpYyBrZXlzIGluIGJhc2U1OCBhbmQgcHJpdmF0ZSBpbiBVaW50OEFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IHsgcHJ2LCBwdWIgfSA9IGtleVBhaXIuZ2V0S2V5cyh0cnVlKTtcbiAgICAgIHBydj8uc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS51aW50OEFycmF5KTtcbiAgICAgIHB1Yi5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBiYXNlNTgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgeyBwcnYsIHB1YiB9ID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBwcnY/LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTgpO1xuICAgICAgcHViLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHByaXZhdGUgYW5kIHB1YmxpYyBrZXlzIGZvciBhIHJhbmRvbSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKCk7XG4gICAgICBjb25zdCB7IHBydiwgcHViIH0gPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5leGlzdChwcnYpO1xuICAgICAgc2hvdWxkLmV4aXN0KHB1Yik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduTWVzc2FnZSBhbmQgdmVyaWZ5U2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHNpZ24gYSBtc2cgJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTggfSk7XG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlID0ga2V5UGFpci5zaWduTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIHNpZ25lZE1lc3NhZ2Uuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5TSUdORURfTUVTU0FHRV9TSUdOQVRVUkUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHNpZ24gYSBtc2cgaWYgcHJ2IGtleSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5wdWJLZXlzLnZhbGlkUHViS2V5c1swXSB9KTtcbiAgICAgIHNob3VsZCgoKSA9PiBrZXlQYWlyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpKS50aHJvd0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlTaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSBhIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGVzdERhdGEuU0lHTkVEX01FU1NBR0VfU0lHTkFUVVJFO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICd0ZXN0IG1lc3NhZ2UgcGxzIGlnbm9yZSc7XG4gICAgICBrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgYSBzaWduYXR1cmUgaWYgdGhlIG1zZyBpcyBhIFVJbnQ4QXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRlc3REYXRhLlNJR05FRF9NRVNTQUdFX1NJR05BVFVSRTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnKSk7XG4gICAgICBrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduYXR1cmUgaWYgdGhlIHBydiBrZXkgaXMgbm90IGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRlc3REYXRhLlNJR05FRF9NRVNTQUdFX1NJR05BVFVSRTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnO1xuICAgICAga2V5UGFpci52ZXJpZnlTaWduYXR1cmUobWVzc2FnZSwgc2lnbmF0dXJlKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25hdHVyZSBpZiB0aGUgbWVzc2FnZSBpcyBub3QgY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGVzdERhdGEuU0lHTkVEX01FU1NBR0VfU0lHTkFUVVJFO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdpbmNvcnJlY3QgbXNnJztcbiAgICAgIGtleVBhaXIudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2UsIHNpZ25hdHVyZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==

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


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