PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo
Просмотр файла: keyutil.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const src_1 = require("../../src");
const assert = require('assert');
const crypto = require('crypto');
const keyutil_1 = require("../../src/bitgo/keyutil");
const noble_ecc_1 = require("../../src/noble_ecc");
describe('privateKeyBufferFromECPair', function () {
it('pads short private keys', function () {
const keyPair = noble_ecc_1.ECPair.fromPrivateKey(Buffer.from('0000000000000000000000000000000000000000000000000000000000000001', 'hex'));
assert.strictEqual((0, keyutil_1.privateKeyBufferFromECPair)(keyPair).length, 32);
assert.strictEqual((0, keyutil_1.privateKeyBufferFromECPair)(keyPair).toString('hex'), '0000000000000000000000000000000000000000000000000000000000000001');
});
it('does not pad 32 bytes private keys', function () {
const hexString = 'a000000000000000000000000000000000000000000000000000000000000000';
const keyPair = noble_ecc_1.ECPair.fromPrivateKey(Buffer.from(hexString, 'hex'));
assert.strictEqual((0, keyutil_1.privateKeyBufferFromECPair)(keyPair).length, 32);
assert.strictEqual((0, keyutil_1.privateKeyBufferFromECPair)(keyPair).toString('hex'), hexString);
});
it('throws if passed value is not ecpair', function () {
assert.throws(function () {
(0, keyutil_1.privateKeyBufferFromECPair)({});
}, new RegExp('invalid argument ecpair'));
});
});
describe('privateKeyBufferToECPair', function () {
it('constructs an ECPair from a random private key buffer', function () {
const prvKeyBuffer = crypto.randomBytes(32);
const ecPair = (0, keyutil_1.privateKeyBufferToECPair)(prvKeyBuffer);
const ecPairPrvBuffer = (0, keyutil_1.privateKeyBufferFromECPair)(ecPair);
assert.strictEqual(Buffer.compare(ecPairPrvBuffer, prvKeyBuffer), 0);
});
it('throws if the private key buffer is not a buffer', function () {
assert.throws(function () {
(0, keyutil_1.privateKeyBufferToECPair)('not a buffer');
}, new RegExp('invalid private key buffer'));
});
it('throws if the private key buffer is not 32 bytes', function () {
assert.throws(function () {
(0, keyutil_1.privateKeyBufferToECPair)(Buffer.alloc(31, 0x00));
}, new RegExp('invalid private key buffer'));
assert.throws(function () {
(0, keyutil_1.privateKeyBufferToECPair)(Buffer.alloc(33, 0x00));
}, new RegExp('invalid private key buffer'));
});
});
describe('convertExtendedKeyNetwork', function () {
const prvKeyBuffer = crypto.randomBytes(32);
const mainnetHdNode = noble_ecc_1.bip32.fromSeed(prvKeyBuffer, src_1.networks.bitcoin);
const testnetHdNode = noble_ecc_1.bip32.fromSeed(prvKeyBuffer, src_1.networks.testnet);
it('should return the same extended key if fromNetwork and targetNetwork are the same', () => {
const extendedKey = mainnetHdNode.toBase58();
const result = (0, keyutil_1.convertExtendedKeyNetwork)(extendedKey, src_1.networks.bitcoin, src_1.networks.bitcoin);
assert.strictEqual(result, extendedKey);
});
it('should change the network from mainnet to testnet for a neutered (public) key', () => {
const extendedKey = mainnetHdNode.neutered().toBase58();
const expectedKey = (0, keyutil_1.convertExtendedKeyNetwork)(extendedKey, src_1.networks.bitcoin, src_1.networks.testnet);
const testnetHdNodeFromExpected = noble_ecc_1.bip32.fromBase58(expectedKey, src_1.networks.testnet);
assert.deepStrictEqual(testnetHdNodeFromExpected.publicKey, mainnetHdNode.neutered().publicKey);
});
it('should change the network from testnet to mainnet for a neutered (public) key', () => {
const extendedKey = testnetHdNode.neutered().toBase58();
const expectedKey = (0, keyutil_1.convertExtendedKeyNetwork)(extendedKey, src_1.networks.testnet, src_1.networks.bitcoin);
const mainnetHdNodeFromExpected = noble_ecc_1.bip32.fromBase58(expectedKey, src_1.networks.bitcoin);
assert.deepStrictEqual(mainnetHdNodeFromExpected.publicKey, testnetHdNode.neutered().publicKey);
});
it('should change the network from mainnet to testnet for a non-neutered (private) key', () => {
const extendedKey = mainnetHdNode.toBase58();
const expectedKey = (0, keyutil_1.convertExtendedKeyNetwork)(extendedKey, src_1.networks.bitcoin, src_1.networks.testnet);
const testnetHdNodeFromExpected = noble_ecc_1.bip32.fromBase58(expectedKey, src_1.networks.testnet);
assert.deepStrictEqual(testnetHdNodeFromExpected.privateKey, mainnetHdNode.privateKey);
});
it('should change the network from testnet to mainnet for a non-neutered (private) key', () => {
const extendedKey = testnetHdNode.toBase58();
const expectedKey = (0, keyutil_1.convertExtendedKeyNetwork)(extendedKey, src_1.networks.testnet, src_1.networks.bitcoin);
const mainnetHdNodeFromExpected = noble_ecc_1.bip32.fromBase58(expectedKey, src_1.networks.bitcoin);
assert.deepStrictEqual(mainnetHdNodeFromExpected.privateKey, testnetHdNode.privateKey);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5dXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvYml0Z28va2V5dXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUFxQztBQUVyQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBR2pDLHFEQUlpQztBQUNqQyxtREFBb0Q7QUFFcEQsUUFBUSxDQUFDLDRCQUE0QixFQUFFO0lBQ3JDLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1QixNQUFNLE9BQU8sR0FBRyxrQkFBTSxDQUFDLGNBQWMsQ0FDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxLQUFLLENBQUMsQ0FDdkYsQ0FBQztRQUNGLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSxvQ0FBMEIsRUFBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsSUFBQSxvQ0FBMEIsRUFBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ25ELGtFQUFrRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDdkMsTUFBTSxTQUFTLEdBQUcsa0VBQWtFLENBQUM7UUFDckYsTUFBTSxPQUFPLEdBQUcsa0JBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsb0NBQTBCLEVBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSxvQ0FBMEIsRUFBQyxPQUFPLENBQUMsQ0FBQyxR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SCxFQUFFLENBQUMsb0ZBQW9GLEVBQUUsR0FBRyxFQUFFO1FBQzVGLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUF5QixFQUFDLFdBQVcsRUFBRSxjQUFRLENBQUMsT0FBTyxFQUFFLGNBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRixNQUFNLHlCQUF5QixHQUFHLGlCQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxjQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEYsTUFBTSxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuZXR3b3JrcyB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmltcG9ydCB7IEVDUGFpckludGVyZmFjZSB9IGZyb20gJ2VjcGFpcic7XG5pbXBvcnQge1xuICBjb252ZXJ0RXh0ZW5kZWRLZXlOZXR3b3JrLFxuICBwcml2YXRlS2V5QnVmZmVyRnJvbUVDUGFpcixcbiAgcHJpdmF0ZUtleUJ1ZmZlclRvRUNQYWlyLFxufSBmcm9tICcuLi8uLi9zcmMvYml0Z28va2V5dXRpbCc7XG5pbXBvcnQgeyBiaXAzMiwgRUNQYWlyIH0gZnJvbSAnLi4vLi4vc3JjL25vYmxlX2VjYyc7XG5cbmRlc2NyaWJlKCdwcml2YXRlS2V5QnVmZmVyRnJvbUVDUGFpcicsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3BhZHMgc2hvcnQgcHJpdmF0ZSBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGtleVBhaXIgPSBFQ1BhaXIuZnJvbVByaXZhdGVLZXkoXG4gICAgICBCdWZmZXIuZnJvbSgnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScsICdoZXgnKVxuICAgICk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByaXZhdGVLZXlCdWZmZXJGcm9tRUNQYWlyKGtleVBhaXIpLmxlbmd0aCwgMzIpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIHByaXZhdGVLZXlCdWZmZXJGcm9tRUNQYWlyKGtleVBhaXIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJ1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBwYWQgMzIgYnl0ZXMgcHJpdmF0ZSBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGhleFN0cmluZyA9ICdhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCBrZXlQYWlyID0gRUNQYWlyLmZyb21Qcml2YXRlS2V5KEJ1ZmZlci5mcm9tKGhleFN0cmluZywgJ2hleCcpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocHJpdmF0ZUtleUJ1ZmZlckZyb21FQ1BhaXIoa2V5UGFpcikubGVuZ3RoLCAzMik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByaXZhdGVLZXlCdWZmZXJGcm9tRUNQYWlyKGtleVBhaXIpLnRvU3RyaW5nKCdoZXgnKSwgaGV4U3RyaW5nKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBpZiBwYXNzZWQgdmFsdWUgaXMgbm90IGVjcGFpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByaXZhdGVLZXlCdWZmZXJGcm9tRUNQYWlyKHt9IGFzIEVDUGFpckludGVyZmFjZSk7XG4gICAgfSwgbmV3IFJlZ0V4cCgnaW52YWxpZCBhcmd1bWVudCBlY3BhaXInKSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdwcml2YXRlS2V5QnVmZmVyVG9FQ1BhaXInLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdjb25zdHJ1Y3RzIGFuIEVDUGFpciBmcm9tIGEgcmFuZG9tIHByaXZhdGUga2V5IGJ1ZmZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcnZLZXlCdWZmZXIgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpO1xuICAgIGNvbnN0IGVjUGFpciA9IHByaXZhdGVLZXlCdWZmZXJUb0VDUGFpcihwcnZLZXlCdWZmZXIpO1xuICAgIGNvbnN0IGVjUGFpclBydkJ1ZmZlciA9IHByaXZhdGVLZXlCdWZmZXJGcm9tRUNQYWlyKGVjUGFpcik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKEJ1ZmZlci5jb21wYXJlKGVjUGFpclBydkJ1ZmZlciwgcHJ2S2V5QnVmZmVyKSwgMCk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgaWYgdGhlIHByaXZhdGUga2V5IGJ1ZmZlciBpcyBub3QgYSBidWZmZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICBwcml2YXRlS2V5QnVmZmVyVG9FQ1BhaXIoJ25vdCBhIGJ1ZmZlcicgYXMgYW55KTtcbiAgICB9LCBuZXcgUmVnRXhwKCdpbnZhbGlkIHByaXZhdGUga2V5IGJ1ZmZlcicpKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBpZiB0aGUgcHJpdmF0ZSBrZXkgYnVmZmVyIGlzIG5vdCAzMiBieXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHByaXZhdGVLZXlCdWZmZXJUb0VDUGFpcihCdWZmZXIuYWxsb2MoMzEsIDB4MDApKTtcbiAgICB9LCBuZXcgUmVnRXhwKCdpbnZhbGlkIHByaXZhdGUga2V5IGJ1ZmZlcicpKTtcblxuICAgIGFzc2VydC50aHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgcHJpdmF0ZUtleUJ1ZmZlclRvRUNQYWlyKEJ1ZmZlci5hbGxvYygzMywgMHgwMCkpO1xuICAgIH0sIG5ldyBSZWdFeHAoJ2ludmFsaWQgcHJpdmF0ZSBrZXkgYnVmZmVyJykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY29udmVydEV4dGVuZGVkS2V5TmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcHJ2S2V5QnVmZmVyID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKTtcbiAgY29uc3QgbWFpbm5ldEhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHBydktleUJ1ZmZlciwgbmV0d29ya3MuYml0Y29pbik7XG4gIGNvbnN0IHRlc3RuZXRIZE5vZGUgPSBiaXAzMi5mcm9tU2VlZChwcnZLZXlCdWZmZXIsIG5ldHdvcmtzLnRlc3RuZXQpO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGV4dGVuZGVkIGtleSBpZiBmcm9tTmV0d29yayBhbmQgdGFyZ2V0TmV0d29yayBhcmUgdGhlIHNhbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5kZWRLZXkgPSBtYWlubmV0SGROb2RlLnRvQmFzZTU4KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEV4dGVuZGVkS2V5TmV0d29yayhleHRlbmRlZEtleSwgbmV0d29ya3MuYml0Y29pbiwgbmV0d29ya3MuYml0Y29pbik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgZXh0ZW5kZWRLZXkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoYW5nZSB0aGUgbmV0d29yayBmcm9tIG1haW5uZXQgdG8gdGVzdG5ldCBmb3IgYSBuZXV0ZXJlZCAocHVibGljKSBrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5kZWRLZXkgPSBtYWlubmV0SGROb2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICBjb25zdCBleHBlY3RlZEtleSA9IGNvbnZlcnRFeHRlbmRlZEtleU5ldHdvcmsoZXh0ZW5kZWRLZXksIG5ldHdvcmtzLmJpdGNvaW4sIG5ldHdvcmtzLnRlc3RuZXQpO1xuICAgIGNvbnN0IHRlc3RuZXRIZE5vZGVGcm9tRXhwZWN0ZWQgPSBiaXAzMi5mcm9tQmFzZTU4KGV4cGVjdGVkS2V5LCBuZXR3b3Jrcy50ZXN0bmV0KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRlc3RuZXRIZE5vZGVGcm9tRXhwZWN0ZWQucHVibGljS2V5LCBtYWlubmV0SGROb2RlLm5ldXRlcmVkKCkucHVibGljS2V5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjaGFuZ2UgdGhlIG5ldHdvcmsgZnJvbSB0ZXN0bmV0IHRvIG1haW5uZXQgZm9yIGEgbmV1dGVyZWQgKHB1YmxpYykga2V5JywgKCkgPT4ge1xuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gdGVzdG5ldEhkTm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gICAgY29uc3QgZXhwZWN0ZWRLZXkgPSBjb252ZXJ0RXh0ZW5kZWRLZXlOZXR3b3JrKGV4dGVuZGVkS2V5LCBuZXR3b3Jrcy50ZXN0bmV0LCBuZXR3b3Jrcy5iaXRjb2luKTtcbiAgICBjb25zdCBtYWlubmV0SGROb2RlRnJvbUV4cGVjdGVkID0gYmlwMzIuZnJvbUJhc2U1OChleHBlY3RlZEtleSwgbmV0d29ya3MuYml0Y29pbik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChtYWlubmV0SGROb2RlRnJvbUV4cGVjdGVkLnB1YmxpY0tleSwgdGVzdG5ldEhkTm9kZS5uZXV0ZXJlZCgpLnB1YmxpY0tleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hhbmdlIHRoZSBuZXR3b3JrIGZyb20gbWFpbm5ldCB0byB0ZXN0bmV0IGZvciBhIG5vbi1uZXV0ZXJlZCAocHJpdmF0ZSkga2V5JywgKCkgPT4ge1xuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gbWFpbm5ldEhkTm9kZS50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGV4cGVjdGVkS2V5ID0gY29udmVydEV4dGVuZGVkS2V5TmV0d29yayhleHRlbmRlZEtleSwgbmV0d29ya3MuYml0Y29pbiwgbmV0d29ya3MudGVzdG5ldCk7XG4gICAgY29uc3QgdGVzdG5ldEhkTm9kZUZyb21FeHBlY3RlZCA9IGJpcDMyLmZyb21CYXNlNTgoZXhwZWN0ZWRLZXksIG5ldHdvcmtzLnRlc3RuZXQpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodGVzdG5ldEhkTm9kZUZyb21FeHBlY3RlZC5wcml2YXRlS2V5LCBtYWlubmV0SGROb2RlLnByaXZhdGVLZXkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoYW5nZSB0aGUgbmV0d29yayBmcm9tIHRlc3RuZXQgdG8gbWFpbm5ldCBmb3IgYSBub24tbmV1dGVyZWQgKHByaXZhdGUpIGtleScsICgpID0+IHtcbiAgICBjb25zdCBleHRlbmRlZEtleSA9IHRlc3RuZXRIZE5vZGUudG9CYXNlNTgoKTtcbiAgICBjb25zdCBleHBlY3RlZEtleSA9IGNvbnZlcnRFeHRlbmRlZEtleU5ldHdvcmsoZXh0ZW5kZWRLZXksIG5ldHdvcmtzLnRlc3RuZXQsIG5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGNvbnN0IG1haW5uZXRIZE5vZGVGcm9tRXhwZWN0ZWQgPSBiaXAzMi5mcm9tQmFzZTU4KGV4cGVjdGVkS2V5LCBuZXR3b3Jrcy5iaXRjb2luKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG1haW5uZXRIZE5vZGVGcm9tRXhwZWN0ZWQucHJpdmF0ZUtleSwgdGVzdG5ldEhkTm9kZS5wcml2YXRlS2V5KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!