commit
9cd34f50d5
23 changed files with 247 additions and 238 deletions
60
src/eckey.js
60
src/eckey.js
|
@ -4,15 +4,12 @@ var ecdsa = require('./ecdsa')
|
||||||
var networks = require('./networks')
|
var networks = require('./networks')
|
||||||
var secureRandom = require('secure-random')
|
var secureRandom = require('secure-random')
|
||||||
|
|
||||||
var Address = require('./address')
|
var BigInteger = require('bigi')
|
||||||
var crypto = require('./crypto')
|
var ECPubKey = require('./ecpubkey')
|
||||||
|
|
||||||
var sec = require('./sec')
|
var sec = require('./sec')
|
||||||
var ecparams = sec('secp256k1')
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
var BigInteger = require('bigi')
|
|
||||||
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')
|
||||||
assert(D.compareTo(ecparams.getN()) < 0, 'Private key must be less than the curve order')
|
assert(D.compareTo(ecparams.getN()) < 0, 'Private key must be less than the curve order')
|
||||||
|
@ -31,6 +28,7 @@ ECKey.fromBuffer = function(buffer, compressed) {
|
||||||
var D = BigInteger.fromBuffer(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) {
|
||||||
return ECKey.fromBuffer(new Buffer(hex, 'hex'), compressed)
|
return ECKey.fromBuffer(new Buffer(hex, 'hex'), compressed)
|
||||||
}
|
}
|
||||||
|
@ -67,6 +65,7 @@ ECKey.prototype.sign = function(hash) {
|
||||||
ECKey.prototype.toBuffer = function() {
|
ECKey.prototype.toBuffer = function() {
|
||||||
return this.D.toBuffer(32)
|
return this.D.toBuffer(32)
|
||||||
}
|
}
|
||||||
|
|
||||||
ECKey.prototype.toHex = function() {
|
ECKey.prototype.toHex = function() {
|
||||||
return this.toBuffer().toString('hex')
|
return this.toBuffer().toString('hex')
|
||||||
}
|
}
|
||||||
|
@ -82,53 +81,4 @@ ECKey.prototype.toWIF = function(version) {
|
||||||
return base58check.encode(buffer, version)
|
return base58check.encode(buffer, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////
|
module.exports = ECKey
|
||||||
|
|
||||||
function ECPubKey(Q, compressed) {
|
|
||||||
assert(Q instanceof ECPointFp, 'Q must be an ECPointFP')
|
|
||||||
|
|
||||||
if (compressed == undefined) compressed = true
|
|
||||||
assert.strictEqual(typeof compressed, 'boolean', 'Invalid compression flag')
|
|
||||||
|
|
||||||
this.compressed = compressed
|
|
||||||
this.Q = Q
|
|
||||||
}
|
|
||||||
|
|
||||||
// Static constructors
|
|
||||||
ECPubKey.fromBuffer = function(buffer) {
|
|
||||||
var type = buffer.readUInt8(0)
|
|
||||||
assert(type >= 0x02 || type <= 0x04, 'Invalid public key')
|
|
||||||
|
|
||||||
var compressed = (type !== 0x04)
|
|
||||||
assert.strictEqual(buffer.length, compressed ? 33 : 65, 'Invalid public key')
|
|
||||||
|
|
||||||
var Q = ECPointFp.decodeFrom(ecparams.getCurve(), buffer)
|
|
||||||
return new ECPubKey(Q, compressed)
|
|
||||||
}
|
|
||||||
ECPubKey.fromHex = function(hex) {
|
|
||||||
return ECPubKey.fromBuffer(new Buffer(hex, 'hex'))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operations
|
|
||||||
ECPubKey.prototype.verify = function(hash, sig) {
|
|
||||||
return ecdsa.verify(hash, sig, this.Q)
|
|
||||||
}
|
|
||||||
|
|
||||||
ECPubKey.prototype.getAddress = function(version) {
|
|
||||||
version = version || networks.bitcoin.pubKeyHash
|
|
||||||
|
|
||||||
return new Address(crypto.hash160(this.toBuffer()), version)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export functions
|
|
||||||
ECPubKey.prototype.toBuffer = function() {
|
|
||||||
return new Buffer(this.Q.getEncoded(this.compressed))
|
|
||||||
}
|
|
||||||
ECPubKey.prototype.toHex = function() {
|
|
||||||
return this.toBuffer().toString('hex')
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
ECKey: ECKey,
|
|
||||||
ECPubKey: ECPubKey
|
|
||||||
}
|
|
||||||
|
|
58
src/ecpubkey.js
Normal file
58
src/ecpubkey.js
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
var assert = require('assert')
|
||||||
|
var crypto = require('./crypto')
|
||||||
|
var ecdsa = require('./ecdsa')
|
||||||
|
var networks = require('./networks')
|
||||||
|
|
||||||
|
var Address = require('./address')
|
||||||
|
var ECPointFp = require('./ec').ECPointFp
|
||||||
|
|
||||||
|
var sec = require('./sec')
|
||||||
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
|
function ECPubKey(Q, compressed) {
|
||||||
|
assert(Q instanceof ECPointFp, 'Q must be an ECPointFP')
|
||||||
|
|
||||||
|
if (compressed == undefined) compressed = true
|
||||||
|
assert.strictEqual(typeof compressed, 'boolean', 'Invalid compression flag')
|
||||||
|
|
||||||
|
this.compressed = compressed
|
||||||
|
this.Q = Q
|
||||||
|
}
|
||||||
|
|
||||||
|
// Static constructors
|
||||||
|
ECPubKey.fromBuffer = function(buffer) {
|
||||||
|
var type = buffer.readUInt8(0)
|
||||||
|
assert(type >= 0x02 || type <= 0x04, 'Invalid public key')
|
||||||
|
|
||||||
|
var compressed = (type !== 0x04)
|
||||||
|
assert.strictEqual(buffer.length, compressed ? 33 : 65, 'Invalid public key')
|
||||||
|
|
||||||
|
var Q = ECPointFp.decodeFrom(ecparams.getCurve(), buffer)
|
||||||
|
return new ECPubKey(Q, compressed)
|
||||||
|
}
|
||||||
|
|
||||||
|
ECPubKey.fromHex = function(hex) {
|
||||||
|
return ECPubKey.fromBuffer(new Buffer(hex, 'hex'))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
ECPubKey.prototype.getAddress = function(version) {
|
||||||
|
version = version || networks.bitcoin.pubKeyHash
|
||||||
|
|
||||||
|
return new Address(crypto.hash160(this.toBuffer()), version)
|
||||||
|
}
|
||||||
|
|
||||||
|
ECPubKey.prototype.verify = function(hash, sig) {
|
||||||
|
return ecdsa.verify(hash, sig, this.Q)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export functions
|
||||||
|
ECPubKey.prototype.toBuffer = function() {
|
||||||
|
return new Buffer(this.Q.getEncoded(this.compressed))
|
||||||
|
}
|
||||||
|
|
||||||
|
ECPubKey.prototype.toHex = function() {
|
||||||
|
return this.toBuffer().toString('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ECPubKey
|
|
@ -5,8 +5,8 @@ var convert = require('./convert')
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var BigInteger = require('bigi')
|
var BigInteger = require('bigi')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
var ECKey = require('./eckey').ECKey
|
var ECKey = require('./eckey')
|
||||||
var ECPubKey = require('./eckey').ECPubKey
|
var ECPubKey = require('./ecpubkey')
|
||||||
var networks = require('./networks')
|
var networks = require('./networks')
|
||||||
|
|
||||||
var sec = require('./sec')
|
var sec = require('./sec')
|
||||||
|
|
|
@ -6,14 +6,14 @@ module.exports = {
|
||||||
Address: require('./address'),
|
Address: require('./address'),
|
||||||
base58: require('./base58'),
|
base58: require('./base58'),
|
||||||
base58check: require('./base58check'),
|
base58check: require('./base58check'),
|
||||||
BufferExt: require('./buffer'),
|
bufferutils: require('./bufferutils'),
|
||||||
convert: require('./convert'),
|
convert: require('./convert'),
|
||||||
crypto: require('./crypto'),
|
crypto: require('./crypto'),
|
||||||
ec: ec,
|
ec: ec,
|
||||||
ecdsa: require('./ecdsa'),
|
ecdsa: require('./ecdsa'),
|
||||||
ECKey: Key.ECKey,
|
ECKey: require('./eckey'),
|
||||||
ECPointFp: ec.ECPointFp,
|
ECPointFp: ec.ECPointFp,
|
||||||
ECPubKey: Key.ECPubKey,
|
ECPubKey: require('./ecpubkey'),
|
||||||
Message: require('./message'),
|
Message: require('./message'),
|
||||||
Opcode: require('./opcode'),
|
Opcode: require('./opcode'),
|
||||||
HDWallet: require('./hdwallet'),
|
HDWallet: require('./hdwallet'),
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
/// Implements Bitcoin's feature for signing arbitrary messages.
|
/// Implements Bitcoin's feature for signing arbitrary messages.
|
||||||
|
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var BufferExt = require('./buffer')
|
var bufferutils = require('./bufferutils')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
var ecdsa = require('./ecdsa')
|
var ecdsa = require('./ecdsa')
|
||||||
var ECPubKey = require('./eckey').ECPubKey
|
var ECPubKey = require('./ecpubkey')
|
||||||
|
|
||||||
// FIXME: incompatible with other networks (Litecoin etc)
|
// FIXME: incompatible with other networks (Litecoin etc)
|
||||||
var MAGIC_PREFIX = new Buffer('\x18Bitcoin Signed Message:\n')
|
var MAGIC_PREFIX = new Buffer('\x18Bitcoin Signed Message:\n')
|
||||||
|
|
||||||
function magicHash(message) {
|
function magicHash(message) {
|
||||||
var messageBuffer = new Buffer(message)
|
var messageBuffer = new Buffer(message)
|
||||||
var lengthBuffer = new Buffer(BufferExt.varIntSize(messageBuffer.length))
|
var lengthBuffer = new Buffer(bufferutils.varIntSize(messageBuffer.length))
|
||||||
BufferExt.writeVarInt(lengthBuffer, messageBuffer.length, 0)
|
bufferutils.writeVarInt(lengthBuffer, messageBuffer.length, 0)
|
||||||
|
|
||||||
var buffer = Buffer.concat([
|
var buffer = Buffer.concat([
|
||||||
MAGIC_PREFIX, lengthBuffer, messageBuffer
|
MAGIC_PREFIX, lengthBuffer, messageBuffer
|
||||||
|
|
|
@ -3,14 +3,14 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var Address = require('./address')
|
var Address = require('./address')
|
||||||
var BigInteger = require('bigi')
|
var BigInteger = require('bigi')
|
||||||
var BufferExt = require('./buffer')
|
var bufferutils = require('./bufferutils')
|
||||||
var Script = require('./script')
|
var Script = require('./script')
|
||||||
var convert = require('./convert')
|
var convert = require('./convert')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
var ECKey = require('./eckey').ECKey
|
var ECKey = require('./eckey')
|
||||||
var ecdsa = require('./ecdsa')
|
var ecdsa = require('./ecdsa')
|
||||||
|
|
||||||
var Transaction = function (doc) {
|
function Transaction(doc) {
|
||||||
if (!(this instanceof Transaction)) { return new Transaction(doc) }
|
if (!(this instanceof Transaction)) { return new Transaction(doc) }
|
||||||
this.version = 1
|
this.version = 1
|
||||||
this.locktime = 0
|
this.locktime = 0
|
||||||
|
@ -122,17 +122,17 @@ Transaction.prototype.addOutput = function (address, value) {
|
||||||
*/
|
*/
|
||||||
Transaction.prototype.serialize = function () {
|
Transaction.prototype.serialize = function () {
|
||||||
var txInSize = this.ins.reduce(function(a, x) {
|
var txInSize = this.ins.reduce(function(a, x) {
|
||||||
return a + (40 + BufferExt.varIntSize(x.script.buffer.length) + x.script.buffer.length)
|
return a + (40 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
|
||||||
}, 0)
|
}, 0)
|
||||||
|
|
||||||
var txOutSize = this.outs.reduce(function(a, x) {
|
var txOutSize = this.outs.reduce(function(a, x) {
|
||||||
return a + (8 + BufferExt.varIntSize(x.script.buffer.length) + x.script.buffer.length)
|
return a + (8 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
|
||||||
}, 0)
|
}, 0)
|
||||||
|
|
||||||
var buffer = new Buffer(
|
var buffer = new Buffer(
|
||||||
8 +
|
8 +
|
||||||
BufferExt.varIntSize(this.ins.length) +
|
bufferutils.varIntSize(this.ins.length) +
|
||||||
BufferExt.varIntSize(this.outs.length) +
|
bufferutils.varIntSize(this.outs.length) +
|
||||||
txInSize +
|
txInSize +
|
||||||
txOutSize
|
txOutSize
|
||||||
)
|
)
|
||||||
|
@ -148,11 +148,11 @@ Transaction.prototype.serialize = function () {
|
||||||
offset += 4
|
offset += 4
|
||||||
}
|
}
|
||||||
function writeUInt64(i) {
|
function writeUInt64(i) {
|
||||||
BufferExt.writeUInt64LE(buffer, i, offset)
|
bufferutils.writeUInt64LE(buffer, i, offset)
|
||||||
offset += 8
|
offset += 8
|
||||||
}
|
}
|
||||||
function writeVarInt(i) {
|
function writeVarInt(i) {
|
||||||
var n = BufferExt.writeVarInt(buffer, i, offset)
|
var n = bufferutils.writeVarInt(buffer, i, offset)
|
||||||
offset += n
|
offset += n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,12 +294,12 @@ Transaction.deserialize = function(buffer) {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
function readUInt64() {
|
function readUInt64() {
|
||||||
var i = BufferExt.readUInt64LE(buffer, offset)
|
var i = bufferutils.readUInt64LE(buffer, offset)
|
||||||
offset += 8
|
offset += 8
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
function readVarInt() {
|
function readVarInt() {
|
||||||
var vi = BufferExt.readVarInt(buffer, offset)
|
var vi = bufferutils.readVarInt(buffer, offset)
|
||||||
offset += vi.size
|
offset += vi.size
|
||||||
return vi.number
|
return vi.number
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var Address = require('..').Address
|
var Address = require('../src/address')
|
||||||
var networks = require('..').networks
|
var networks = require('../src/networks')
|
||||||
var Script = require('..').Script
|
var Script = require('../src/script')
|
||||||
|
|
||||||
var b58fixtures = require('./fixtures/base58')
|
var b58fixtures = require('./fixtures/base58')
|
||||||
var fixtures = require('./fixtures/address')
|
var fixtures = require('./fixtures/address')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var base58 = require('../').base58
|
var base58 = require('../src/base58')
|
||||||
var fixtures = require('./fixtures/base58')
|
var fixtures = require('./fixtures/base58')
|
||||||
|
|
||||||
function b2h(b) { return new Buffer(b).toString('hex') }
|
function b2h(b) { return new Buffer(b).toString('hex') }
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var base58check = require('../').base58check
|
var base58check = require('../src/base58check')
|
||||||
var fixtures = require('./fixtures/base58check')
|
var fixtures = require('./fixtures/base58check')
|
||||||
|
|
||||||
function b2h(b) { return new Buffer(b).toString('hex') }
|
function b2h(b) { return new Buffer(b).toString('hex') }
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var BufferExt = require('../').BufferExt
|
var bufferutils = require('../src/bufferutils')
|
||||||
|
|
||||||
var fixtures = require('./fixtures/buffer.js')
|
var fixtures = require('./fixtures/buffer.js')
|
||||||
|
|
||||||
describe('Buffer Extensions', function() {
|
describe('bufferutils', function() {
|
||||||
describe('readUInt64LE', function() {
|
describe('readUInt64LE', function() {
|
||||||
it('matches test vectors', function() {
|
it('matches test vectors', function() {
|
||||||
fixtures.valid.forEach(function(f) {
|
fixtures.valid.forEach(function(f) {
|
||||||
var buffer = new Buffer(f.hex64, 'hex')
|
var buffer = new Buffer(f.hex64, 'hex')
|
||||||
var number = BufferExt.readUInt64LE(buffer, 0)
|
var number = bufferutils.readUInt64LE(buffer, 0)
|
||||||
|
|
||||||
assert.equal(number, f.dec)
|
assert.equal(number, f.dec)
|
||||||
})
|
})
|
||||||
|
@ -19,7 +19,7 @@ describe('Buffer Extensions', function() {
|
||||||
it('matches test vectors', function() {
|
it('matches test vectors', function() {
|
||||||
fixtures.valid.forEach(function(f) {
|
fixtures.valid.forEach(function(f) {
|
||||||
var buffer = new Buffer(f.hexVI, 'hex')
|
var buffer = new Buffer(f.hexVI, 'hex')
|
||||||
var d = BufferExt.readVarInt(buffer, 0)
|
var d = bufferutils.readVarInt(buffer, 0)
|
||||||
|
|
||||||
assert.equal(d.number, f.dec)
|
assert.equal(d.number, f.dec)
|
||||||
assert.equal(d.size, buffer.length)
|
assert.equal(d.size, buffer.length)
|
||||||
|
@ -31,7 +31,7 @@ describe('Buffer Extensions', function() {
|
||||||
it('matches test vectors', function() {
|
it('matches test vectors', function() {
|
||||||
fixtures.valid.forEach(function(f) {
|
fixtures.valid.forEach(function(f) {
|
||||||
var number = parseInt(f.dec)
|
var number = parseInt(f.dec)
|
||||||
var size = BufferExt.varIntSize(number)
|
var size = bufferutils.varIntSize(number)
|
||||||
|
|
||||||
assert.equal(size, f.hexVI.length / 2)
|
assert.equal(size, f.hexVI.length / 2)
|
||||||
})
|
})
|
||||||
|
@ -44,7 +44,7 @@ describe('Buffer Extensions', function() {
|
||||||
var buffer = new Buffer(8)
|
var buffer = new Buffer(8)
|
||||||
buffer.fill(0)
|
buffer.fill(0)
|
||||||
|
|
||||||
BufferExt.writeUInt64LE(buffer, f.dec, 0)
|
bufferutils.writeUInt64LE(buffer, f.dec, 0)
|
||||||
assert.equal(buffer.toString('hex'), f.hex64)
|
assert.equal(buffer.toString('hex'), f.hex64)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -55,7 +55,7 @@ describe('Buffer Extensions', function() {
|
||||||
var buffer = new Buffer(8)
|
var buffer = new Buffer(8)
|
||||||
buffer.fill(0)
|
buffer.fill(0)
|
||||||
|
|
||||||
BufferExt.writeUInt64LE(buffer, f.dec, 0)
|
bufferutils.writeUInt64LE(buffer, f.dec, 0)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -67,7 +67,7 @@ describe('Buffer Extensions', function() {
|
||||||
var buffer = new Buffer(9)
|
var buffer = new Buffer(9)
|
||||||
buffer.fill(0)
|
buffer.fill(0)
|
||||||
|
|
||||||
var n = BufferExt.writeVarInt(buffer, f.dec, 0)
|
var n = bufferutils.writeVarInt(buffer, f.dec, 0)
|
||||||
assert.equal(buffer.slice(0, n).toString('hex'), f.hexVI)
|
assert.equal(buffer.slice(0, n).toString('hex'), f.hexVI)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -78,7 +78,7 @@ describe('Buffer Extensions', function() {
|
||||||
var buffer = new Buffer(9)
|
var buffer = new Buffer(9)
|
||||||
buffer.fill(0)
|
buffer.fill(0)
|
||||||
|
|
||||||
BufferExt.writeVarInt(buffer, f.dec, 0)
|
bufferutils.writeVarInt(buffer, f.dec, 0)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
|
@ -1,5 +1,5 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var convert = require('../').convert
|
var convert = require('../src/convert')
|
||||||
|
|
||||||
describe('convert', function() {
|
describe('convert', function() {
|
||||||
describe('byte array and word array conversions', function(){
|
describe('byte array and word array conversions', function(){
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var crypto = require('../').crypto
|
var crypto = require('../src/crypto')
|
||||||
var fixture = require('./fixtures/crypto')
|
|
||||||
|
var fixtures = require('./fixtures/crypto')
|
||||||
|
|
||||||
describe('Crypto', function() {
|
describe('Crypto', function() {
|
||||||
describe('HASH160', function() {
|
describe('HASH160', function() {
|
||||||
it('matches the test vector', function() {
|
it('matches the test vector', function() {
|
||||||
fixture.before.hex.forEach(function(hex, i) {
|
fixtures.before.hex.forEach(function(hex, i) {
|
||||||
var actual = crypto.hash160(new Buffer(hex, 'hex')).toString('hex')
|
var actual = crypto.hash160(new Buffer(hex, 'hex')).toString('hex')
|
||||||
var expected = fixture.after.hash160[i]
|
var expected = fixtures.after.hash160[i]
|
||||||
|
|
||||||
assert.equal(actual, expected)
|
assert.equal(actual, expected)
|
||||||
})
|
})
|
||||||
|
@ -16,9 +17,9 @@ describe('Crypto', function() {
|
||||||
|
|
||||||
describe('HASH256', function() {
|
describe('HASH256', function() {
|
||||||
it('matches the test vector', function() {
|
it('matches the test vector', function() {
|
||||||
fixture.before.hex.forEach(function(hex, i) {
|
fixtures.before.hex.forEach(function(hex, i) {
|
||||||
var actual = crypto.hash256(new Buffer(hex, 'hex')).toString('hex')
|
var actual = crypto.hash256(new Buffer(hex, 'hex')).toString('hex')
|
||||||
var expected = fixture.after.hash256[i]
|
var expected = fixtures.after.hash256[i]
|
||||||
|
|
||||||
assert.equal(actual, expected)
|
assert.equal(actual, expected)
|
||||||
})
|
})
|
||||||
|
@ -27,9 +28,9 @@ describe('Crypto', function() {
|
||||||
|
|
||||||
describe('SHA1', function() {
|
describe('SHA1', function() {
|
||||||
it('matches the test vector', function() {
|
it('matches the test vector', function() {
|
||||||
fixture.before.hex.forEach(function(hex, i) {
|
fixtures.before.hex.forEach(function(hex, i) {
|
||||||
var actual = crypto.sha1(new Buffer(hex, 'hex')).toString('hex')
|
var actual = crypto.sha1(new Buffer(hex, 'hex')).toString('hex')
|
||||||
var expected = fixture.after.sha1[i]
|
var expected = fixtures.after.sha1[i]
|
||||||
|
|
||||||
assert.equal(actual, expected)
|
assert.equal(actual, expected)
|
||||||
})
|
})
|
||||||
|
@ -38,9 +39,9 @@ describe('Crypto', function() {
|
||||||
|
|
||||||
describe('SHA256', function() {
|
describe('SHA256', function() {
|
||||||
it('matches the test vector', function() {
|
it('matches the test vector', function() {
|
||||||
fixture.before.hex.forEach(function(hex, i) {
|
fixtures.before.hex.forEach(function(hex, i) {
|
||||||
var actual = crypto.sha256(new Buffer(hex, 'hex')).toString('hex')
|
var actual = crypto.sha256(new Buffer(hex, 'hex')).toString('hex')
|
||||||
var expected = fixture.after.sha256[i]
|
var expected = fixtures.after.sha256[i]
|
||||||
|
|
||||||
assert.equal(actual, expected)
|
assert.equal(actual, expected)
|
||||||
})
|
})
|
||||||
|
@ -49,12 +50,12 @@ describe('Crypto', function() {
|
||||||
|
|
||||||
describe('HMAC SHA512', function() {
|
describe('HMAC SHA512', function() {
|
||||||
it('matches the test vector', function() {
|
it('matches the test vector', function() {
|
||||||
fixture.before.hex.forEach(function(hex, i) {
|
fixtures.before.hex.forEach(function(hex, i) {
|
||||||
var data = new Buffer(hex, 'hex')
|
var data = new Buffer(hex, 'hex')
|
||||||
var secret = new Buffer(fixture.after.hmacsha512.secret)
|
var secret = new Buffer(fixtures.after.hmacsha512.secret)
|
||||||
|
|
||||||
var actual = crypto.HmacSHA512(data, secret)
|
var actual = crypto.HmacSHA512(data, secret)
|
||||||
var expected = fixture.after.hmacsha512.hash[i]
|
var expected = fixtures.after.hmacsha512.hash[i]
|
||||||
|
|
||||||
assert.equal(actual.toString('hex'), expected)
|
assert.equal(actual.toString('hex'), expected)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
|
||||||
var sec = require('../').sec
|
var sec = require('../src/sec')
|
||||||
var ecparams = sec('secp256k1')
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
var BigInteger = require('bigi')
|
var BigInteger = require('bigi')
|
||||||
var ECPointFp = require('../').ECPointFp
|
var ECPointFp = require('../src/ec').ECPointFp
|
||||||
|
|
||||||
describe('ec', function() {
|
describe('ec', function() {
|
||||||
describe('ECPointFp', function() {
|
describe('ECPointFp', function() {
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var crypto = require('../').crypto
|
var crypto = require('../src/crypto')
|
||||||
var ecdsa = require('..').ecdsa
|
var ecdsa = require('../src/ecdsa')
|
||||||
var sec = require('..').sec
|
|
||||||
|
var sec = require('../src/sec')
|
||||||
var ecparams = sec("secp256k1")
|
var ecparams = sec("secp256k1")
|
||||||
|
|
||||||
var BigInteger = require('bigi')
|
var BigInteger = require('bigi')
|
||||||
var ECKey = require('..').ECKey
|
var ECKey = require('../src/eckey')
|
||||||
var ECPubKey = require('..').ECPubKey
|
var ECPubKey = require('../src/ecpubkey')
|
||||||
var Message = require('..').Message
|
var Message = require('../src/message')
|
||||||
|
|
||||||
var fixtures = require('./fixtures/ecdsa.js')
|
var fixtures = require('./fixtures/ecdsa.js')
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
var crypto = require('../src/crypto')
|
||||||
|
|
||||||
var crypto = require('..').crypto
|
var ECKey = require('../src/eckey')
|
||||||
var ECKey = require('../src/eckey.js').ECKey
|
var ECPubKey = require('../src/ecpubkey')
|
||||||
var ECPubKey = require('../src/eckey.js').ECPubKey
|
|
||||||
|
|
||||||
describe('ECKey', function() {
|
describe('ECKey', function() {
|
||||||
describe('constructor', function() {
|
describe('constructor', function() {
|
||||||
|
@ -51,77 +51,6 @@ describe('ECKey', function() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('toAddress', function() {
|
|
||||||
var privkeys = [
|
|
||||||
'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458',
|
|
||||||
'1111111111111111111111111111111111111111111111111111111111111111',
|
|
||||||
'18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
|
||||||
]
|
|
||||||
|
|
||||||
// compressed pubkeys
|
|
||||||
var cpubkeys = [
|
|
||||||
'024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992',
|
|
||||||
'034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa',
|
|
||||||
'0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352'
|
|
||||||
]
|
|
||||||
|
|
||||||
var pubkeys = cpubkeys.map(function(x) {
|
|
||||||
var pk = ECPubKey.fromHex(x)
|
|
||||||
pk.compressed = false
|
|
||||||
return pk.toHex()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('bitcoin', function() {
|
|
||||||
var addresses = [
|
|
||||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
|
||||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
|
||||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
|
||||||
]
|
|
||||||
var compressedAddresses = [
|
|
||||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
|
||||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
|
||||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
|
||||||
]
|
|
||||||
|
|
||||||
for (var i = 0; i < addresses.length; ++i) {
|
|
||||||
var pub = ECPubKey.fromHex(pubkeys[i])
|
|
||||||
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
|
||||||
cpub.compressed = true
|
|
||||||
|
|
||||||
var addr = addresses[i]
|
|
||||||
var caddr = compressedAddresses[i]
|
|
||||||
|
|
||||||
assert.equal(pub.getAddress().toString(), addr)
|
|
||||||
assert.equal(cpub.getAddress().toString(), caddr)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
it('testnet', function() {
|
|
||||||
var addresses = [
|
|
||||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
|
||||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
|
||||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
|
||||||
]
|
|
||||||
var compressedAddresses = [
|
|
||||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
|
||||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
|
||||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
|
||||||
]
|
|
||||||
|
|
||||||
for (var i = 0; i < addresses.length; ++i) {
|
|
||||||
var pub = ECPubKey.fromHex(pubkeys[i])
|
|
||||||
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
|
||||||
cpub.compressed = true
|
|
||||||
|
|
||||||
var addr = addresses[i]
|
|
||||||
var caddr = compressedAddresses[i]
|
|
||||||
|
|
||||||
assert.equal(pub.getAddress().toString(), addr)
|
|
||||||
assert.equal(cpub.getAddress().toString(), caddr)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('signing', function() {
|
describe('signing', function() {
|
||||||
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
||||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||||
|
@ -151,23 +80,4 @@ describe('ECKey', function() {
|
||||||
assert(!priv2.pub.verify(hash, signature))
|
assert(!priv2.pub.verify(hash, signature))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('output of ECPubKey', function() {
|
|
||||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
|
||||||
var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
|
||||||
|
|
||||||
it('using toHex should support compression', function() {
|
|
||||||
var pub = ECPubKey.fromHex(hcpub)
|
|
||||||
|
|
||||||
assert.equal(pub.toHex(), hcpub)
|
|
||||||
assert.equal(pub.compressed, true)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('using toHex should support uncompressed', function() {
|
|
||||||
var pub = ECPubKey.fromHex(hpub)
|
|
||||||
|
|
||||||
assert.equal(pub.toHex(), hpub)
|
|
||||||
assert.equal(pub.compressed, false)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
95
test/ecpubkey.js
Normal file
95
test/ecpubkey.js
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
var assert = require('assert')
|
||||||
|
|
||||||
|
var ECPubKey = require('../src/ecpubkey')
|
||||||
|
|
||||||
|
describe('ECPubKey', function() {
|
||||||
|
describe('toBuffer/toHex', function() {
|
||||||
|
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||||
|
var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
||||||
|
|
||||||
|
it('using toHex should support compression', function() {
|
||||||
|
var pub = ECPubKey.fromHex(hcpub)
|
||||||
|
|
||||||
|
assert.equal(pub.toHex(), hcpub)
|
||||||
|
assert.equal(pub.compressed, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('using toHex should support uncompressed', function() {
|
||||||
|
var pub = ECPubKey.fromHex(hpub)
|
||||||
|
|
||||||
|
assert.equal(pub.toHex(), hpub)
|
||||||
|
assert.equal(pub.compressed, false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('getAddress', function() {
|
||||||
|
var privkeys = [
|
||||||
|
'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458',
|
||||||
|
'1111111111111111111111111111111111111111111111111111111111111111',
|
||||||
|
'18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
||||||
|
]
|
||||||
|
|
||||||
|
// compressed pubkeys
|
||||||
|
var cpubkeys = [
|
||||||
|
'024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992',
|
||||||
|
'034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa',
|
||||||
|
'0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352'
|
||||||
|
]
|
||||||
|
|
||||||
|
var pubkeys = cpubkeys.map(function(x) {
|
||||||
|
var pk = ECPubKey.fromHex(x)
|
||||||
|
pk.compressed = false
|
||||||
|
return pk.toHex()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('bitcoin', function() {
|
||||||
|
var addresses = [
|
||||||
|
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||||
|
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||||
|
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||||
|
]
|
||||||
|
var compressedAddresses = [
|
||||||
|
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||||
|
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||||
|
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||||
|
]
|
||||||
|
|
||||||
|
for (var i = 0; i < addresses.length; ++i) {
|
||||||
|
var pub = ECPubKey.fromHex(pubkeys[i])
|
||||||
|
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
||||||
|
cpub.compressed = true
|
||||||
|
|
||||||
|
var addr = addresses[i]
|
||||||
|
var caddr = compressedAddresses[i]
|
||||||
|
|
||||||
|
assert.equal(pub.getAddress().toString(), addr)
|
||||||
|
assert.equal(cpub.getAddress().toString(), caddr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('testnet', function() {
|
||||||
|
var addresses = [
|
||||||
|
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||||
|
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||||
|
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||||
|
]
|
||||||
|
var compressedAddresses = [
|
||||||
|
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||||
|
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||||
|
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||||
|
]
|
||||||
|
|
||||||
|
for (var i = 0; i < addresses.length; ++i) {
|
||||||
|
var pub = ECPubKey.fromHex(pubkeys[i])
|
||||||
|
var cpub = ECPubKey.fromHex(cpubkeys[i])
|
||||||
|
cpub.compressed = true
|
||||||
|
|
||||||
|
var addr = addresses[i]
|
||||||
|
var caddr = compressedAddresses[i]
|
||||||
|
|
||||||
|
assert.equal(pub.getAddress().toString(), addr)
|
||||||
|
assert.equal(cpub.getAddress().toString(), caddr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,6 +1,6 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
|
||||||
var HDWallet = require('../').HDWallet
|
var HDWallet = require('../src/hdwallet')
|
||||||
|
|
||||||
function b2h(buf) {
|
function b2h(buf) {
|
||||||
assert(Buffer.isBuffer(buf))
|
assert(Buffer.isBuffer(buf))
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
var assert = require('assert');
|
var assert = require('assert')
|
||||||
|
|
||||||
var Address = require('../../src/address');
|
var bitcoin = require('../../')
|
||||||
var ECKey = require('../../src/eckey').ECKey;
|
var crypto = bitcoin.crypto
|
||||||
var T = require('../../src/transaction');
|
var networks = bitcoin.networks
|
||||||
var Transaction = T.Transaction;
|
|
||||||
var Script = require('../../src/script');
|
var Address = bitcoin.Address
|
||||||
var networks = require('../../src/networks');
|
var ECKey = bitcoin.ECKey
|
||||||
var crypto = require('../../src/crypto');
|
var Transaction = bitcoin.Transaction
|
||||||
|
var Script = bitcoin.Script
|
||||||
|
|
||||||
var helloblock = require('helloblock-js')({
|
var helloblock = require('helloblock-js')({
|
||||||
network: 'testnet'
|
network: 'testnet'
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var ECKey = require('../src/eckey').ECKey
|
var networks = require('../src/networks')
|
||||||
var Message = require('../').Message
|
|
||||||
var networks = require('../').networks
|
var ECKey = require('../src/eckey')
|
||||||
|
var Message = require('../src/message')
|
||||||
|
|
||||||
var fixtures = require('./fixtures/message')
|
var fixtures = require('./fixtures/message')
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var crypto = require('..').crypto
|
var crypto = require('../src/crypto')
|
||||||
var networks = require('..').networks
|
var networks = require('../src/networks')
|
||||||
|
|
||||||
var Address = require('../src/address.js')
|
var Address = require('../src/address')
|
||||||
var Script = require('../src/script.js')
|
var Script = require('../src/script')
|
||||||
|
|
||||||
var fixtures = require('./fixtures/script')
|
var fixtures = require('./fixtures/script')
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
var networks = require('../src/networks')
|
||||||
|
|
||||||
var Address = require('../src/address')
|
var Address = require('../src/address')
|
||||||
var ECKey = require('../src/eckey').ECKey
|
var ECKey = require('../src/eckey')
|
||||||
var networks = require('..').networks
|
var Transaction = require('../src/transaction').Transaction
|
||||||
var T = require('../src/transaction')
|
|
||||||
var Transaction = T.Transaction
|
|
||||||
var TransactionOut = T.TransactionOut
|
|
||||||
var Script = require('../src/script')
|
var Script = require('../src/script')
|
||||||
|
|
||||||
var fixtureTxes = require('./fixtures/mainnet_tx')
|
var fixtureTxes = require('./fixtures/mainnet_tx')
|
||||||
|
@ -276,8 +274,5 @@ describe('Transaction', function() {
|
||||||
assert.equal(tx.serializeHex(), expected)
|
assert.equal(tx.serializeHex(), expected)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('TransactionOut', function() {
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var crypto = require('../').crypto
|
var crypto = require('../src/crypto')
|
||||||
var sinon = require('sinon')
|
var sinon = require('sinon')
|
||||||
|
|
||||||
var Address = require('..').Address
|
var Address = require('../src/address')
|
||||||
var HDNode = require('../src/hdwallet.js')
|
var HDWallet = require('../src/hdwallet')
|
||||||
var T = require('../src/transaction.js')
|
var Script = require('../src/script')
|
||||||
var Transaction = T.Transaction
|
var Transaction = require('../src/transaction').Transaction
|
||||||
var TransactionOut = T.TransactionOut
|
var Wallet = require('../src/wallet')
|
||||||
var Script = require('../src/script.js')
|
|
||||||
var Wallet = require('../src/wallet.js')
|
|
||||||
|
|
||||||
var fixtureTxes = require('./fixtures/mainnet_tx')
|
var fixtureTxes = require('./fixtures/mainnet_tx')
|
||||||
var fixtureTx1Hex = fixtureTxes.prevTx
|
var fixtureTx1Hex = fixtureTxes.prevTx
|
||||||
|
@ -32,7 +30,7 @@ describe('Wallet', function() {
|
||||||
|
|
||||||
it("generates m/0' as the main account", function() {
|
it("generates m/0' as the main account", function() {
|
||||||
var mainAccount = wallet.getAccountZero()
|
var mainAccount = wallet.getAccountZero()
|
||||||
assert.equal(mainAccount.index, 0 + HDNode.HIGHEST_BIT)
|
assert.equal(mainAccount.index, 0 + HDWallet.HIGHEST_BIT)
|
||||||
assert.equal(mainAccount.depth, 1)
|
assert.equal(mainAccount.depth, 1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue