Merge pull request #202 from dcousens/ecneg
ECKey -D test and light cleanup
This commit is contained in:
commit
c76d3cef37
11 changed files with 34 additions and 24 deletions
|
@ -18,7 +18,7 @@ function findScriptTypeByVersion(queryVersion) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function Address(hash, version) {
|
function Address(hash, version) {
|
||||||
assert(Buffer.isBuffer(hash), 'First argument must be a Buffer')
|
assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
|
||||||
assert.strictEqual(hash.length, 20, 'Invalid hash length')
|
assert.strictEqual(hash.length, 20, 'Invalid hash length')
|
||||||
assert.strictEqual(version & 0xFF, version, 'Invalid version byte')
|
assert.strictEqual(version & 0xFF, version, 'Invalid version byte')
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
|
var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
|
||||||
var ALPHABET_MAP = {}
|
var ALPHABET_MAP = {}
|
||||||
for(var i = 0; i < ALPHABET.length; i++) {
|
for(var i = 0; i < ALPHABET.length; i++) {
|
||||||
ALPHABET_MAP[ALPHABET[i]] = BigInteger.valueOf(i)
|
ALPHABET_MAP[ALPHABET.charAt(i)] = BigInteger.valueOf(i)
|
||||||
}
|
}
|
||||||
var BASE = BigInteger.valueOf(58)
|
var BASE = BigInteger.valueOf(58)
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ function encode(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
|
||||||
while (bi.compareTo(BigInteger.ZERO) > 0) {
|
while (bi.signum() > 0) {
|
||||||
var remainder = bi.mod(BASE)
|
var remainder = bi.mod(BASE)
|
||||||
bi = bi.divide(BASE)
|
bi = bi.divide(BASE)
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ function encode(buffer) {
|
||||||
function decode(string) {
|
function decode(string) {
|
||||||
if (string.length === 0) return new Buffer(0)
|
if (string.length === 0) return new Buffer(0)
|
||||||
|
|
||||||
var num = BigInteger.ZERO.clone()
|
var num = BigInteger.ZERO
|
||||||
|
|
||||||
for (var i = 0; i < string.length; i++) {
|
for (var i = 0; i < string.length; i++) {
|
||||||
num = num.multiply(BASE)
|
num = num.multiply(BASE)
|
||||||
|
@ -55,16 +55,16 @@ function decode(string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// deal with leading zeros
|
// deal with leading zeros
|
||||||
var i = 0
|
var j = 0
|
||||||
while ((i < string.length) && (string[i] === ALPHABET[0])) {
|
while ((j < string.length) && (string[j] === ALPHABET[0])) {
|
||||||
i++
|
j++
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer = num.toBuffer()
|
var buffer = num.toBuffer()
|
||||||
var leadz = new Buffer(i)
|
var leadingZeros = new Buffer(j)
|
||||||
leadz.fill(0)
|
leadingZeros.fill(0)
|
||||||
|
|
||||||
return Buffer.concat([leadz, buffer])
|
return Buffer.concat([leadingZeros, buffer])
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
@ -4,13 +4,8 @@ var base58 = require('./base58')
|
||||||
var crypto = require('./crypto')
|
var crypto = require('./crypto')
|
||||||
|
|
||||||
// Encode a buffer as a base58-check-encoded string
|
// Encode a buffer as a base58-check-encoded string
|
||||||
function encode(buffer, version) {
|
function encode(payload, version) {
|
||||||
version = version || 0
|
|
||||||
|
|
||||||
// FIXME: `new Buffer(buffer)` is unnecessary if input is a Buffer
|
|
||||||
var version = new Buffer([version])
|
var version = new Buffer([version])
|
||||||
var payload = new Buffer(buffer)
|
|
||||||
|
|
||||||
var message = Buffer.concat([version, payload])
|
var message = Buffer.concat([version, payload])
|
||||||
var checksum = crypto.hash256(message).slice(0, 4)
|
var checksum = crypto.hash256(message).slice(0, 4)
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ function readPushDataInt(buffer, offset) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
opcode: opcode,
|
||||||
number: number,
|
number: number,
|
||||||
size: size
|
size: size
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,18 +91,18 @@ function serializeSig(signature) {
|
||||||
var sBa = signature.s.toDERInteger()
|
var sBa = signature.s.toDERInteger()
|
||||||
|
|
||||||
var sequence = []
|
var sequence = []
|
||||||
sequence.push(0x02); // INTEGER
|
sequence.push(0x02) // INTEGER
|
||||||
sequence.push(rBa.length)
|
sequence.push(rBa.length)
|
||||||
sequence = sequence.concat(rBa)
|
sequence = sequence.concat(rBa)
|
||||||
|
|
||||||
sequence.push(0x02); // INTEGER
|
sequence.push(0x02) // INTEGER
|
||||||
sequence.push(sBa.length)
|
sequence.push(sBa.length)
|
||||||
sequence = sequence.concat(sBa)
|
sequence = sequence.concat(sBa)
|
||||||
|
|
||||||
sequence.unshift(sequence.length)
|
sequence.unshift(sequence.length)
|
||||||
sequence.unshift(0x30); // SEQUENCE
|
sequence.unshift(0x30) // SEQUENCE
|
||||||
|
|
||||||
return sequence
|
return new Buffer(sequence)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,7 +11,7 @@ var sec = require('./sec')
|
||||||
var ecparams = sec('secp256k1')
|
var ecparams = sec('secp256k1')
|
||||||
|
|
||||||
function ECKey(D, compressed) {
|
function ECKey(D, compressed) {
|
||||||
assert(D.compareTo(BigInteger.ZERO) > 0, 'Private key must be greater than 0')
|
assert(D.signum() > 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')
|
||||||
|
|
||||||
var Q = ecparams.getG().multiply(D)
|
var Q = ecparams.getG().multiply(D)
|
||||||
|
|
|
@ -11,7 +11,7 @@ describe('base58check', function() {
|
||||||
it('can decode ' + f.string, function() {
|
it('can decode ' + f.string, function() {
|
||||||
var actual = base58check.decode(f.string)
|
var actual = base58check.decode(f.string)
|
||||||
var expected = {
|
var expected = {
|
||||||
version: f.decode.version,
|
version: f.decode.version || 0,
|
||||||
payload: h2b(f.decode.payload),
|
payload: h2b(f.decode.payload),
|
||||||
checksum: h2b(f.decode.checksum)
|
checksum: h2b(f.decode.checksum)
|
||||||
}
|
}
|
||||||
|
@ -40,4 +40,3 @@ describe('base58check', function() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,9 @@ describe('bufferutils', function() {
|
||||||
it('decodes ' + f.hexPD + ' correctly', function() {
|
it('decodes ' + f.hexPD + ' correctly', function() {
|
||||||
var buffer = new Buffer(f.hexPD, 'hex')
|
var buffer = new Buffer(f.hexPD, 'hex')
|
||||||
var d = bufferutils.readPushDataInt(buffer, 0)
|
var d = bufferutils.readPushDataInt(buffer, 0)
|
||||||
|
var fopcode = parseInt(f.hexPD.substr(0, 2), 16)
|
||||||
|
|
||||||
|
assert.equal(d.opcode, fopcode)
|
||||||
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,8 +31,10 @@ describe('ECKey', function() {
|
||||||
|
|
||||||
fixtures.invalid.constructor.forEach(function(f) {
|
fixtures.invalid.constructor.forEach(function(f) {
|
||||||
it('throws on ' + f.D, function() {
|
it('throws on ' + f.D, function() {
|
||||||
|
var D = new BigInteger(f.D)
|
||||||
|
|
||||||
assert.throws(function() {
|
assert.throws(function() {
|
||||||
new ECKey(new BigInteger(f.D))
|
new ECKey(D)
|
||||||
}, new RegExp(f.exception))
|
}, new RegExp(f.exception))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
7
test/fixtures/base58check.json
vendored
7
test/fixtures/base58check.json
vendored
|
@ -1,5 +1,12 @@
|
||||||
{
|
{
|
||||||
"valid": [
|
"valid": [
|
||||||
|
{
|
||||||
|
"string": "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
|
||||||
|
"decode": {
|
||||||
|
"payload": "65a16059864a2fdbc7c99a4723a8395bc6f188eb",
|
||||||
|
"checksum": "c046b2ff"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"string": "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
|
"string": "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
|
||||||
"decode": {
|
"decode": {
|
||||||
|
|
4
test/fixtures/eckey.json
vendored
4
test/fixtures/eckey.json
vendored
|
@ -67,6 +67,10 @@
|
||||||
],
|
],
|
||||||
"invalid": {
|
"invalid": {
|
||||||
"constructor": [
|
"constructor": [
|
||||||
|
{
|
||||||
|
"exception": "Private key must be greater than 0",
|
||||||
|
"D": "-1"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"exception": "Private key must be greater than 0",
|
"exception": "Private key must be greater than 0",
|
||||||
"D": "0"
|
"D": "0"
|
||||||
|
|
Loading…
Reference in a new issue