Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/address.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
var base58 = require('./base58')
var base58check = require('./base58check')
var convert = require('./convert')
var error = require('./util').error
var mainnet = require('./network').mainnet.addressVersion

function Address(bytes, version) {
Expand All @@ -25,7 +24,7 @@ function Address(bytes, version) {
this.version = version || mainnet
}
else {
error('invalid or unrecognized input')
throw new Error('Invalid or unrecognized input')
}
}
else {
Expand Down
13 changes: 3 additions & 10 deletions src/base58check.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
// https://en.bitcoin.it/wiki/Base58Check_encoding
var assert = require('assert')
var base58 = require('./base58')
var crypto = require('crypto')

function sha256(buf) {
var hash = crypto.createHash('sha256')
hash.update(buf)

return hash.digest()
}
var crypto = require('./crypto')

// Encode a buffer as a base58-check-encoded string
function encode(buffer, version) {
Expand All @@ -19,7 +12,7 @@ function encode(buffer, version) {
var payload = new Buffer(buffer)

var message = Buffer.concat([version, payload])
var checksum = sha256(sha256(message)).slice(0, 4)
var checksum = crypto.hash256(message).slice(0, 4)

return base58.encode(Buffer.concat([
message,
Expand All @@ -33,7 +26,7 @@ function decode(string) {

var message = buffer.slice(0, -4)
var checksum = buffer.slice(-4)
var newChecksum = sha256(sha256(message)).slice(0, 4)
var newChecksum = crypto.hash256(message).slice(0, 4)

assert.deepEqual(newChecksum, checksum)

Expand Down
40 changes: 40 additions & 0 deletions src/crypto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Crypto, crypto, where art thou crypto
var CryptoJS = require('crypto-js')
var crypto = require('crypto')
var convert = require('./convert')

function hash160(buffer) {
if (!Buffer.isBuffer(buffer)) buffer = new Buffer(buffer) // FIXME: transitionary

var step1 = sha256(buffer)

var step2a = convert.bytesToWordArray(step1)
var step2b = CryptoJS.RIPEMD160(step2a)

return new Buffer(convert.wordArrayToBytes(step2b))
}

function hash256(buffer) {
if (!Buffer.isBuffer(buffer)) buffer = new Buffer(buffer) // FIXME: transitionary

return sha256(sha256(buffer))
}

function sha1(buffer) {
if (!Buffer.isBuffer(buffer)) buffer = new Buffer(buffer) // FIXME: transitionary

return crypto.createHash('sha1').update(buffer).digest()
}

function sha256(buffer) {
if (!Buffer.isBuffer(buffer)) buffer = new Buffer(buffer) // FIXME: transitionary

return crypto.createHash('sha256').update(buffer).digest()
}

module.exports = {
sha1: sha1,
sha256: sha256,
hash160: hash160,
hash256: hash256
}
6 changes: 3 additions & 3 deletions src/eckey.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
var Address = require('./address')
var assert = require('assert')
var convert = require('./convert')
var base58check = require('./base58check')
var BigInteger = require('./jsbn/jsbn')
var convert = require('./convert')
var crypto = require('./crypto')
var ecdsa = require('./ecdsa')
var ECPointFp = require('./jsbn/ec').ECPointFp
var sec = require('./jsbn/sec')
var Network = require('./network')
var util = require('./util')
var ecparams = sec("secp256k1")

// input can be nothing, array of bytes, hex string, or base58 string
Expand Down Expand Up @@ -175,7 +175,7 @@ ECPubKey.prototype.toString = ECPubKey.prototype.toHex
ECPubKey.prototype.getAddress = function(version) {
version = version || Network.mainnet.addressVersion

return new Address(util.sha256ripe160(this.toBytes()), version)
return new Address(crypto.hash160(this.toBytes()), version)
}

ECPubKey.prototype.verify = function(hash, sig) {
Expand Down
43 changes: 19 additions & 24 deletions src/hdwallet.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
var convert = require('./convert.js')
var base58 = require('./base58.js')
var Address = require('./address')
var assert = require('assert')
var base58 = require('./base58')
var convert = require('./convert')
var CJS = require('crypto-js')
var crypto = require('./crypto')
var ECKey = require('./eckey').ECKey
var ECPubKey = require('./eckey').ECPubKey
var format = require('util').format
var util = require('./util.js')
var Crypto = require('crypto-js')
var HmacSHA512 = Crypto.HmacSHA512
var HMAC= Crypto.algo.HMAC
var ECKey = require('./eckey.js').ECKey
var ECPubKey = require('./eckey.js').ECPubKey
var Address = require('./address.js')
var Network = require('./network')

var crypto = require('crypto')
function HmacSHA512(buffer, secret) {
var words = convert.bytesToWordArray(buffer)
var hash = CJS.HmacSHA512(words, secret)

function sha256(buf) {
var hash = crypto.createHash('sha256')
hash.update(buf)

return hash.digest()
return convert.wordArrayToBytes(hash)
}

function HDWallet(seed, network) {
if (seed === undefined) return;

var seedWords = convert.bytesToWordArray(seed)
var I = convert.wordArrayToBytes(HmacSHA512(seedWords, 'Bitcoin seed'))
var I = HmacSHA512(seed, 'Bitcoin seed')
this.chaincode = I.slice(32)
this.network = network || 'mainnet'
if(!Network.hasOwnProperty(this.network)) {
Expand Down Expand Up @@ -57,7 +52,7 @@ HDWallet.fromBase58 = function(string) {

var payload = buffer.slice(0, -4)
var checksum = buffer.slice(-4)
var newChecksum = sha256(sha256(payload)).slice(0, 4)
var newChecksum = crypto.hash256(payload).slice(0, 4)

assert.deepEqual(newChecksum, checksum)
assert.equal(payload.length, HDWallet.LENGTH)
Expand Down Expand Up @@ -131,15 +126,15 @@ HDWallet.fromBytes = function(input) {
}

HDWallet.prototype.getIdentifier = function() {
return util.sha256ripe160(this.pub.toBytes())
return crypto.hash160(this.pub.toBytes())
}

HDWallet.prototype.getFingerprint = function() {
return this.getIdentifier().slice(0, 4)
return Array.prototype.slice.call(this.getIdentifier(), 0, 4)
}

HDWallet.prototype.getAddress = function() {
return new Address(util.sha256ripe160(this.pub.toBytes()), this.getKeyVersion())
return new Address(crypto.hash160(this.pub.toBytes()), this.getKeyVersion())
}

HDWallet.prototype.toBytes = function(priv) {
Expand Down Expand Up @@ -192,7 +187,7 @@ HDWallet.prototype.toHex = function(priv) {

HDWallet.prototype.toBase58 = function(priv) {
var buffer = new Buffer(this.toBytes(priv))
var checksum = sha256(sha256(buffer)).slice(0, 4)
var checksum = crypto.hash256(buffer).slice(0, 4)

return base58.encode(Buffer.concat([
buffer,
Expand All @@ -205,7 +200,7 @@ HDWallet.prototype.derive = function(i) {
, iBytes = convert.numToBytes(i, 4).reverse()
, cPar = this.chaincode
, usePriv = i >= HDWallet.HIGHEST_BIT
, SHA512 = Crypto.algo.SHA512
, SHA512 = CJS.algo.SHA512

if (usePriv) {
assert(this.priv, 'Private derive on public key')
Expand Down Expand Up @@ -259,7 +254,7 @@ HDWallet.prototype.getKeyVersion = function() {
HDWallet.prototype.toString = HDWallet.prototype.toBase58

function HmacFromBytesToBytes(hasher, message, key) {
var hmac = HMAC.create(hasher, convert.bytesToWordArray(key))
var hmac = CJS.algo.HMAC.create(hasher, convert.bytesToWordArray(key))
hmac.update(convert.bytesToWordArray(message))
return convert.wordArrayToBytes(hmac.finalize())
}
Expand Down
2 changes: 1 addition & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var T = require('./transaction')

module.exports = {
Address: require('./address'),
crypto: require('./crypto'),
Key: Key.ECKey,
ECKey: Key.ECKey,
ECPubKey: Key.ECPubKey,
Expand All @@ -12,7 +13,6 @@ module.exports = {
Script: require('./script'),
Opcode: require('./opcode'),
Transaction: T.Transaction,
Util: require('./util'),
TransactionIn: T.TransactionIn,
TransactionOut: T.TransactionOut,
ECPointFp: require('./jsbn/ec').ECPointFp,
Expand Down
4 changes: 2 additions & 2 deletions src/message.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

var Address = require('./address')
var convert = require('./convert')
var crypto = require('./crypto')
var ecdsa = require('./ecdsa')
var ECPubKey = require('./eckey').ECPubKey
var SHA256 = require('crypto-js/sha256')

// FIXME: magicHash is incompatible with other magic messages
var magicBytes = convert.stringToBytes('Bitcoin Signed Message:\n')
Expand All @@ -19,7 +19,7 @@ function magicHash(message) {
messageBytes
)

return convert.wordArrayToBytes(SHA256(SHA256(convert.bytesToWordArray(buffer))))
return crypto.hash256(buffer)
}

// TODO: parameterize compression instead of using ECKey.compressed
Expand Down
8 changes: 4 additions & 4 deletions src/script.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var Opcode = require('./opcode')
var util = require('./util')
var crypto = require('./crypto')
var convert = require('./convert')
var Address = require('./address')
var network = require('./network')
Expand Down Expand Up @@ -144,10 +144,10 @@ Script.prototype.toScriptHash = function() {
}

if (outType == 'P2SH') {
return util.sha256ripe160(this.buffer)
return crypto.hash160(this.buffer)
}

return util.sha256ripe160(this.buffer)
return crypto.hash160(this.buffer)
}

//TODO: support testnet
Expand Down Expand Up @@ -257,7 +257,7 @@ Script.prototype.simpleInPubKey = function() {
* This method is useful for indexing transactions.
*/
Script.prototype.simpleInHash = function() {
return util.sha256ripe160(this.simpleInPubKey())
return crypto.hash160(this.simpleInPubKey())
}

/**
Expand Down
30 changes: 15 additions & 15 deletions src/transaction.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
// FIXME: To all ye that enter here, be weary of Buffers, Arrays and Hex interchanging between the outpoints

var Address = require('./address')
var BigInteger = require('./jsbn/jsbn')
var Script = require('./script')
var util = require('./util')
var convert = require('./convert')
var crypto = require('./crypto')
var ECKey = require('./eckey').ECKey
var ECDSA = require('./ecdsa')
var Address = require('./address')
var SHA256 = require('crypto-js/sha256')

var Transaction = function (doc) {
if (!(this instanceof Transaction)) { return new Transaction(doc) }
Expand Down Expand Up @@ -201,11 +202,9 @@ Transaction.prototype.hashTransactionForSignature =
}

var buffer = txTmp.serialize()

buffer = buffer.concat(convert.numToBytes(parseInt(hashType), 4))
buffer = convert.bytesToWordArray(buffer)

return convert.wordArrayToBytes(SHA256(SHA256(buffer)))
return crypto.hash256(buffer)
}

/**
Expand All @@ -215,8 +214,10 @@ Transaction.prototype.hashTransactionForSignature =
*/
Transaction.prototype.getHash = function ()
{
var buffer = convert.bytesToWordArray(this.serialize())
return convert.wordArrayToBytes(SHA256(SHA256(buffer))).reverse()
var buffer = this.serialize()
var hash = crypto.hash256(buffer)

return Array.prototype.slice.call(hash, 0).reverse()
}

Transaction.prototype.clone = function ()
Expand Down Expand Up @@ -300,13 +301,12 @@ Transaction.prototype.sign = function(index, key, type) {
type = type || SIGHASH_ALL
key = new ECKey(key)

// TODO: getPub is slow, sha256ripe160 probably is too.
// This could be sped up a lot by providing these as inputs.
var pub = key.getPub().toBytes(),
hash160 = util.sha256ripe160(pub),
script = Script.createOutputScript(new Address(hash160)),
hash = this.hashTransactionForSignature(script, index, type),
sig = key.sign(hash).concat([type])
var pub = key.getPub().toBytes()
var hash160 = crypto.hash160(pub)
var script = Script.createOutputScript(new Address(hash160))
var hash = this.hashTransactionForSignature(script, index, type)
var sig = key.sign(hash).concat([type])

this.ins[index].script = Script.createInputScript(sig, pub)
}

Expand Down
13 changes: 0 additions & 13 deletions src/util.js

This file was deleted.

Loading