UNPKG

bitgo

Version:
78 lines 13.6 kB
"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.ok(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZWNkaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsa0JBQWdCO0FBQ2hCLDhDQUF3QztBQUN4QyxpQ0FBaUM7QUFDakMsMkNBQTJDO0FBRTNDLDhDQUFzRztBQUN0Ryw4Q0FBNEM7QUFDNUMsaUNBQWlDO0FBQ2pDLHdDQUFxQztBQUVyQyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixTQUFTLE1BQU0sQ0FBQyxJQUFZO1FBQzFCLE9BQU8sZ0JBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNqRyxNQUFNLFdBQVcsR0FBRyxJQUFBLDBCQUFlLEVBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEUsTUFB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QUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzQixnQkFBZ0I7UUFDaEIsYUFBYSxHQUFHLElBQUEsd0NBQTZCLEVBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbkcsUUFBUSxHQUFHLElBQUEsOEJBQW1CLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLHlDQUF5QztRQUN6QyxhQUFhLEdBQUcsZ0JBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDcEYsUUFBUSxHQUFHLElBQUEsOEJBQW1CLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0LCBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleSwgdmVyaWZ5RWNkaFNpZ25hdHVyZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uL3NyYy9iaXRnbyc7XG5cbmRlc2NyaWJlKCdFQ0RIIHV0aWxzJywgKCkgPT4ge1xuICBmdW5jdGlvbiBnZXRLZXkoc2VlZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGJpcDMyLmZyb21TZWVkKGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VlZCkuZGlnZXN0KCkpO1xuICB9XG5cbiAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgYSBuZXcgRUNESCBzaGFyaW5nIHNlY3JldCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgY29uc3QgZWNrZXkxID0gZ2V0S2V5KGAke2l9LmFgKTtcbiAgICAgIGNvbnN0IGVja2V5MiA9IGdldEtleShgJHtpfS5iYCk7XG5cbiAgICAgIGFzc2VydC5vayhlY2tleTEucHJpdmF0ZUtleSk7XG4gICAgICBbZWNrZXkxLCB1dHhvbGliLmJpdGdvLmtleXV0aWwucHJpdmF0ZUtleUJ1ZmZlclRvRUNQYWlyKGVja2V5MS5wcml2YXRlS2V5KV0uZm9yRWFjaCgocHJpdmF0ZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBzaGFyaW5nS2V5MSA9IGdldFNoYXJlZFNlY3JldChwcml2YXRlS2V5LCBlY2tleTIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgY29uc3Qgc2hhcmluZ0tleTIgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXkyLCBlY2tleTEpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgc2hhcmluZ0tleTEuc2hvdWxkLmVxdWFsKHNoYXJpbmdLZXkyKTtcblxuICAgICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBzaGFyaW5nS2V5MS5zaG91bGQuZXFsKCc0NjVmZmU1NzQ1MzI1OTk4YjgzZmIzOTYzMTM0NzE0OGUyNGQ0ZjIxYjNmM2I1NDczOWMyNjRkNWM0MmRiNGI4Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBzaGFyaW5nS2V5MS5zaG91bGQuZXFsKCc2MWZmNDRmYzFhZjgwNjFhNDMzYTMxNGI3YjhiZThhZTM1MmMxMGY2MmFhYzU4ODcwNDdkYmFhNTY0M2I4MThkJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbk1lc3NhZ2VXaXRoRGVyaXZlZEVjZGhLZXkgYW5kIHZlcmlmeUVjZGhTaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3NpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5IGFuZCB2ZXJpZnlFY2RoU2lnbmF0dXJlIGFyZSBhYmxlIHRvIHNpZ24vdmVyaWZ5IHRoZSBzYW1lIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICAgIGNvbnN0IG15RWNkaEtleWNoYWluID0gYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBudGlsZGU6ICdibGEnLFxuICAgICAgICBoMTogJ2JsYScsXG4gICAgICB9O1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAnbS8wLzEnO1xuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZSA9IHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBteUVjZGhLZXljaGFpbi54cHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gICAgICBjb25zdCBoZXhFbmNvZGVkU2lnbmVkTWVzc2FnZSA9IHNpZ25lZE1lc3NhZ2UudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YktleSA9IGJpcDMyLmZyb21CYXNlNTgobXlFY2RoS2V5Y2hhaW4ueHB1YikuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCkucHVibGljS2V5O1xuICAgICAgY29uc3QgaXNWZXJpZnkgPSB2ZXJpZnlFY2RoU2lnbmF0dXJlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBoZXhFbmNvZGVkU2lnbmVkTWVzc2FnZSwgZGVyaXZlZFB1YktleSk7XG4gICAgICBpc1ZlcmlmeS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgndmVyaWZ5RWNkaFNpZ25hdHVyZSBmYWlscyBpZiB0aGUgbWVzc2FnZS9zaWduYXR1cmUgb3IgcHViIGtleSBpcyBkaWZmIHRoYW4gdGhlIG9uZSB1c2VkIGZvciBzaWduaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGNvbnN0IG15RWNkaEtleWNoYWluID0gYml0Z28ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIG50aWxkZTogJ2JsYScsXG4gICAgICBoMTogJ2JsYScsXG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9ICdtLzAvMSc7XG4gICAgbGV0IHNpZ25lZE1lc3NhZ2UgPSBzaWduTWVzc2FnZVdpdGhEZXJpdmVkRWNkaEtleShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgbXlFY2RoS2V5Y2hhaW4ueHBydiwgZGVyaXZhdGlvblBhdGgpO1xuICAgIGNvbnN0IGhleEVuY29kZWRTaWduZWRNZXNzYWdlID0gc2lnbmVkTWVzc2FnZS50b1N0cmluZygnaGV4Jyk7XG4gICAgbGV0IGRlcml2ZWRQdWJLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KG15RWNkaEtleWNoYWluLnhwdWIpLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgpLnB1YmxpY0tleTtcblxuICAgIC8vIHdyb25nIG1lc3NhZ2VcbiAgICBsZXQgaXNWZXJpZnkgPSB2ZXJpZnlFY2RoU2lnbmF0dXJlKCdmYWtlIG1lc3NhZ2UnLCBoZXhFbmNvZGVkU2lnbmVkTWVzc2FnZSwgZGVyaXZlZFB1YktleSk7XG4gICAgaXNWZXJpZnkuc2hvdWxkLmJlLmZhbHNlKCk7XG5cbiAgICAvLyBiYWQgc2lnbmF0dXJlXG4gICAgc2lnbmVkTWVzc2FnZSA9IHNpZ25NZXNzYWdlV2l0aERlcml2ZWRFY2RoS2V5KCdmYWtlIG1lc3NhZ2UnLCBteUVjZGhLZXljaGFpbi54cHJ2LCBkZXJpdmF0aW9uUGF0aCk7XG4gICAgaXNWZXJpZnkgPSB2ZXJpZnlFY2RoU2lnbmF0dXJlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBzaWduZWRNZXNzYWdlLnRvU3RyaW5nKCdoZXgnKSwgZGVyaXZlZFB1YktleSk7XG4gICAgaXNWZXJpZnkuc2hvdWxkLmJlLmZhbHNlKCk7XG5cbiAgICAvLyBiYWQgcHVibGljIGtleSBkZXJpdmVkIGF0IGEgZGlmZi4gcGF0aFxuICAgIGRlcml2ZWRQdWJLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KG15RWNkaEtleWNoYWluLnhwdWIpLmRlcml2ZVBhdGgoJ20vMC8wJykucHVibGljS2V5O1xuICAgIGlzVmVyaWZ5ID0gdmVyaWZ5RWNkaFNpZ25hdHVyZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgc2lnbmVkTWVzc2FnZS50b1N0cmluZygnaGV4JyksIGRlcml2ZWRQdWJLZXkpO1xuICAgIGlzVmVyaWZ5LnNob3VsZC5iZS5mYWxzZSgpO1xuICB9KTtcbn0pO1xuIl19