ECPair: stop exposing ECDSA curve
This commit is contained in:
parent
b95223adcd
commit
8f9d59fb18
3 changed files with 29 additions and 39 deletions
|
@ -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 || {}
|
|
||||||
|
|
||||||
typeforce({
|
function ECPair (d, Q, options) {
|
||||||
compressed: types.maybe(types.Boolean),
|
if (options) {
|
||||||
network: types.maybe(types.Network)
|
typeforce({
|
||||||
}, options)
|
compressed: types.maybe(types.Boolean),
|
||||||
|
network: types.maybe(types.Network)
|
||||||
|
}, 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
|
||||||
|
|
|
@ -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)
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -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…
Add table
Reference in a new issue