move convert methods from util to convert

This commit is contained in:
Wei Lu 2014-03-11 09:52:48 +08:00
parent 227fa97500
commit 3d6b66e811
15 changed files with 161 additions and 172 deletions

View file

@ -1,5 +1,5 @@
var base58 = require('./base58'); var base58 = require('./base58');
var conv = require('./convert'); var convert = require('./convert');
var util = require('./util'); var util = require('./util');
var mainnet = require('./network').mainnet.addressVersion; var mainnet = require('./network').mainnet.addressVersion;
@ -12,7 +12,7 @@ var Address = function (bytes, version) {
else if (typeof bytes === 'string') { else if (typeof bytes === 'string') {
this.hash = this.hash =
bytes.length <= 35 ? base58.checkDecode(bytes) bytes.length <= 35 ? base58.checkDecode(bytes)
: bytes.length <= 40 ? conv.hexToBytes(bytes) : bytes.length <= 40 ? convert.hexToBytes(bytes)
: util.error('invalid or unrecognized input'); : util.error('invalid or unrecognized input');
this.version = version || this.hash.version || mainnet; this.version = version || this.hash.version || mainnet;

View file

@ -5,8 +5,7 @@ var BigInteger = require('./jsbn/jsbn');
var Crypto = require('crypto-js'); var Crypto = require('crypto-js');
var SHA256 = Crypto.SHA256; var SHA256 = Crypto.SHA256;
var WordArray = Crypto.lib.WordArray; var WordArray = Crypto.lib.WordArray;
var conv = require('./convert'); var convert = require('./convert');
var util = require('./util');
var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
var base = BigInteger.valueOf(58); var base = BigInteger.valueOf(58);
@ -101,8 +100,8 @@ module.exports.checkDecode = function(input) {
} }
function getChecksum(bytes) { function getChecksum(bytes) {
var wordArray = util.bytesToWordArray(bytes) var wordArray = convert.bytesToWordArray(bytes)
return conv.hexToBytes(SHA256(SHA256(wordArray)).toString()).slice(0,4); return convert.hexToBytes(SHA256(SHA256(wordArray)).toString()).slice(0,4);
} }
module.exports.getChecksum = getChecksum module.exports.getChecksum = getChecksum

View file

@ -1,3 +1,5 @@
var Crypto = require('crypto-js');
var WordArray = Crypto.lib.WordArray;
var base64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var base64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
exports.lpad = function lpad(str, padString, length) { exports.lpad = function lpad(str, padString, length) {
@ -100,3 +102,59 @@ exports.stringToBytes = function(string) {
return x.charCodeAt(0) return x.charCodeAt(0)
}); });
} }
/**
* Create a byte array representing a number with the given length
*/
exports.numToBytes = function(num, bytes) {
if (bytes === undefined) bytes = 8;
if (bytes === 0) return [];
return [num % 256].concat(module.exports.numToBytes(Math.floor(num / 256), bytes - 1));
}
/**
* Convert a byte array to the number that it represents
*/
exports.bytesToNum = function(bytes) {
if (bytes.length === 0) return 0;
return bytes[0] + 256 * module.exports.bytesToNum(bytes.slice(1));
}
/**
* Turn an integer into a "var_int".
*
* "var_int" is a variable length integer used by Bitcoin's binary format.
*
* Returns a byte array.
*/
exports.numToVarInt = function(num) {
if (num < 253) return [num];
if (num < 65536) return [253].concat(exports.numToBytes(num, 2));
if (num < 4294967296) return [254].concat(exports.numToBytes(num, 4));
return [253].concat(exports.numToBytes(num, 8));
}
exports.bytesToWords = function (bytes) {
var words = [];
for (var i = 0, b = 0; i < bytes.length; i++, b += 8) {
words[b >>> 5] |= bytes[i] << (24 - b % 32);
}
return words;
}
exports.wordsToBytes = function (words) {
var bytes = [];
for (var b = 0; b < words.length * 32; b += 8) {
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
}
return bytes;
}
exports.bytesToWordArray = function (bytes) {
return new WordArray.init(exports.bytesToWords(bytes), bytes.length)
}
exports.wordArrayToBytes = function (wordArray) {
return exports.wordsToBytes(wordArray.words)
}

View file

