Skip to content

Commit 8f9d59f

Browse files
committed
ECPair: stop exposing ECDSA curve
1 parent b95223a commit 8f9d59f

File tree

3 files changed

+28
-38
lines changed

3 files changed

+28
-38
lines changed

src/ecpair.js

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
1-
var bs58check = require('bs58check')
21
var bcrypto = require('./crypto')
2+
var bs58check = require('bs58check')
33
var ecdsa = require('./ecdsa')
44
var ecurve = require('ecurve')
5-
var NETWORKS = require('./networks')
65
var randomBytes = require('randombytes')
76
var typeforce = require('typeforce')
87
var types = require('./types')
98

9+
var NETWORKS = require('./networks')
1010
var BigInteger = require('bigi')
1111

12+
var secp256k1 = ecurve.getCurveByName('secp256k1')
13+
1214
function ECPair (d, Q, options) {
13-
options = options || {}
15+
if (options) {
16+
typeforce({
17+
compressed: types.maybe(types.Boolean),
18+
network: types.maybe(types.Network)
19+
}, options)
20+
}
1421

15-
typeforce({
16-
compressed: types.maybe(types.Boolean),
17-
network: types.maybe(types.Network)
18-
}, options)
22+
options = options || {}
1923

2024
if (d) {
2125
if (d.signum() <= 0) throw new Error('Private key must be greater than 0')
22-
if (d.compareTo(ECPair.curve.n) >= 0) throw new Error('Private key must be less than the curve order')
26+
if (d.compareTo(secp256k1.n) >= 0) throw new Error('Private key must be less than the curve order')
2327
if (Q) throw new TypeError('Unexpected publicKey parameter')
2428

2529
this.d = d
@@ -37,18 +41,15 @@ function ECPair (d, Q, options) {
3741
Object.defineProperty(ECPair.prototype, 'Q', {
3842
get: function () {
3943
if (!this.__Q && this.d) {
40-
this.__Q = ECPair.curve.G.multiply(this.d)
44+
this.__Q = secp256k1.G.multiply(this.d)
4145
}
4246

4347
return this.__Q
4448
}
4549
})
4650

47-
// Public access to secp256k1 curve
48-
ECPair.curve = ecurve.getCurveByName('secp256k1')
49-
5051
ECPair.fromPublicKeyBuffer = function (buffer, network) {
51-
var Q = ecurve.Point.decodeFrom(ECPair.curve, buffer)
52+
var Q = ecurve.Point.decodeFrom(secp256k1, buffer)
5253

5354
return new ECPair(null, Q, {
5455
compressed: Q.compressed,
@@ -108,7 +109,7 @@ ECPair.makeRandom = function (options) {
108109
typeforce(types.Buffer256bit, buffer)
109110

110111
var d = BigInteger.fromBuffer(buffer)
111-
d = d.mod(ECPair.curve.n)
112+
d = d.mod(secp256k1.n)
112113

113114
return new ECPair(d, null, options)
114115
}
@@ -147,11 +148,11 @@ ECPair.prototype.getPublicKeyBuffer = function () {
147148
ECPair.prototype.sign = function (hash) {
148149
if (!this.d) throw new Error('Missing private key')
149150

150-
return ecdsa.sign(ECPair.curve, hash, this.d)
151+
return ecdsa.sign(secp256k1, hash, this.d)
151152
}
152153

153154
ECPair.prototype.verify = function (hash, signature) {
154-
return ecdsa.verify(ECPair.curve, hash, signature, this.Q)
155+
return ecdsa.verify(secp256k1, hash, signature, this.Q)
155156
}
156157

157158
module.exports = ECPair

test/ecpair.js

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var BigInteger = require('bigi')
1111
var ECPair = require('../src/ecpair')
1212

1313
var fixtures = require('./fixtures/ecpair.json')
14+
var secp256k1 = ecurve.getCurveByName('secp256k1')
1415

1516
var NETWORKS = require('../src/networks')
1617
var NETWORKS_LIST = [] // Object.values(NETWORKS)
@@ -53,7 +54,7 @@ describe('ECPair', function () {
5354

5455
it('throws if public and private key given', function () {
5556
var qBuffer = new Buffer('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', 'hex')
56-
var Q = ecurve.Point.decodeFrom(ECPair.curve, qBuffer)
57+
var Q = ecurve.Point.decodeFrom(secp256k1, qBuffer)
5758

5859
assert.throws(function () {
5960
new ECPair(BigInteger.ONE, Q)
@@ -200,25 +201,10 @@ describe('ECPair', function () {
200201
hash = new Buffer(32)
201202
})
202203

203-
it('uses the secp256k1 curve by default', function () {
204-
var secp256k1 = ecurve.getCurveByName('secp256k1')
205-
206-
for (var property in secp256k1) {
207-
// FIXME: circular structures in ecurve
208-
if (property === 'G') continue
209-
if (property === 'infinity') continue
210-
211-
var actual = ECPair.curve[property]
212-
var expected = secp256k1[property]
213-
214-
assert.deepEqual(actual, expected)
215-
}
216-
})
217-
218204
describe('signing', function () {
219205
it('wraps ecdsa.sign', sinon.test(function () {
220206
this.mock(ecdsa).expects('sign')
221-
.once().calledWith(ECPair.curve, hash, keyPair.d)
207+
.once().calledWith(secp256k1, hash, keyPair.d)
222208

223209
keyPair.sign(hash)
224210
}))
@@ -241,7 +227,7 @@ describe('ECPair', function () {
241227

242228
it('wraps ecdsa.verify', sinon.test(function () {
243229
this.mock(ecdsa).expects('verify')
244-
.once().calledWith(ECPair.curve, hash, signature, keyPair.Q)
230+
.once().calledWith(secp256k1, hash, signature, keyPair.Q)
245231

246232
keyPair.verify(hash, signature)
247233
}))

test/integration/crypto.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ var bitcoin = require('../../')
77
var blockchain = require('./_blockchain')
88
var crypto = require('crypto')
99

10+
var ecurve = require('ecurve')
11+
var secp256k1 = ecurve.getCurveByName('secp256k1')
12+
1013
describe('bitcoinjs-lib (crypto)', function () {
1114
it('can generate a single-key stealth address', function () {
12-
var G = bitcoin.ECPair.curve.G
13-
var n = bitcoin.ECPair.curve.n
15+
var G = secp256k1.G
16+
var n = secp256k1.n
1417

1518
function stealthSend (Q) {
1619
var noncePair = bitcoin.ECPair.makeRandom()
@@ -56,7 +59,7 @@ describe('bitcoinjs-lib (crypto)', function () {
5659
assert(!master.keyPair.d, 'You already have the parent private key')
5760
assert(child.keyPair.d, 'Missing child private key')
5861

59-
var curve = bitcoin.ECPair.curve
62+
var curve = secp256k1
6063
var QP = master.keyPair.Q
6164
var serQP = master.keyPair.getPublicKeyBuffer()
6265

@@ -162,7 +165,7 @@ describe('bitcoinjs-lib (crypto)', function () {
162165
async.parallel(tasks, function (err) {
163166
if (err) throw err
164167

165-
var n = bitcoin.ECPair.curve.n
168+
var n = secp256k1.n
166169

167170
for (var i = 0; i < inputs.length; ++i) {
168171
for (var j = i + 1; j < inputs.length; ++j) {

0 commit comments

Comments
 (0)