Skip to content

Commit 1c68e41

Browse files
committed
move BIP32 example to own file
1 parent 11850cc commit 1c68e41

File tree

3 files changed

+62
-52
lines changed

3 files changed

+62
-52
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ The below examples are implemented as integration tests, they should be very eas
106106
- [Create an OP RETURN transaction](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/advanced.js#L24)
107107
- [Create a 2-of-3 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/multisig.js#L9)
108108
- [Spend from a 2-of-4 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/multisig.js#L25)
109-
- [Generate a single-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/stealth.js#L11)
110-
- [Generate a dual-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/stealth.js#L48)
111-
- [Recover a BIP32 parent private key from the parent public key and a derived non-hardened child private key](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L14)
112-
- [Recover a Private key from duplicate R values in a signature](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js#L60)
109+
- [Generate a single-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/stealth.js)
110+
- [Generate a dual-key stealth address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/stealth.js)
111+
- [Recover a BIP32 parent private key from the parent public key and a derived non-hardened child private key](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/bip32.js)
112+
- [Recover a Private key from duplicate R values in a signature](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/crypto.js)
113113
- [Create a CLTV locked transaction where the expiry is past](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/cltv.js#L36)
114114
- [Create a CLTV locked transaction where the parties bypass the expiry](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/cltv.js#L70)
115115
- [Create a CLTV locked transaction which fails due to expiry in the future](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/cltv.js#L102)

test/integration/bip32.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/* global describe, it */
2+
3+
var assert = require('assert')
4+
var bigi = require('bigi')
5+
var bitcoin = require('../../')
6+
var crypto = require('crypto')
7+
8+
var ecurve = require('ecurve')
9+
var secp256k1 = ecurve.getCurveByName('secp256k1')
10+
11+
describe('bitcoinjs-lib (BIP32)', function () {
12+
it('can recover a BIP32 parent private key from the parent public key, and a derived, non-hardened child private key', function () {
13+
function recoverParent (master, child) {
14+
assert(!master.keyPair.d, 'You already have the parent private key')
15+
assert(child.keyPair.d, 'Missing child private key')
16+
17+
var curve = secp256k1
18+
var QP = master.keyPair.Q
19+
var serQP = master.keyPair.getPublicKeyBuffer()
20+
21+
var d1 = child.keyPair.d
22+
var d2
23+
var data = new Buffer(37)
24+
serQP.copy(data, 0)
25+
26+
// search index space until we find it
27+
for (var i = 0; i < bitcoin.HDNode.HIGHEST_BIT; ++i) {
28+
data.writeUInt32BE(i, 33)
29+
30+
// calculate I
31+
var I = crypto.createHmac('sha512', master.chainCode).update(data).digest()
32+
var IL = I.slice(0, 32)
33+
var pIL = bigi.fromBuffer(IL)
34+
35+
// See hdnode.js:273 to understand
36+
d2 = d1.subtract(pIL).mod(curve.n)
37+
38+
var Qp = new bitcoin.ECPair(d2).Q
39+
if (Qp.equals(QP)) break
40+
}
41+
42+
var node = new bitcoin.HDNode(new bitcoin.ECPair(d2), master.chainCode, master.network)
43+
node.depth = master.depth
44+
node.index = master.index
45+
node.masterFingerprint = master.masterFingerprint
46+
return node
47+
}
48+
49+
var seed = crypto.randomBytes(32)
50+
var master = bitcoin.HDNode.fromSeedBuffer(seed)
51+
var child = master.derive(6) // m/6
52+
53+
// now for the recovery
54+
var neuteredMaster = master.neutered()
55+
var recovered = recoverParent(neuteredMaster, child)
56+
assert.strictEqual(recovered.toBase58(), master.toBase58())
57+
})
58+
})

test/integration/crypto.js

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,59 +5,11 @@ var async = require('async')
55
var bigi = require('bigi')
66
var bitcoin = require('../../')
77
var blockchain = require('./_blockchain')
8-
var crypto = require('crypto')
98

109
var ecurve = require('ecurve')
1110
var secp256k1 = ecurve.getCurveByName('secp256k1')
1211

1312
describe('bitcoinjs-lib (crypto)', function () {
14-
it('can recover a BIP32 parent private key from the parent public key, and a derived, non-hardened child private key', function () {
15-
function recoverParent (master, child) {
16-
assert(!master.keyPair.d, 'You already have the parent private key')
17-
assert(child.keyPair.d, 'Missing child private key')
18-
19-
var curve = secp256k1
20-
var QP = master.keyPair.Q
21-
var serQP = master.keyPair.getPublicKeyBuffer()
22-
23-
var d1 = child.keyPair.d
24-
var d2
25-
var data = new Buffer(37)
26-
serQP.copy(data, 0)
27-
28-
// search index space until we find it
29-
for (var i = 0; i < bitcoin.HDNode.HIGHEST_BIT; ++i) {
30-
data.writeUInt32BE(i, 33)
31-
32-
// calculate I
33-
var I = crypto.createHmac('sha512', master.chainCode).update(data).digest()
34-
var IL = I.slice(0, 32)
35-
var pIL = bigi.fromBuffer(IL)
36-
37-
// See hdnode.js:273 to understand
38-
d2 = d1.subtract(pIL).mod(curve.n)
39-
40-
var Qp = new bitcoin.ECPair(d2).Q
41-
if (Qp.equals(QP)) break
42-
}
43-
44-
var node = new bitcoin.HDNode(new bitcoin.ECPair(d2), master.chainCode, master.network)
45-
node.depth = master.depth
46-
node.index = master.index
47-
node.masterFingerprint = master.masterFingerprint
48-
return node
49-
}
50-
51-
var seed = crypto.randomBytes(32)
52-
var master = bitcoin.HDNode.fromSeedBuffer(seed)
53-
var child = master.derive(6) // m/6
54-
55-
// now for the recovery
56-
var neuteredMaster = master.neutered()
57-
var recovered = recoverParent(neuteredMaster, child)
58-
assert.strictEqual(recovered.toBase58(), master.toBase58())
59-
})
60-
6113
it('can recover a private key from duplicate R values', function (done) {
6214
this.timeout(30000)
6315

0 commit comments

Comments
 (0)