@ -1,8 +1,7 @@
var sec = require('./jsbn/sec'); var sec = require('./jsbn/sec');
var util = require('./util');
var SecureRandom = require('./jsbn/rng'); var SecureRandom = require('./jsbn/rng');
var BigInteger = require('./jsbn/jsbn'); var BigInteger = require('./jsbn/jsbn');
var conv = 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 ECPointFp = require('./jsbn/ec').ECPointFp;
@ -43,16 +42,16 @@ function deterministicGenerateK(hash,key) {
var kArr = []; var kArr = [];
for (var i = 0;i < 32;i++) vArr.push(1); for (var i = 0;i < 32;i++) vArr.push(1);
for (var i = 0;i < 32;i++) kArr.push(0); for (var i = 0;i < 32;i++) kArr.push(0);
var v = util.bytesToWordArray(vArr) var v = convert.bytesToWordArray(vArr)
var k = util.bytesToWordArray(kArr) var k = convert.bytesToWordArray(kArr)
k = HmacSHA256(util.bytesToWordArray(vArr.concat([0]).concat(key).concat(hash)), k) k = HmacSHA256(convert.bytesToWordArray(vArr.concat([0]).concat(key).concat(hash)), k)
v = HmacSHA256(v, k) v = HmacSHA256(v, k)
vArr = util.wordArrayToBytes(v) vArr = convert.wordArrayToBytes(v)
k = HmacSHA256(util.bytesToWordArray(vArr.concat([1]).concat(key).concat(hash)), k) k = HmacSHA256(convert.bytesToWordArray(vArr.concat([1]).concat(key).concat(hash)), k)
v = HmacSHA256(v,k) v = HmacSHA256(v,k)
v = HmacSHA256(v,k) v = HmacSHA256(v,k)
vArr = util.wordArrayToBytes(v) vArr = convert.wordArrayToBytes(v)
return BigInteger.fromByteArrayUnsigned(vArr); return BigInteger.fromByteArrayUnsigned(vArr);
} }

View file

