Replacse JSBN with bigi
This commit is contained in:
parent
b95b5d5a04
commit
ae60e6eb95
15 changed files with 52 additions and 1381 deletions
|
@ -122,11 +122,6 @@ BitcoinJS (c) 2011-2012 Stefan Thomas
|
||||||
Released under MIT license
|
Released under MIT license
|
||||||
http://bitcoinjs.org/
|
http://bitcoinjs.org/
|
||||||
|
|
||||||
JSBN (c) 2003-2005 Tom Wu
|
|
||||||
Released under BSD license
|
|
||||||
http://www-cs-students.stanford.edu/~tjw/jsbn/
|
|
||||||
|
|
||||||
CryptoJS (c) 2009–2012 by Jeff Mott
|
CryptoJS (c) 2009–2012 by Jeff Mott
|
||||||
Released under New BSD license
|
Released under New BSD license
|
||||||
http://code.google.com/p/crypto-js/
|
http://code.google.com/p/crypto-js/
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
"compile": "./node_modules/.bin/browserify ./src/index.js -s Bitcoin | ./node_modules/.bin/uglifyjs > bitcoinjs-min.js"
|
"compile": "./node_modules/.bin/browserify ./src/index.js -s Bitcoin | ./node_modules/.bin/uglifyjs > bitcoinjs-min.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"bigi": "0.2.0",
|
||||||
"crypto-js": "3.1.2-3",
|
"crypto-js": "3.1.2-3",
|
||||||
"secure-random": "0.2.1"
|
"secure-random": "0.2.1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
// Merged Buffer refactorings from base58-native by Stephen Pair
|
// Merged Buffer refactorings from base58-native by Stephen Pair
|
||||||
// Copyright (c) 2013 BitPay Inc
|
// Copyright (c) 2013 BitPay Inc
|
||||||
|
|
||||||
var BigInteger = require('./jsbn/jsbn')
|
var BigInteger = require('./bigi')
|
||||||
|
|
||||||
var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
|
var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
|
||||||
|
@ -16,7 +16,7 @@ for(var i = 0; i < ALPHABET.length; i++) {
|
||||||
var BASE = BigInteger.valueOf(58)
|
var BASE = BigInteger.valueOf(58)
|
||||||
|
|
||||||
function encode(buffer) {
|
function encode(buffer) {
|
||||||
var bi = BigInteger.fromByteArrayUnsigned(buffer)
|
var bi = BigInteger.fromBuffer(buffer)
|
||||||
var result = new Buffer(buffer.length << 1)
|
var result = new Buffer(buffer.length << 1)
|
||||||
|
|
||||||
var i = result.length - 1
|
var i = result.length - 1
|
||||||
|
|
13
src/bigi.js
Normal file
13
src/bigi.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
var assert = require('assert')
|
||||||
|
var BigInteger = require('bigi')
|
||||||
|
|
||||||
|
BigInteger.fromBuffer = function(buffer) {
|
||||||
|
// FIXME: Transitionary
|
||||||
|
if (Buffer.isBuffer(buffer)) {
|
||||||
|
buffer = Array.prototype.slice.call(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
return BigInteger.fromByteArrayUnsigned(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = BigInteger
|
|
@ -2,13 +2,8 @@
|
||||||
// Ported loosely from BouncyCastle's Java EC code
|
// Ported loosely from BouncyCastle's Java EC code
|
||||||
// Only Fp curves implemented for now
|
// Only Fp curves implemented for now
|
||||||
|
|
||||||
var BigInteger = require('./jsbn'),
|
var BigInteger = require('./bigi')
|
||||||
sec = require('./sec');
|
|
||||||
|
|
||||||
// ----------------
|
|
||||||
// ECFieldElementFp
|
|
||||||
|
|
||||||
// constructor
|
|
||||||
function ECFieldElementFp(q,x) {
|
function ECFieldElementFp(q,x) {
|
||||||
this.x = x;
|
this.x = x;
|
||||||
// TODO if(x.compareTo(q) >= 0) error
|
// TODO if(x.compareTo(q) >= 0) error
|
||||||
|
@ -343,12 +338,12 @@ ECPointFp.decodeFrom = function (curve, enc) {
|
||||||
if (type == 4) {
|
if (type == 4) {
|
||||||
var xBa = enc.slice(1, 1 + dataLen/2),
|
var xBa = enc.slice(1, 1 + dataLen/2),
|
||||||
yBa = enc.slice(1 + dataLen/2, 1 + dataLen),
|
yBa = enc.slice(1 + dataLen/2, 1 + dataLen),
|
||||||
x = BigInteger.fromByteArrayUnsigned(xBa),
|
x = BigInteger.fromBuffer(xBa),
|
||||||
y = BigInteger.fromByteArrayUnsigned(yBa);
|
y = BigInteger.fromBuffer(yBa);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var xBa = enc.slice(1),
|
var xBa = enc.slice(1),
|
||||||
x = BigInteger.fromByteArrayUnsigned(xBa),
|
x = BigInteger.fromBuffer(xBa),
|
||||||
p = curve.getQ(),
|
p = curve.getQ(),
|
||||||
xCubedPlus7 = x.multiply(x).multiply(x).add(new BigInteger('7')).mod(p),
|
xCubedPlus7 = x.multiply(x).multiply(x).add(new BigInteger('7')).mod(p),
|
||||||
pPlus1Over4 = p.add(new BigInteger('1'))
|
pPlus1Over4 = p.add(new BigInteger('1'))
|
26
src/ecdsa.js
26
src/ecdsa.js
|
@ -1,10 +1,12 @@
|
||||||
var sec = require('./jsbn/sec')
|
var BigInteger = require('./bigi')
|
||||||
var rng = require('secure-random')
|
var ECPointFp = require('./ec').ECPointFp
|
||||||
var BigInteger = require('./jsbn/jsbn')
|
|
||||||
var convert = require('./convert')
|
var convert = require('./convert')
|
||||||
var HmacSHA256 = require('crypto-js/hmac-sha256')
|
var HmacSHA256 = require('crypto-js/hmac-sha256')
|
||||||
var ECPointFp = require('./jsbn/ec').ECPointFp
|
|
||||||
|
var sec = require('./sec')
|
||||||
var ecparams = sec("secp256k1")
|
var ecparams = sec("secp256k1")
|
||||||
|
|
||||||
var P_OVER_FOUR = null
|
var P_OVER_FOUR = null
|
||||||
|
|
||||||
function implShamirsTrick(P, k, Q, l) {
|
function implShamirsTrick(P, k, Q, l) {
|
||||||
|
@ -48,14 +50,14 @@ function deterministicGenerateK(hash,key) {
|
||||||
v = HmacSHA256(v,k)
|
v = HmacSHA256(v,k)
|
||||||
v = HmacSHA256(v,k)
|
v = HmacSHA256(v,k)
|
||||||
vArr = convert.wordArrayToBytes(v)
|
vArr = convert.wordArrayToBytes(v)
|
||||||
return BigInteger.fromByteArrayUnsigned(vArr)
|
return BigInteger.fromBuffer(vArr)
|
||||||
}
|
}
|
||||||
|
|
||||||
var ecdsa = {
|
var ecdsa = {
|
||||||
sign: function (hash, priv) {
|
sign: function (hash, priv) {
|
||||||
var d = priv
|
var d = priv
|
||||||
var n = ecparams.getN()
|
var n = ecparams.getN()
|
||||||
var e = BigInteger.fromByteArrayUnsigned(hash)
|
var e = BigInteger.fromBuffer(hash)
|
||||||
|
|
||||||
var k = deterministicGenerateK(hash,priv.toByteArrayUnsigned())
|
var k = deterministicGenerateK(hash,priv.toByteArrayUnsigned())
|
||||||
var G = ecparams.getG()
|
var G = ecparams.getG()
|
||||||
|
@ -93,7 +95,7 @@ var ecdsa = {
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Invalid format for pubkey value, must be byte array or ECPointFp")
|
throw new Error("Invalid format for pubkey value, must be byte array or ECPointFp")
|
||||||
}
|
}
|
||||||
var e = BigInteger.fromByteArrayUnsigned(hash)
|
var e = BigInteger.fromBuffer(hash)
|
||||||
|
|
||||||
return ecdsa.verifyRaw(e, r, s, Q)
|
return ecdsa.verifyRaw(e, r, s, Q)
|
||||||
},
|
},
|
||||||
|
@ -183,8 +185,8 @@ var ecdsa = {
|
||||||
//if (cursor != sig.length)
|
//if (cursor != sig.length)
|
||||||
// throw new Error("Extra bytes in signature")
|
// throw new Error("Extra bytes in signature")
|
||||||
|
|
||||||
var r = BigInteger.fromByteArrayUnsigned(rBa)
|
var r = BigInteger.fromBuffer(rBa)
|
||||||
var s = BigInteger.fromByteArrayUnsigned(sBa)
|
var s = BigInteger.fromBuffer(sBa)
|
||||||
|
|
||||||
return {r: r, s: s}
|
return {r: r, s: s}
|
||||||
},
|
},
|
||||||
|
@ -202,8 +204,8 @@ var ecdsa = {
|
||||||
}
|
}
|
||||||
|
|
||||||
var n = ecparams.getN()
|
var n = ecparams.getN()
|
||||||
var r = BigInteger.fromByteArrayUnsigned(sig.slice(1, 33)).mod(n)
|
var r = BigInteger.fromBuffer(sig.slice(1, 33)).mod(n)
|
||||||
var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 65)).mod(n)
|
var s = BigInteger.fromBuffer(sig.slice(33, 65)).mod(n)
|
||||||
|
|
||||||
return {r: r, s: s, i: i}
|
return {r: r, s: s, i: i}
|
||||||
},
|
},
|
||||||
|
@ -257,7 +259,7 @@ var ecdsa = {
|
||||||
R.validate()
|
R.validate()
|
||||||
|
|
||||||
// 1.5 Compute e from M
|
// 1.5 Compute e from M
|
||||||
var e = BigInteger.fromByteArrayUnsigned(hash)
|
var e = BigInteger.fromBuffer(hash)
|
||||||
var eNeg = BigInteger.ZERO.subtract(e).mod(n)
|
var eNeg = BigInteger.ZERO.subtract(e).mod(n)
|
||||||
|
|
||||||
// 1.6 Compute Q = r^-1 (sR - eG)
|
// 1.6 Compute Q = r^-1 (sR - eG)
|
||||||
|
|
10
src/eckey.js
10
src/eckey.js
|
@ -7,11 +7,11 @@ var secureRandom = require('secure-random')
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
|
|
||||||
var sec = require('./jsbn/sec')
|
var sec = require('./sec')
|
||||||
var ecparams = sec('secp256k1')
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
var BigInteger = require('./jsbn/jsbn')
|
var BigInteger = require('./bigi')
|
||||||
var ECPointFp = require('./jsbn/ec').ECPointFp
|
var ECPointFp = require('./ec').ECPointFp
|
||||||
|
|
||||||
function ECKey(D, compressed) {
|
function ECKey(D, compressed) {
|
||||||
assert(D.compareTo(BigInteger.ZERO) > 0, 'Private key must be greater than 0')
|
assert(D.compareTo(BigInteger.ZERO) > 0, 'Private key must be greater than 0')
|
||||||
|
@ -28,7 +28,7 @@ ECKey.fromBuffer = function(buffer, compressed) {
|
||||||
assert(Buffer.isBuffer(buffer), 'First argument must be a Buffer')
|
assert(Buffer.isBuffer(buffer), 'First argument must be a Buffer')
|
||||||
assert.strictEqual(buffer.length, 32, 'Invalid buffer length')
|
assert.strictEqual(buffer.length, 32, 'Invalid buffer length')
|
||||||
|
|
||||||
var D = BigInteger.fromByteArrayUnsigned(buffer)
|
var D = BigInteger.fromBuffer(buffer)
|
||||||
return new ECKey(D, compressed)
|
return new ECKey(D, compressed)
|
||||||
}
|
}
|
||||||
ECKey.fromHex = function(hex, compressed) {
|
ECKey.fromHex = function(hex, compressed) {
|
||||||
|
@ -52,7 +52,7 @@ ECKey.makeRandom = function(compressed, rng) {
|
||||||
rng = rng || secureRandom
|
rng = rng || secureRandom
|
||||||
|
|
||||||
var buffer = new Buffer(rng(32))
|
var buffer = new Buffer(rng(32))
|
||||||
var D = BigInteger.fromByteArrayUnsigned(buffer)
|
var D = BigInteger.fromBuffer(buffer)
|
||||||
D = D.mod(ecparams.getN())
|
D = D.mod(ecparams.getN())
|
||||||
|
|
||||||
return new ECKey(D, compressed)
|
return new ECKey(D, compressed)
|
||||||
|
|
|
@ -3,14 +3,14 @@ var base58 = require('./base58')
|
||||||
var convert = require('./convert')
|
var convert = require('./convert')
|
||||||
|
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var BigInteger = require('./jsbn/jsbn')
|
var BigInteger = require('./bigi')
|
||||||
var CJS = require('crypto-js')
|
var CJS = require('crypto-js')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
var ECKey = require('./eckey').ECKey
|
var ECKey = require('./eckey').ECKey
|
||||||
var ECPubKey = require('./eckey').ECPubKey
|
var ECPubKey = require('./eckey').ECPubKey
|
||||||
var Network = require('./network')
|
var Network = require('./network')
|
||||||
|
|
||||||
var sec = require('./jsbn/sec')
|
var sec = require('./sec')
|
||||||
var ecparams = sec("secp256k1")
|
var ecparams = sec("secp256k1")
|
||||||
|
|
||||||
function HmacSHA512(buffer, secret) {
|
function HmacSHA512(buffer, secret) {
|
||||||
|
@ -215,7 +215,7 @@ HDWallet.prototype.derive = function(i) {
|
||||||
var hd = new HDWallet()
|
var hd = new HDWallet()
|
||||||
hd.network = this.network
|
hd.network = this.network
|
||||||
|
|
||||||
var IL = BigInteger.fromByteArrayUnsigned(ILb)
|
var IL = BigInteger.fromBuffer(ILb)
|
||||||
|
|
||||||
if (this.priv) {
|
if (this.priv) {
|
||||||
// ki = IL + kpar (mod n).
|
// ki = IL + kpar (mod n).
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var ec = require('./ec')
|
||||||
var Key = require('./eckey')
|
var Key = require('./eckey')
|
||||||
var T = require('./transaction')
|
var T = require('./transaction')
|
||||||
|
|
||||||
|
@ -5,17 +6,19 @@ module.exports = {
|
||||||
Address: require('./address'),
|
Address: require('./address'),
|
||||||
base58: require('./base58'),
|
base58: require('./base58'),
|
||||||
base58check: require('./base58check'),
|
base58check: require('./base58check'),
|
||||||
BigInteger: require('./jsbn/jsbn'),
|
BigInteger: require('./bigi'),
|
||||||
convert: require('./convert'),
|
convert: require('./convert'),
|
||||||
crypto: require('./crypto'),
|
crypto: require('./crypto'),
|
||||||
|
ec: ec,
|
||||||
ecdsa: require('./ecdsa'),
|
ecdsa: require('./ecdsa'),
|
||||||
ECKey: Key.ECKey,
|
ECKey: Key.ECKey,
|
||||||
ECPointFp: require('./jsbn/ec').ECPointFp,
|
ECPointFp: ec.ECPointFp,
|
||||||
ECPubKey: Key.ECPubKey,
|
ECPubKey: Key.ECPubKey,
|
||||||
Message: require('./message'),
|
Message: require('./message'),
|
||||||
Opcode: require('./opcode'),
|
Opcode: require('./opcode'),
|
||||||
HDWallet: require('./hdwallet'),
|
HDWallet: require('./hdwallet'),
|
||||||
Script: require('./script'),
|
Script: require('./script'),
|
||||||
|
sec: require('./sec'),
|
||||||
Transaction: T.Transaction,
|
Transaction: T.Transaction,
|
||||||
TransactionIn: T.TransactionIn,
|
TransactionIn: T.TransactionIn,
|
||||||
TransactionOut: T.TransactionOut,
|
TransactionOut: T.TransactionOut,
|
||||||
|
|
1302
src/jsbn/jsbn.js
1302
src/jsbn/jsbn.js
File diff suppressed because it is too large
Load diff
|
@ -1,8 +1,8 @@
|
||||||
// Named EC curves
|
// Named EC curves
|
||||||
|
|
||||||
|
var BigInteger = require('./bigi')
|
||||||
var ECCurveFp = require('./ec')
|
var ECCurveFp = require('./ec')
|
||||||
var ECPointFp = require('./ec').ECPointFp
|
var ECPointFp = ECCurveFp.ECPointFp
|
||||||
var BigInteger = require('./jsbn')
|
|
||||||
|
|
||||||
// ----------------
|
// ----------------
|
||||||
// X9ECParameters
|
// X9ECParameters
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var BigInteger = require('./jsbn/jsbn')
|
var BigInteger = require('./bigi')
|
||||||
var Script = require('./script')
|
var Script = require('./script')
|
||||||
var convert = require('./convert')
|
var convert = require('./convert')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
|
||||||
var sec = require('../src/jsbn/sec')
|
var sec = require('../').sec
|
||||||
var ecparams = sec('secp256k1')
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
var BigInteger = require('..').BigInteger
|
var BigInteger = require('..').BigInteger
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var crypto = require('../').crypto
|
var crypto = require('../').crypto
|
||||||
var ecdsa = require('..').ecdsa
|
var ecdsa = require('..').ecdsa
|
||||||
var sec = require('../src/jsbn/sec.js')
|
var sec = require('..').sec
|
||||||
var ecparams = sec("secp256k1")
|
var ecparams = sec("secp256k1")
|
||||||
|
|
||||||
var BigInteger = require('..').BigInteger
|
var BigInteger = require('..').BigInteger
|
||||||
|
|
36
test/jsbn.js
36
test/jsbn.js
|
@ -1,36 +0,0 @@
|
||||||
var assert = require('assert')
|
|
||||||
var BigInteger = require('../src/jsbn/jsbn.js')
|
|
||||||
var bytesToHex = require('../src/convert.js').bytesToHex
|
|
||||||
var secureRandom = require('secure-random')
|
|
||||||
|
|
||||||
describe('BigInteger', function() {
|
|
||||||
describe('toByteArraySigned', function() {
|
|
||||||
it('handles examples', function() {
|
|
||||||
function hex(num) {
|
|
||||||
var bytes = BigInteger.valueOf(num).toByteArraySigned()
|
|
||||||
var h = bytesToHex(bytes)
|
|
||||||
return '0x' + h
|
|
||||||
}
|
|
||||||
|
|
||||||
assert.equal(hex( 0), '0x')
|
|
||||||
assert.equal(hex( 1), '0x01')
|
|
||||||
assert.equal(hex(-1), '0x81')
|
|
||||||
assert.equal(hex( 127), '0x7f')
|
|
||||||
assert.equal(hex(-127), '0xff')
|
|
||||||
assert.equal(hex( 255), '0x00ff')
|
|
||||||
assert.equal(hex(-255), '0x80ff')
|
|
||||||
assert.equal(hex( 16300), '0x3fac')
|
|
||||||
assert.equal(hex(-16300), '0xbfac')
|
|
||||||
assert.equal(hex( 62300), '0x00f35c')
|
|
||||||
assert.equal(hex(-62300), '0x80f35c')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('with RNG passed into constructor as the 2nd argument', function(){
|
|
||||||
it('returns a BigInteger with the limit of the specified length', function(){
|
|
||||||
var bitLength = 256
|
|
||||||
var i = new BigInteger(bitLength, secureRandom)
|
|
||||||
assert(i.bitLength() <= 256)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
Loading…
Add table
Reference in a new issue