PHP WebShell

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

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * @prettier
 */
require("should");
const utxo_lib_1 = require("@bitgo/utxo-lib");
const crypto = require("crypto");
const utxolib = require("@bitgo/utxo-lib");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const assert = require("assert");
const bitgo_1 = require("../src/bitgo");
describe('ECDH utils', () => {
    function getKey(seed) {
        return utxo_lib_1.bip32.fromSeed(crypto.createHash('sha256').update(seed).digest());
    }
    it('should calculate a new ECDH sharing secret correctly', () => {
        for (let i = 0; i < 256; i++) {
            const eckey1 = getKey(`${i}.a`);
            const eckey2 = getKey(`${i}.b`);
            assert(eckey1.privateKey);
            [eckey1, utxolib.bitgo.keyutil.privateKeyBufferToECPair(eckey1.privateKey)].forEach((privateKey) => {
                const sharingKey1 = (0, sdk_core_1.getSharedSecret)(privateKey, eckey2).toString('hex');
                const sharingKey2 = (0, sdk_core_1.getSharedSecret)(eckey2, eckey1).toString('hex');
                sharingKey1.should.equal(sharingKey2);
                switch (i) {
                    case 0:
                        sharingKey1.should.eql('465ffe5745325998b83fb39631347148e24d4f21b3f3b54739c264d5c42db4b8');
                        break;
                    case 1:
                        sharingKey1.should.eql('61ff44fc1af8061a433a314b7b8be8ae352c10f62aac5887047dbaa5643b818d');
                        break;
                }
            });
        }
    });
    describe('signMessageWithDerivedEcdhKey and verifyEcdhSignature', function () {
        it('signMessageWithDerivedEcdhKey and verifyEcdhSignature are able to sign/verify the same message', function () {
            const bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'mock' });
            const myEcdhKeychain = bitgo.keychains().create();
            const message = {
                ntilde: 'bla',
                h1: 'bla',
            };
            const derivationPath = 'm/0/1';
            const signedMessage = (0, sdk_core_1.signMessageWithDerivedEcdhKey)(JSON.stringify(message), myEcdhKeychain.xprv, derivationPath);
            const hexEncodedSignedMessage = signedMessage.toString('hex');
            const derivedPubKey = utxo_lib_1.bip32.fromBase58(myEcdhKeychain.xpub).derivePath(derivationPath).publicKey;
            const isVerify = (0, sdk_core_1.verifyEcdhSignature)(JSON.stringify(message), hexEncodedSignedMessage, derivedPubKey);
            isVerify.should.be.true();
        });
    });
    it('verifyEcdhSignature fails if the message/signature or pub key is diff than the one used for signing', function () {
        const bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'mock' });
        const myEcdhKeychain = bitgo.keychains().create();
        const message = {
            ntilde: 'bla',
            h1: 'bla',
        };
        const derivationPath = 'm/0/1';
        let signedMessage = (0, sdk_core_1.signMessageWithDerivedEcdhKey)(JSON.stringify(message), myEcdhKeychain.xprv, derivationPath);
        const hexEncodedSignedMessage = signedMessage.toString('hex');
        let derivedPubKey = utxo_lib_1.bip32.fromBase58(myEcdhKeychain.xpub).derivePath(derivationPath).publicKey;
        // wrong message
        let isVerify = (0, sdk_core_1.verifyEcdhSignature)('fake message', hexEncodedSignedMessage, derivedPubKey);
        isVerify.should.be.false();
        // bad signature
        signedMessage = (0, sdk_core_1.signMessageWithDerivedEcdhKey)('fake message', myEcdhKeychain.xprv, derivationPath);
        isVerify = (0, sdk_core_1.verifyEcdhSignature)(JSON.stringify(message), signedMessage.toString('hex'), derivedPubKey);
        isVerify.should.be.false();
        // bad public key derived at a diff. path
        derivedPubKey = utxo_lib_1.bip32.fromBase58(myEcdhKeychain.xpub).derivePath('m/0/0').publicKey;
        isVerify = (0, sdk_core_1.verifyEcdhSignature)(JSON.stringify(message), signedMessage.toString('hex'), derivedPubKey);
        isVerify.should.be.false();
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZWNkaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsa0JBQWdCO0FBQ2hCLDhDQUF3QztBQUN4QyxpQ0FBaUM7QUFDakMsMkNBQTJDO0FBRTNDLDhDQUFzRztBQUN0Ryw4Q0FBNEM7QUFDNUMsaUNBQWlDO0FBQ2pDLHdDQUFxQztBQUVyQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixTQUFTLE1BQU0sQ0FBQyxJQUFZO1FBQzFCLE9BQU8sZ0JBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ2pHLE1BQU0sV0FBVyxHQUFHLElBQUEsMEJBQWUsRUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLFdBQVcsR0FB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QUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLGdCQUFnQjtRQUNoQixhQUFhLEdBQUcsSUFBQSx3Q0FBNkIsRUFBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNuRyxRQUFRLEdBQUcsSUFBQSw4QkFBbUIsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdEcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFM0IseUNBQXlDO1FBQ3pDLGFBQWEsR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRixRQUFRLEdBQUcsSUFBQSw4QkFBbUIsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdEcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQsIHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5LCB2ZXJpZnlFY2RoU2lnbmF0dXJlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vc3JjL2JpdGdvJztcblxuZGVzY3JpYmUoJ0VDREggdXRpbHMnLCAoKSA9PiB7XG4gIGZ1bmN0aW9uIGdldEtleShzZWVkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYmlwMzIuZnJvbVNlZWQoY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKSk7XG4gIH1cblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhIG5ldyBFQ0RIIHNoYXJpbmcgc2VjcmV0IGNvcnJlY3RseScsICgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBjb25zdCBlY2tleTEgPSBnZXRLZXkoYCR7aX0uYWApO1xuICAgICAgY29uc3QgZWNrZXkyID0gZ2V0S2V5KGAke2l9LmJgKTtcblxuICAgICAgYXNzZXJ0KGVja2V5MS5wcml2YXRlS2V5KTtcbiAgICAgIFtlY2tleTEsIHV0eG9saWIuYml0Z28ua2V5dXRpbC5wcml2YXRlS2V5QnVmZmVyVG9FQ1BhaXIoZWNrZXkxLnByaXZhdGVLZXkpXS5mb3JFYWNoKChwcml2YXRlS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHNoYXJpbmdLZXkxID0gZ2V0U2hhcmVkU2VjcmV0KHByaXZhdGVLZXksIGVja2V5MikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICBjb25zdCBzaGFyaW5nS2V5MiA9IGdldFNoYXJlZFNlY3JldChlY2tleTIsIGVja2V5MSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICBzaGFyaW5nS2V5MS5zaG91bGQuZXF1YWwoc2hhcmluZ0tleTIpO1xuXG4gICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHNoYXJpbmdLZXkxLnNob3VsZC5lcWwoJzQ2NWZmZTU3NDUzMjU5OThiODNmYjM5NjMxMzQ3MTQ4ZTI0ZDRmMjFiM2YzYjU0NzM5YzI2NGQ1YzQyZGI0YjgnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHNoYXJpbmdLZXkxLnNob3VsZC5lcWwoJzYxZmY0NGZjMWFmODA2MWE0MzNhMzE0YjdiOGJlOGFlMzUyYzEwZjYyYWFjNTg4NzA0N2RiYWE1NjQzYjgxOGQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSBhbmQgdmVyaWZ5RWNkaFNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkgYW5kIHZlcmlmeUVjZGhTaWduYXR1cmUgYXJlIGFibGUgdG8gc2lnbi92ZXJpZnkgdGhlIHNhbWUgbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgICAgY29uc3QgbXlFY2RoS2V5Y2hhaW4gPSBiaXRnby5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIG50aWxkZTogJ2JsYScsXG4gICAgICAgIGgxOiAnYmxhJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9ICdtLzAvMSc7XG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlID0gc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIG15RWNkaEtleWNoYWluLnhwcnYsIGRlcml2YXRpb25QYXRoKTtcbiAgICAgIGNvbnN0IGhleEVuY29kZWRTaWduZWRNZXNzYWdlID0gc2lnbmVkTWVzc2FnZS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBkZXJpdmVkUHViS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChteUVjZGhLZXljaGFpbi54cHViKS5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoKS5wdWJsaWNLZXk7XG4gICAgICBjb25zdCBpc1ZlcmlmeSA9IHZlcmlmeUVjZGhTaWduYXR1cmUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIGhleEVuY29kZWRTaWduZWRNZXNzYWdlLCBkZXJpdmVkUHViS2V5KTtcbiAgICAgIGlzVmVyaWZ5LnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCd2ZXJpZnlFY2RoU2lnbmF0dXJlIGZhaWxzIGlmIHRoZSBtZXNzYWdlL3NpZ25hdHVyZSBvciBwdWIga2V5IGlzIGRpZmYgdGhhbiB0aGUgb25lIHVzZWQgZm9yIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgY29uc3QgbXlFY2RoS2V5Y2hhaW4gPSBiaXRnby5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgbnRpbGRlOiAnYmxhJyxcbiAgICAgIGgxOiAnYmxhJyxcbiAgICB9O1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gJ20vMC8xJztcbiAgICBsZXQgc2lnbmVkTWVzc2FnZSA9IHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBteUVjZGhLZXljaGFpbi54cHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3QgaGV4RW5jb2RlZFNpZ25lZE1lc3NhZ2UgPSBzaWduZWRNZXNzYWdlLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBsZXQgZGVyaXZlZFB1YktleSA9IGJpcDMyLmZyb21CYXNlNTgobXlFY2RoS2V5Y2hhaW4ueHB1YikuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCkucHVibGljS2V5O1xuXG4gICAgLy8gd3JvbmcgbWVzc2FnZVxuICAgIGxldCBpc1ZlcmlmeSA9IHZlcmlmeUVjZGhTaWduYXR1cmUoJ2Zha2UgbWVzc2FnZScsIGhleEVuY29kZWRTaWduZWRNZXNzYWdlLCBkZXJpdmVkUHViS2V5KTtcbiAgICBpc1ZlcmlmeS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgIC8vIGJhZCBzaWduYXR1cmVcbiAgICBzaWduZWRNZXNzYWdlID0gc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkoJ2Zha2UgbWVzc2FnZScsIG15RWNkaEtleWNoYWluLnhwcnYsIGRlcml2YXRpb25QYXRoKTtcbiAgICBpc1ZlcmlmeSA9IHZlcmlmeUVjZGhTaWduYXR1cmUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHNpZ25lZE1lc3NhZ2UudG9TdHJpbmcoJ2hleCcpLCBkZXJpdmVkUHViS2V5KTtcbiAgICBpc1ZlcmlmeS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgIC8vIGJhZCBwdWJsaWMga2V5IGRlcml2ZWQgYXQgYSBkaWZmLiBwYXRoXG4gICAgZGVyaXZlZFB1YktleSA9IGJpcDMyLmZyb21CYXNlNTgobXlFY2RoS2V5Y2hhaW4ueHB1YikuZGVyaXZlUGF0aCgnbS8wLzAnKS5wdWJsaWNLZXk7XG4gICAgaXNWZXJpZnkgPSB2ZXJpZnlFY2RoU2lnbmF0dXJlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBzaWduZWRNZXNzYWdlLnRvU3RyaW5nKCdoZXgnKSwgZGVyaXZlZFB1YktleSk7XG4gICAgaXNWZXJpZnkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gIH0pO1xufSk7XG4iXX0=

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


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