@ -2,7 +2,7 @@ var BigInteger = require('./jsbn/jsbn');
var sec = require('./jsbn/sec'); var sec = require('./jsbn/sec');
var base58 = require('./base58'); var base58 = require('./base58');
var util = require('./util'); var util = require('./util');
var conv = require('./convert'); var convert = require('./convert');
var Address = require('./address'); var Address = require('./address');
var ecdsa = require('./ecdsa'); var ecdsa = require('./ecdsa');
var ECPointFp = require('./jsbn/ec').ECPointFp; var ECPointFp = require('./jsbn/ec').ECPointFp;
@ -33,12 +33,12 @@ ECKey.prototype.import = function (input,compressed,version) {
: input instanceof BigInteger ? input.mod(ecparams.getN()) : input instanceof BigInteger ? input.mod(ecparams.getN())
: Array.isArray(input) ? fromBin(input.slice(0,32)) : Array.isArray(input) ? fromBin(input.slice(0,32))
: typeof input != "string" ? null : typeof input != "string" ? null
: input.length == 44 ? fromBin(conv.base64ToBytes(input)) : input.length == 44 ? fromBin(convert.base64ToBytes(input))
: input.length == 51 && input[0] == '5' ? fromBin(base58.checkDecode(input)) : input.length == 51 && input[0] == '5' ? fromBin(base58.checkDecode(input))
: input.length == 51 && input[0] == '9' ? fromBin(base58.checkDecode(input)) : input.length == 51 && input[0] == '9' ? fromBin(base58.checkDecode(input))
: input.length == 52 && has('LK',input[0]) ? fromBin(base58.checkDecode(input).slice(0,32)) : input.length == 52 && has('LK',input[0]) ? fromBin(base58.checkDecode(input).slice(0,32))
: input.length == 52 && input[0] == 'c' ? fromBin(base58.checkDecode(input).slice(0,32)) : input.length == 52 && input[0] == 'c' ? fromBin(base58.checkDecode(input).slice(0,32))
: has([64,65],input.length) ? fromBin(conv.hexToBytes(input.slice(0,64))) : has([64,65],input.length) ? fromBin(convert.hexToBytes(input.slice(0,64)))
: null : null
this.compressed = this.compressed =
@ -86,7 +86,7 @@ ECKey.prototype['export'] = function(format) {
}; };
ECKey.prototype.toBin = function() { ECKey.prototype.toBin = function() {
return conv.bytesToString(this.toBytes()) return convert.bytesToString(this.toBytes())
} }
ECKey.prototype.toBase58 = function() { ECKey.prototype.toBase58 = function() {
@ -96,7 +96,7 @@ ECKey.prototype.toBase58 = function() {
ECKey.prototype.toWif = ECKey.prototype.toBase58 ECKey.prototype.toWif = ECKey.prototype.toBase58
ECKey.prototype.toHex = function() { ECKey.prototype.toHex = function() {
return conv.bytesToHex(this.toBytes()) return convert.bytesToHex(this.toBytes())
} }
ECKey.prototype.toBytes = function() { ECKey.prototype.toBytes = function() {
@ -106,7 +106,7 @@ ECKey.prototype.toBytes = function() {
} }
ECKey.prototype.toBase64 = function() { ECKey.prototype.toBase64 = function() {
return conv.bytesToBase64(this.toBytes()) return convert.bytesToBase64(this.toBytes())
} }
ECKey.prototype.toString = ECKey.prototype.toBase58 ECKey.prototype.toString = ECKey.prototype.toBase58
@ -146,7 +146,7 @@ ECPubKey.prototype.import = function(input,compressed,version) {
input instanceof ECPointFp ? input input instanceof ECPointFp ? input
: input instanceof ECKey ? ecparams.getG().multiply(input.priv) : input instanceof ECKey ? ecparams.getG().multiply(input.priv)
: input instanceof ECPubKey ? input.pub : input instanceof ECPubKey ? input.pub
: typeof input == "string" ? decode(conv.hexToBytes(input)) : typeof input == "string" ? decode(convert.hexToBytes(input))
: Array.isArray(input) ? decode(input) : Array.isArray(input) ? decode(input)
: ecparams.getG().multiply(ecdsa.getBigRandom(ecparams.getN())) : ecparams.getG().multiply(ecdsa.getBigRandom(ecparams.getN()))
@ -182,11 +182,11 @@ ECPubKey.prototype.toBytes = function(compressed) {
} }
ECPubKey.prototype.toHex = function() { ECPubKey.prototype.toHex = function() {
return conv.bytesToHex(this.toBytes()) return convert.bytesToHex(this.toBytes())
} }
ECPubKey.prototype.toBin = function() { ECPubKey.prototype.toBin = function() {
return conv.bytesToString(this.toBytes()) return convert.bytesToString(this.toBytes())
} }
ECPubKey.prototype.toBase58 = function() { ECPubKey.prototype.toBase58 = function() {

View file

@ -13,8 +13,8 @@ var Network = require('./network')
var HDWallet = module.exports = function(seed, network) { var HDWallet = module.exports = function(seed, network) {
if (seed === undefined) return if (seed === undefined) return
var seedWords = util.bytesToWordArray(convert.stringToBytes(seed)) var seedWords = convert.bytesToWordArray(convert.stringToBytes(seed))
var I = util.wordArrayToBytes(HmacSHA512(seedWords, 'Bitcoin seed')) var I = convert.wordArrayToBytes(HmacSHA512(seedWords, 'Bitcoin seed'))
this.chaincode = I.slice(32) this.chaincode = I.slice(32)
this.network = network || 'mainnet' this.network = network || 'mainnet'
if(!Network.hasOwnProperty(this.network)) { if(!Network.hasOwnProperty(this.network)) {
@ -72,7 +72,7 @@ HDWallet.fromBytes = function(input) {
// 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; // 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private;
// testnet: 0x043587CF public, 0x04358394 private) // testnet: 0x043587CF public, 0x04358394 private)
var versionBytes = input.slice(0, 4) var versionBytes = input.slice(0, 4)
var versionWord = util.bytesToWords(versionBytes)[0] var versionWord = convert.bytesToWords(versionBytes)[0]
var type var type
for(var name in Network) { for(var name in Network) {
@ -97,7 +97,7 @@ HDWallet.fromBytes = function(input) {
// 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
// This is encoded in MSB order. (0x00000000 if master key) // This is encoded in MSB order. (0x00000000 if master key)
hd.index = util.bytesToNum(input.slice(9, 13).reverse()) hd.index = convert.bytesToNum(input.slice(9, 13).reverse())
assert(hd.depth > 0 || hd.index === 0) assert(hd.depth > 0 || hd.index === 0)
// 32 bytes: the chain code // 32 bytes: the chain code
@ -134,7 +134,7 @@ HDWallet.prototype.toBytes = function(priv) {
// 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public, // 4 byte: version bytes (mainnet: 0x0488B21E public, 0x0488ADE4 private; testnet: 0x043587CF public,
// 0x04358394 private) // 0x04358394 private)
var version = Network[this.network].hdVersions[priv ? 'priv' : 'pub'] var version = Network[this.network].hdVersions[priv ? 'priv' : 'pub']
var vBytes = util.wordsToBytes([version]) var vBytes = convert.wordsToBytes([version])
buffer = buffer.concat(vBytes) buffer = buffer.concat(vBytes)
assert.equal(buffer.length, 4) assert.equal(buffer.length, 4)
@ -150,7 +150,7 @@ HDWallet.prototype.toBytes = function(priv) {
// 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
// This is encoded in MSB order. (0x00000000 if master key) // This is encoded in MSB order. (0x00000000 if master key)
buffer = buffer.concat(util.numToBytes(this.index, 4).reverse()) buffer = buffer.concat(convert.numToBytes(this.index, 4).reverse())
assert.equal(buffer.length, 4 + 1 + 4 + 4) assert.equal(buffer.length, 4 + 1 + 4 + 4)
// 32 bytes: the chain code // 32 bytes: the chain code
@ -184,7 +184,7 @@ HDWallet.prototype.toBase58 = function(priv) {
HDWallet.prototype.derive = function(i) { HDWallet.prototype.derive = function(i) {
var I var I
, iBytes = util.numToBytes(i, 4).reverse() , iBytes = convert.numToBytes(i, 4).reverse()
, cPar = this.chaincode , cPar = this.chaincode
, usePriv = i >= HDWallet.HIGHEST_BIT , usePriv = i >= HDWallet.HIGHEST_BIT
, SHA512 = Crypto.algo.SHA512 , SHA512 = Crypto.algo.SHA512

View file

@ -2,21 +2,20 @@
var SHA256 = require('crypto-js/sha256'); var SHA256 = require('crypto-js/sha256');
var ecdsa = require('./ecdsa'); var ecdsa = require('./ecdsa');
var conv = require('./convert'); var convert = require('./convert');
var util = require('./util');
var Message = {}; var Message = {};
Message.magicPrefix = "Bitcoin Signed Message:\n"; Message.magicPrefix = "Bitcoin Signed Message:\n";
Message.makeMagicMessage = function (message) { Message.makeMagicMessage = function (message) {
var magicBytes = conv.stringToBytes(Message.magicPrefix); var magicBytes = convert.stringToBytes(Message.magicPrefix);
var messageBytes = conv.stringToBytes(message); var messageBytes = convert.stringToBytes(message);
var buffer = []; var buffer = [];
buffer = buffer.concat(util.numToVarInt(magicBytes.length)); buffer = buffer.concat(convert.numToVarInt(magicBytes.length));
buffer = buffer.concat(magicBytes); buffer = buffer.concat(magicBytes);
buffer = buffer.concat(util.numToVarInt(messageBytes.length)); buffer = buffer.concat(convert.numToVarInt(messageBytes.length));
buffer = buffer.concat(messageBytes); buffer = buffer.concat(messageBytes);
return buffer; return buffer;
@ -24,7 +23,7 @@ Message.makeMagicMessage = function (message) {
Message.getHash = function (message) { Message.getHash = function (message) {
var buffer = Message.makeMagicMessage(message); var buffer = Message.makeMagicMessage(message);
return util.wordArrayToBytes(SHA256(SHA256(util.bytesToWordArray(buffer)))); return convert.wordArrayToBytes(SHA256(SHA256(convert.bytesToWordArray(buffer))));
}; };
Message.signMessage = function (key, message, compressed) { Message.signMessage = function (key, message, compressed) {
@ -48,11 +47,11 @@ Message.signMessage = function (key, message, compressed) {
sig = [i].concat(rBa).concat(sBa); sig = [i].concat(rBa).concat(sBa);
return conv.bytesToHex(sig); return convert.bytesToHex(sig);
}; };
Message.verifyMessage = function (address, sig, message) { Message.verifyMessage = function (address, sig, message) {
sig = conv.hexToBytes(sig); sig = convert.hexToBytes(sig);
sig = ecdsa.parseSigCompact(sig); sig = ecdsa.parseSigCompact(sig);
var hash = Message.getHash(message); var hash = Message.getHash(message);

View file

@ -1,6 +1,6 @@
var Opcode = require('./opcode'); var Opcode = require('./opcode');
var util = require('./util'); var util = require('./util');
var conv = require('./convert'); var convert = require('./convert');
var Address = require('./address'); var Address = require('./address');
var network = require('./network'); var network = require('./network');
@ -13,7 +13,7 @@ var Script = function(data) {
}; };
Script.fromHex = function(data) { Script.fromHex = function(data) {
return new Script(conv.hexToBytes(data)) return new Script(convert.hexToBytes(data))
}; };
Script.fromPubKey = function(str) { Script.fromPubKey = function(str) {
@ -23,7 +23,7 @@ Script.fromPubKey = function(str) {
if (Opcode.map.hasOwnProperty(s[i])) { if (Opcode.map.hasOwnProperty(s[i])) {
script.writeOp(Opcode.map[s[i]]); script.writeOp(Opcode.map[s[i]]);
} else { } else {
script.writeBytes(conv.hexToBytes(s[i])); script.writeBytes(convert.hexToBytes(s[i]));
} }
} }
return script; return script;
@ -36,7 +36,7 @@ Script.fromScriptSig = function(str) {
if (Opcode.map.hasOwnProperty(s[i])) { if (Opcode.map.hasOwnProperty(s[i])) {
script.writeOp(Opcode.map[s[i]]); script.writeOp(Opcode.map[s[i]]);
} else { } else {
script.writeBytes(conv.hexToBytes(s[i])); script.writeBytes(convert.hexToBytes(s[i]));
} }
} }
return script; return script;

View file

@ -1,7 +1,7 @@
var BigInteger = require('./jsbn/jsbn'); var BigInteger = require('./jsbn/jsbn');
var Script = require('./script'); var Script = require('./script');
var util = require('./util'); var util = require('./util');
var conv = require('./convert'); var convert = require('./convert');
var Wallet = require('./wallet'); var Wallet = require('./wallet');
var ECKey = require('./eckey').ECKey; var ECKey = require('./eckey').ECKey;
var ECDSA = require('./ecdsa'); var ECDSA = require('./ecdsa');
@ -120,36 +120,36 @@ Transaction.prototype.addOutput = function (address, value) {
*/ */
Transaction.prototype.serialize = function () { Transaction.prototype.serialize = function () {
var buffer = []; var buffer = [];
buffer = buffer.concat(util.numToBytes(parseInt(this.version),4)); buffer = buffer.concat(convert.numToBytes(parseInt(this.version),4));
buffer = buffer.concat(util.numToVarInt(this.ins.length)); buffer = buffer.concat(convert.numToVarInt(this.ins.length));
for (var i = 0; i < this.ins.length; i++) { for (var i = 0; i < this.ins.length; i++) {
var txin = this.ins[i]; var txin = this.ins[i];
// Why do blockchain.info, blockexplorer.com, sx and just about everybody // Why do blockchain.info, blockexplorer.com, sx and just about everybody
// else use little-endian hashes? No idea... // else use little-endian hashes? No idea...
buffer = buffer.concat(conv.hexToBytes(txin.outpoint.hash).reverse()); buffer = buffer.concat(convert.hexToBytes(txin.outpoint.hash).reverse());
buffer = buffer.concat(util.numToBytes(parseInt(txin.outpoint.index),4)); buffer = buffer.concat(convert.numToBytes(parseInt(txin.outpoint.index),4));
var scriptBytes = txin.script.buffer; var scriptBytes = txin.script.buffer;
buffer = buffer.concat(util.numToVarInt(scriptBytes.length)); buffer = buffer.concat(convert.numToVarInt(scriptBytes.length));
buffer = buffer.concat(scriptBytes); buffer = buffer.concat(scriptBytes);
buffer = buffer.concat(util.numToBytes(parseInt(txin.sequence),4)); buffer = buffer.concat(convert.numToBytes(parseInt(txin.sequence),4));
} }
buffer = buffer.concat(util.numToVarInt(this.outs.length)); buffer = buffer.concat(convert.numToVarInt(this.outs.length));
for (var i = 0; i < this.outs.length; i++) { for (var i = 0; i < this.outs.length; i++) {
var txout = this.outs[i]; var txout = this.outs[i];
buffer = buffer.concat(util.numToBytes(txout.value,8)); buffer = buffer.concat(convert.numToBytes(txout.value,8));
var scriptBytes = txout.script.buffer; var scriptBytes = txout.script.buffer;
buffer = buffer.concat(util.numToVarInt(scriptBytes.length)); buffer = buffer.concat(convert.numToVarInt(scriptBytes.length));
buffer = buffer.concat(scriptBytes); buffer = buffer.concat(scriptBytes);
} }
buffer = buffer.concat(util.numToBytes(parseInt(this.lock_time),4)); buffer = buffer.concat(convert.numToBytes(parseInt(this.lock_time),4));
return buffer; return buffer;
}; };
Transaction.prototype.serializeHex = function() { Transaction.prototype.serializeHex = function() {
return conv.bytesToHex(this.serialize()); return convert.bytesToHex(this.serialize());
} }
var OP_CODESEPARATOR = 171; var OP_CODESEPARATOR = 171;
@ -205,7 +205,7 @@ function (connectedScript, inIndex, hashType)
var buffer = txTmp.serialize(); var buffer = txTmp.serialize();
buffer = buffer.concat(util.numToBytes(parseInt(hashType),4)); buffer = buffer.concat(convert.numToBytes(parseInt(hashType),4));
return Message.getHash(buffer) return Message.getHash(buffer)
}; };
@ -378,12 +378,12 @@ Transaction.prototype.calcImpact = function (wallet) {
// Calculate credit to us from all outputs // Calculate credit to us from all outputs
var valueOut = this.outs.filter(function(o) { var valueOut = this.outs.filter(function(o) {
return wallet.hasHash(conv.bytesToHex(o.script.simpleOutPubKeyHash())); return wallet.hasHash(convert.bytesToHex(o.script.simpleOutPubKeyHash()));
}) })
.reduce(function(t,o) { return t+o.value },0); .reduce(function(t,o) { return t+o.value },0);
var valueIn = this.ins.filter(function(i) { var valueIn = this.ins.filter(function(i) {
return wallet.hasHash(conv.bytesToHex(i.script.simpleInPubKeyHash())) return wallet.hasHash(convert.bytesToHex(i.script.simpleInPubKeyHash()))
&& wallet.txIndex[i.outpoint.hash]; && wallet.txIndex[i.outpoint.hash];
}) })
.reduce(function(t,i) { .reduce(function(t,i) {
@ -409,7 +409,7 @@ Transaction.prototype.calcImpact = function (wallet) {
Transaction.deserialize = function(buffer) { Transaction.deserialize = function(buffer) {
if (typeof buffer == "string") { if (typeof buffer == "string") {
buffer = conv.hexToBytes(buffer) buffer = convert.hexToBytes(buffer)
} }
var pos = 0; var pos = 0;
var readAsInt = function(bytes) { var readAsInt = function(bytes) {
@ -441,7 +441,7 @@ Transaction.deserialize = function(buffer) {
for (var i = 0; i < ins; i++) { for (var i = 0; i < ins; i++) {
obj.ins.push({ obj.ins.push({
outpoint: { outpoint: {
hash: conv.bytesToHex(readBytes(32).reverse()), hash: convert.bytesToHex(readBytes(32).reverse()),
index: readAsInt(4) index: readAsInt(4)
}, },
script: new Script(readVarString()), script: new Script(readVarString()),
@ -451,7 +451,7 @@ Transaction.deserialize = function(buffer) {
var outs = readVarInt(); var outs = readVarInt();
for (var i = 0; i < outs; i++) { for (var i = 0; i < outs; i++) {
obj.outs.push({ obj.outs.push({
value: util.bytesToNum(readBytes(8)), value: convert.bytesToNum(readBytes(8)),
script: new Script(readVarString()) script: new Script(readVarString())
}); });
} }
@ -523,8 +523,8 @@ Transaction.prototype.applyMultisigs = function(index, script, sigs, type) {
Transaction.prototype.validateSig = function(index, script, sig, pub) { Transaction.prototype.validateSig = function(index, script, sig, pub) {
script = new Script(script); script = new Script(script);
var hash = this.hashTransactionForSignature(script,index,1); var hash = this.hashTransactionForSignature(script,index,1);
return ECDSA.verify(hash, conv.coerceToBytes(sig), return ECDSA.verify(hash, convert.coerceToBytes(sig),
conv.coerceToBytes(pub)); convert.coerceToBytes(pub));
} }
@ -561,7 +561,7 @@ var TransactionOut = function (data) {
this.script = this.script =
data.script instanceof Script ? data.script.clone() data.script instanceof Script ? data.script.clone()
: Array.isArray(data.script) ? new Script(data.script) : Array.isArray(data.script) ? new Script(data.script)
: typeof data.script == "string" ? new Script(conv.hexToBytes(data.script)) : typeof data.script == "string" ? new Script(convert.hexToBytes(data.script))
: data.scriptPubKey ? Script.fromScriptSig(data.scriptPubKey) : data.scriptPubKey ? Script.fromScriptSig(data.scriptPubKey)
: data.address ? Script.createOutputScript(data.address) : data.address ? Script.createOutputScript(data.address)
: new Script(); : new Script();
@ -569,7 +569,7 @@ var TransactionOut = function (data) {
if (this.script.buffer.length > 0) this.address = this.script.toAddress(); if (this.script.buffer.length > 0) this.address = this.script.toAddress();
this.value = this.value =
Array.isArray(data.value) ? util.bytesToNum(data.value) Array.isArray(data.value) ? convert.bytesToNum(data.value)
: "string" == typeof data.value ? parseInt(data.value) : "string" == typeof data.value ? parseInt(data.value)
: data.value instanceof BigInteger ? parseInt(data.value.toString()) : data.value instanceof BigInteger ? parseInt(data.value.toString())
: data.value; : data.value;

View file

@ -1,63 +1,8 @@
var convert = require('./convert.js')
var Crypto = require('crypto-js'); var Crypto = require('crypto-js');
var RIPEMD160 = Crypto.RIPEMD160; var RIPEMD160 = Crypto.RIPEMD160;
var SHA256 = Crypto.SHA256; var SHA256 = Crypto.SHA256;
var HMAC= Crypto.algo.HMAC; var HMAC= Crypto.algo.HMAC;
var WordArray = Crypto.lib.WordArray;
/**
* Create a byte array representing a number with the given length
*/
exports.numToBytes = function(num, bytes) {
if (bytes === undefined) bytes = 8;
if (bytes === 0) return [];
return [num % 256].concat(module.exports.numToBytes(Math.floor(num / 256), bytes - 1));
}
/**
* Convert a byte array to the number that it represents
*/
exports.bytesToNum = function(bytes) {
if (bytes.length === 0) return 0;
return bytes[0] + 256 * module.exports.bytesToNum(bytes.slice(1));
}
/**
* Turn an integer into a "var_int".
*
* "var_int" is a variable length integer used by Bitcoin's binary format.
*
* Returns a byte array.
*/
exports.numToVarInt = function(num) {
if (num < 253) return [num];
if (num < 65536) return [253].concat(exports.numToBytes(num, 2));
if (num < 4294967296) return [254].concat(exports.numToBytes(num, 4));
return [253].concat(exports.numToBytes(num, 8));
}
exports.bytesToWords = function (bytes) {
var words = [];
for (var i = 0, b = 0; i < bytes.length; i++, b += 8) {
words[b >>> 5] |= bytes[i] << (24 - b % 32);
}
return words;
}
exports.wordsToBytes = function (words) {
var bytes = [];
for (var b = 0; b < words.length * 32; b += 8) {
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
}
return bytes;
}
exports.bytesToWordArray = function (bytes) {
return new WordArray.init(exports.bytesToWords(bytes), bytes.length)
}
exports.wordArrayToBytes = function (wordArray) {
return exports.wordsToBytes(wordArray.words)
}
/** /**
* Calculate RIPEMD160(SHA256(data)). * Calculate RIPEMD160(SHA256(data)).
@ -66,15 +11,14 @@ exports.wordArrayToBytes = function (wordArray) {
* array. * array.
*/ */
exports.sha256ripe160 = function (data) { exports.sha256ripe160 = function (data) {
var wordArray = RIPEMD160(SHA256(exports.bytesToWordArray(data))) var wordArray = RIPEMD160(SHA256(convert.bytesToWordArray(data)))
return exports.wordArrayToBytes(wordArray) return convert.wordArrayToBytes(wordArray)
} }
exports.HmacFromBytesToBytes = function (hasher, message, key) { exports.HmacFromBytesToBytes = function (hasher, message, key) {
var hmac = HMAC.create(hasher, exports.bytesToWordArray(key)) var hmac = HMAC.create(hasher, convert.bytesToWordArray(key))
hmac.update(exports.bytesToWordArray(message)) hmac.update(convert.bytesToWordArray(message))
return exports.wordArrayToBytes(hmac.finalize()) return convert.wordArrayToBytes(hmac.finalize())
} }
exports.error = function(msg) { exports.error = function(msg) {

View file

@ -1,16 +1,12 @@
var Script = require('./script'); var Script = require('./script');
var ECKey = require('./eckey').ECKey; var ECKey = require('./eckey').ECKey;
var conv = require('./convert'); var convert = require('./convert');
var util = require('./util');
var assert = require('assert'); var assert = require('assert');
var BigInteger = require('./jsbn/jsbn'); var BigInteger = require('./jsbn/jsbn');
var Transaction = require('./transaction').Transaction; var Transaction = require('./transaction').Transaction;
var TransactionIn = require('./transaction').TransactionIn; var TransactionIn = require('./transaction').TransactionIn;
var TransactionOut = require('./transaction').TransactionOut; var TransactionOut = require('./transaction').TransactionOut;
var HDWallet = require('./hdwallet.js') var HDWallet = require('./hdwallet.js')
var SecureRandom = require('./jsbn/rng'); var SecureRandom = require('./jsbn/rng');
var rng = new SecureRandom(); var rng = new SecureRandom();
@ -43,7 +39,7 @@ var Wallet = function (seed, options) {
if (!seed) { if (!seed) {
var seedBytes = new Array(32); var seedBytes = new Array(32);
rng.nextBytes(seedBytes); rng.nextBytes(seedBytes);
seed = conv.bytesToString(seedBytes) seed = convert.bytesToString(seedBytes)
} }
masterkey = new HDWallet(seed, network); masterkey = new HDWallet(seed, network);
keys = [] keys = []
@ -63,7 +59,7 @@ var Wallet = function (seed, options) {
// Processes a transaction object // Processes a transaction object
// If "verified" is true, then we trust the transaction as "final" // If "verified" is true, then we trust the transaction as "final"
this.processTx = function(tx, verified) { this.processTx = function(tx, verified) {
var txhash = conv.bytesToHex(tx.getHash()) var txhash = convert.bytesToHex(tx.getHash())
for (var i = 0; i < tx.outs.length; i++) { for (var i = 0; i < tx.outs.length; i++) {
if (this.addresses.indexOf(tx.outs[i].address.toString()) >= 0) { if (this.addresses.indexOf(tx.outs[i].address.toString()) >= 0) {
me.outputs[txhash+':'+i] = { me.outputs[txhash+':'+i] = {

View file

@ -1,14 +1,14 @@
/* global describe, it */ /* global describe, it */
var assert = require('assert'); var assert = require('assert');
var base58 = require('../').base58; var base58 = require('../').base58;
var conv = require('../').convert; var convert = require('../').convert;
describe('base58', function() { describe('base58', function() {
describe('decode', function() { describe('decode', function() {
it('validates known examples', function() { it('validates known examples', function() {
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ'; var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ';
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d'; var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d';
assert.deepEqual(base58.decode(enc), conv.hexToBytes(hex)); assert.deepEqual(base58.decode(enc), convert.hexToBytes(hex));
}) })
}) })
@ -16,7 +16,7 @@ describe('base58', function() {
it('handles known examples', function() { it('handles known examples', function() {
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ'; var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ';
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d'; var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d';
assert.equal(base58.encode(conv.hexToBytes(hex)), enc); assert.equal(base58.encode(convert.hexToBytes(hex)), enc);
}) })
}) })

View file

@ -44,4 +44,31 @@ describe('convert', function() {
assert.equal(b64('foobar'), 'Zm9vYmFy') assert.equal(b64('foobar'), 'Zm9vYmFy')
}) })
}) })
describe('byte array and word array conversions', function(){
var bytes, wordArray;
beforeEach(function(){
bytes = [
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
]
wordArray = {
words: [1659439025, 1556031445, 1112775147, -151979184, -340226280],
sigBytes: 20
}
})
describe('bytesToWords', function() {
it('works', function() {
assert.deepEqual(convert.bytesToWordArray(bytes), wordArray)
})
})
describe('bytesToWords', function() {
it('works', function() {
assert.deepEqual(convert.wordArrayToBytes(wordArray), bytes)
})
})
})
}) })

View file

@ -10,10 +10,10 @@ var rng = new SecureRandom();
var ecparams = sec('secp256k1'); var ecparams = sec('secp256k1');
var ECPointFp = bitcoinjs.ECPointFp; var ECPointFp = bitcoinjs.ECPointFp;
var util = require('../src/util'); var convert = require('../src/convert');
function sha256FromBytesToBytes(message){ function sha256FromBytesToBytes(message){
return util.wordArrayToBytes(SHA256(util.bytesToWordArray(message))) return convert.wordArrayToBytes(SHA256(convert.bytesToWordArray(message)))
} }
it('Keys & Key Management', function () { it('Keys & Key Management', function () {

View file

@ -1,33 +0,0 @@
var util = require('../src/util.js')
var assert = require('assert')
describe('util', function() {
describe('byte array and word array conversions', function(){
var bytes, wordArray;
beforeEach(function(){
bytes = [
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
]
wordArray = {
words: [1659439025, 1556031445, 1112775147, -151979184, -340226280],
sigBytes: 20
}
})
describe('bytesToWords', function() {
it('works', function() {
assert.deepEqual(util.bytesToWordArray(bytes), wordArray)
})
})
describe('bytesToWords', function() {
it('works', function() {
assert.deepEqual(util.wordArrayToBytes(wordArray), bytes)
})
})
})
})