Browse Source

ECPair: stop exposing ECDSA curve

hk-custom-address
Daniel Cousens 10 years ago
parent
commit
8f9d59fb18
  1. 27
      src/ecpair.js
  2. 22
      test/ecpair.js
  3. 11
      test/integration/crypto.js

27
src/ecpair.js

@ -1,25 +1,29 @@
var bs58check = require('bs58check')
var bcrypto = require('./crypto') var bcrypto = require('./crypto')
var bs58check = require('bs58check')
var ecdsa = require('./ecdsa') var ecdsa = require('./ecdsa')
var ecurve = require('ecurve') var ecurve = require('ecurve')
var NETWORKS = require('./networks')
var randomBytes = require('randombytes') var randomBytes = require('randombytes')
var typeforce = require('typeforce') var typeforce = require('typeforce')
var types = require('./types') var types = require('./types')
var NETWORKS = require('./networks')
var BigInteger = require('bigi') var BigInteger = require('bigi')
function ECPair (d, Q, options) { var secp256k1 = ecurve.getCurveByName('secp256k1')
options = options || {}
function ECPair (d, Q, options) {
if (options) {
typeforce({ typeforce({
compressed: types.maybe(types.Boolean), compressed: types.maybe(types.Boolean),
network: types.maybe(types.Network) network: types.maybe(types.Network)
}, options) }, options)
}
options = options || {}
if (d) { if (d) {
if (d.signum() <= 0) throw new Error('Private key must be greater than 0') if (d.signum() <= 0) throw new Error('Private key must be greater than 0')
if (d.compareTo(ECPair.curve.n) >= 0) throw new Error('Private key must be less than the curve order') if (d.compareTo(secp256k1.n) >= 0) throw new Error('Private key must be less than the curve order')
if (Q) throw new TypeError('Unexpected publicKey parameter') if (Q) throw new TypeError('Unexpected publicKey parameter')
this.d = d this.d = d
@ -37,18 +41,15 @@ function ECPair (d, Q, options) {
Object.defineProperty(ECPair.prototype, 'Q', { Object.defineProperty(ECPair.prototype, 'Q', {
get: function () { get: function () {
if (!this.__Q && this.d) { if (!this.__Q && this.d) {
this.__Q = ECPair.curve.G.multiply(this.d) this.__Q = secp256k1.G.multiply(this.d)
} }
return this.__Q return this.__Q
} }
}) })
// Public access to secp256k1 curve
ECPair.curve = ecurve.getCurveByName('secp256k1')
ECPair.fromPublicKeyBuffer = function (buffer, network) { ECPair.fromPublicKeyBuffer = function (buffer, network) {
var Q = ecurve.Point.decodeFrom(ECPair.curve, buffer) var Q = ecurve.Point.decodeFrom(secp256k1, buffer)
return new ECPair(null, Q, { return new ECPair(null, Q, {
compressed: Q.compressed, compressed: Q.compressed,
@ -108,7 +109,7 @@ ECPair.makeRandom = function (options) {
typeforce(types.Buffer256bit, buffer) typeforce(types.Buffer256bit, buffer)
var d = BigInteger.fromBuffer(buffer) var d = BigInteger.fromBuffer(buffer)
d = d.mod(ECPair.curve.n) d = d.mod(secp256k1.n)
return new ECPair(d, null, options) return new ECPair(d, null, options)
} }
@ -147,11 +148,11 @@ ECPair.prototype.getPublicKeyBuffer = function () {
ECPair.prototype.sign = function (hash) { ECPair.prototype.sign = function (hash) {
if (!this.d) throw new Error('Missing private key') if (!this.d) throw new Error('Missing private key')
return ecdsa.sign(ECPair.curve, hash, this.d) return ecdsa.sign(secp256k1, hash, this.d)
} }
ECPair.prototype.verify = function (hash, signature) { ECPair.prototype.verify = function (hash, signature) {
return ecdsa.verify(ECPair.curve, hash, signature, this.Q) return ecdsa.verify(secp256k1, hash, signature, this.Q)
} }
module.exports = ECPair module.exports = ECPair

22
test/ecpair.js

@ -11,6 +11,7 @@ var BigInteger = require('bigi')
var ECPair = require('../src/ecpair') var ECPair = require('../src/ecpair')
var fixtures = require('./fixtures/ecpair.json') var fixtures = require('./fixtures/ecpair.json')
var secp256k1 = ecurve.getCurveByName('secp256k1')
var NETWORKS = require('../src/networks') var NETWORKS = require('../src/networks')
var NETWORKS_LIST = [] // Object.values(NETWORKS) var NETWORKS_LIST = [] // Object.values(NETWORKS)
@ -53,7 +54,7 @@ describe('ECPair', function () {
it('throws if public and private key given', function () { it('throws if public and private key given', function () {
var qBuffer = new Buffer('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', 'hex') var qBuffer = new Buffer('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', 'hex')
var Q = ecurve.Point.decodeFrom(ECPair.curve, qBuffer) var Q = ecurve.Point.decodeFrom(secp256k1, qBuffer)
assert.throws(function () { assert.throws(function () {
new ECPair(BigInteger.ONE, Q) new ECPair(BigInteger.ONE, Q)
@ -200,25 +201,10 @@ describe('ECPair', function () {
hash = new Buffer(32) hash = new Buffer(32)
}) })
it('uses the secp256k1 curve by default', function () {
var secp256k1 = ecurve.getCurveByName('secp256k1')
for (var property in secp256k1) {
// FIXME: circular structures in ecurve
if (property === 'G') continue
if (property === 'infinity') continue
var actual = ECPair.curve[property]
var expected = secp256k1[property]
assert.deepEqual(actual, expected)
}
})
describe('signing', function () { describe('signing', function () {
it('wraps ecdsa.sign', sinon.test(function () { it('wraps ecdsa.sign', sinon.test(function () {
this.mock(ecdsa).expects('sign') this.mock(ecdsa).expects('sign')
.once().calledWith(ECPair.curve, hash, keyPair.d) .once().calledWith(secp256k1, hash, keyPair.d)
keyPair.sign(hash) keyPair.sign(hash)
})) }))
@ -241,7 +227,7 @@ describe('ECPair', function () {
it('wraps ecdsa.verify', sinon.test(function () { it('wraps ecdsa.verify', sinon.test(function () {
this.mock(ecdsa).expects('verify') this.mock(ecdsa).expects('verify')
.once().calledWith(ECPair.curve, hash, signature, keyPair.Q) .once().calledWith(secp256k1, hash, signature, keyPair.Q)
keyPair.verify(hash, signature) keyPair.verify(hash, signature)
})) }))

11
test/integration/crypto.js

@ -7,10 +7,13 @@ var bitcoin = require('../../')
var blockchain = require('./_blockchain') var blockchain = require('./_blockchain')
var crypto = require('crypto') var crypto = require('crypto')
var ecurve = require('ecurve')
var secp256k1 = ecurve.getCurveByName('secp256k1')
describe('bitcoinjs-lib (crypto)', function () { describe('bitcoinjs-lib (crypto)', function () {
it('can generate a single-key stealth address', function () { it('can generate a single-key stealth address', function () {
var G = bitcoin.ECPair.curve.G var G = secp256k1.G
var n = bitcoin.ECPair.curve.n var n = secp256k1.n
function stealthSend (Q) { function stealthSend (Q) {
var noncePair = bitcoin.ECPair.makeRandom() var noncePair = bitcoin.ECPair.makeRandom()
@ -56,7 +59,7 @@ describe('bitcoinjs-lib (crypto)', function () {
assert(!master.keyPair.d, 'You already have the parent private key') assert(!master.keyPair.d, 'You already have the parent private key')
assert(child.keyPair.d, 'Missing child private key') assert(child.keyPair.d, 'Missing child private key')
var curve = bitcoin.ECPair.curve var curve = secp256k1
var QP = master.keyPair.Q var QP = master.keyPair.Q
var serQP = master.keyPair.getPublicKeyBuffer() var serQP = master.keyPair.getPublicKeyBuffer()
@ -162,7 +165,7 @@ describe('bitcoinjs-lib (crypto)', function () {
async.parallel(tasks, function (err) { async.parallel(tasks, function (err) {
if (err) throw err if (err) throw err
var n = bitcoin.ECPair.curve.n var n = secp256k1.n
for (var i = 0; i < inputs.length; ++i) { for (var i = 0; i < inputs.length; ++i) {
for (var j = i + 1; j < inputs.length; ++j) { for (var j = i + 1; j < inputs.length; ++j) {

Loading…
Cancel
Save