Skip to content

Commit a1d5eea

Browse files
Merge pull request #6393 from BitGo/BTC-0.bip32utils
feat(utxo-core): modernize bip32utils module
2 parents 64cf695 + 3c35f37 commit a1d5eea

File tree

4 files changed

+37
-42
lines changed

4 files changed

+37
-42
lines changed

modules/bitgo/test/unit/bip32util.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

modules/utxo-core/package.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@
5555
"@bitgo/utxo-lib": "^11.6.1",
5656
"@bitgo/wasm-miniscript": "2.0.0-beta.7",
5757
"bip174": "npm:@bitgo-forks/[email protected]",
58-
"bitcoinjs-message": "npm:@bitgo-forks/[email protected]",
59-
"lodash": "^4.17.15"
60-
},
61-
"devDependencies": {
62-
"@types/lodash": "^4.14.151"
58+
"bitcoinjs-message": "npm:@bitgo-forks/[email protected]"
6359
},
6460
"gitHead": "18e460ddf02de2dbf13c2aa243478188fb539f0c"
6561
}

modules/utxo-core/src/bip32utils.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import * as utxolib from '@bitgo/utxo-lib';
2-
import * as _ from 'lodash';
32
import * as bitcoinMessage from 'bitcoinjs-message';
43
import { BIP32Interface } from '@bitgo/utxo-lib';
54
/**
65
* bip32-aware wrapper around bitcoin-message package
76
* @see {bitcoinMessage.sign}
87
*/
98
export function signMessage(
10-
message: string,
9+
message: string | Buffer,
1110
privateKey: BIP32Interface | Buffer,
1211
network: { messagePrefix: string }
1312
): Buffer {
@@ -17,7 +16,7 @@ export function signMessage(
1716
throw new Error(`must provide privateKey`);
1817
}
1918
}
20-
if (!_.isObject(network) || !_.isString(network.messagePrefix)) {
19+
if (network === null || typeof network !== 'object' || typeof network.messagePrefix !== 'string') {
2120
throw new Error(`invalid argument 'network'`);
2221
}
2322
const compressed = true;
@@ -29,15 +28,15 @@ export function signMessage(
2928
* @see {bitcoinMessage.verify}
3029
*/
3130
export function verifyMessage(
32-
message: string,
31+
message: string | Buffer,
3332
publicKey: BIP32Interface | Buffer,
3433
signature: Buffer,
3534
network: { messagePrefix: string }
3635
): boolean {
3736
if (!Buffer.isBuffer(publicKey)) {
3837
publicKey = publicKey.publicKey;
3938
}
40-
if (!_.isObject(network) || !_.isString(network.messagePrefix)) {
39+
if (network === null || typeof network !== 'object' || typeof network.messagePrefix !== 'string') {
4140
throw new Error(`invalid argument 'network'`);
4241
}
4342

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import * as crypto from 'crypto';
2+
import * as assert from 'assert';
3+
4+
import * as utxolib from '@bitgo/utxo-lib';
5+
6+
import { signMessage, verifyMessage } from '../src/bip32utils';
7+
8+
describe('bip32utils', function () {
9+
function getSeedBuffers(length: number) {
10+
return Array.from({ length }).map((_, i) => crypto.createHash('sha256').update(`${i}`).digest());
11+
}
12+
it('signMessage/verifyMessage', function () {
13+
const keys = getSeedBuffers(4).map((seed) => utxolib.bip32.fromSeed(seed));
14+
const messages = ['hello', 'goodbye', Buffer.from('\x01\x02\x03'), Buffer.from('')];
15+
keys.forEach((key) => {
16+
messages.forEach((message) => {
17+
const signature = signMessage(message, key, utxolib.networks.bitcoin);
18+
19+
keys.forEach((otherKey) => {
20+
messages.forEach((otherMessage) => {
21+
const expectValid = message === otherMessage && key === otherKey;
22+
assert.strictEqual(verifyMessage(otherMessage, otherKey, signature, utxolib.networks.bitcoin), expectValid);
23+
assert.strictEqual(
24+
verifyMessage(Buffer.from(otherMessage), otherKey, signature, utxolib.networks.bitcoin),
25+
expectValid
26+
);
27+
});
28+
});
29+
});
30+
});
31+
});
32+
});

0 commit comments

Comments
 (0)