Migrates all usage of crypto-js/sha256 to ./crypto

This commit is contained in:
Daniel Cousens 2014-04-08 22:13:03 +10:00
parent 81d9c8e759
commit c99a576fbd
11 changed files with 90 additions and 77 deletions

View file

@ -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) {
@ -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,
@ -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)

View file

@ -1,9 +1,40 @@
var convert = require('./convert.js')
var Crypto = require('crypto-js')
var RIPEMD160 = Crypto.RIPEMD160
var SHA256 = Crypto.SHA256
// Crypto, crypto, where art thou crypto
var CryptoJS = require('crypto-js')
var crypto = require('crypto')
var convert = require('./convert')
exports.sha256ripe160 = function (data) {
var wordArray = RIPEMD160(SHA256(convert.bytesToWordArray(data)))
return convert.wordArrayToBytes(wordArray)
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 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
}

View file

@ -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 crypto = require('./crypto')
var ecparams = sec("secp256k1")
// input can be nothing, array of bytes, hex string, or base58 string
@ -175,7 +175,7 @@ ECPubKey.prototype.toString = ECPubKey.prototype.toHex
ECPubKey.prototype.getAddress = function(version) {
version = version || Network.mainnet.addressVersion
return new Address(crypto.sha256ripe160(this.toBytes()), version)
return new Address(crypto.hash160(this.toBytes()), version)
}
ECPubKey.prototype.verify = function(hash, sig) {

View file

@ -1,30 +1,25 @@
var convert = require('./convert.js')
var base58 = require('./base58.js')
var Address = require('./address')
var assert = require('assert')
var format = require('util').format
var base58 = require('./base58')
var convert = require('./convert')
var CJS = require('crypto-js')
var crypto = require('./crypto')
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 ECKey = require('./eckey').ECKey
var ECPubKey = require('./eckey').ECPubKey
var format = require('util').format
var Network = require('./network')
var crypto2 = require('crypto')
function HmacSHA512(buffer, secret) {
var words = convert.bytesToWordArray(buffer)
var hash = CJS.HmacSHA512(words, secret)
function sha256(buf) {
var hash = crypto2.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)) {
@ -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)
@ -131,7 +126,7 @@ HDWallet.fromBytes = function(input) {
}
HDWallet.prototype.getIdentifier = function() {
return crypto.sha256ripe160(this.pub.toBytes())
return crypto.hash160(this.pub.toBytes())
}
HDWallet.prototype.getFingerprint = function() {
@ -139,7 +134,7 @@ HDWallet.prototype.getFingerprint = function() {
}
HDWallet.prototype.getAddress = function() {
return new Address(crypto.sha256ripe160(this.pub.toBytes()), this.getKeyVersion())
return new Address(crypto.hash160(this.pub.toBytes()), this.getKeyVersion())
}
HDWallet.prototype.toBytes = function(priv) {
@ -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,
@ -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')
@ -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())
}

View file

@ -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,
@ -12,7 +13,6 @@ module.exports = {
Script: require('./script'),
Opcode: require('./opcode'),
Transaction: T.Transaction,
crypto: require('./crypto'),
TransactionIn: T.TransactionIn,
TransactionOut: T.TransactionOut,
ECPointFp: require('./jsbn/ec').ECPointFp,

View file

@ -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')
@ -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

View file

@ -144,10 +144,10 @@ Script.prototype.toScriptHash = function() {
}
if (outType == 'P2SH') {
return crypto.sha256ripe160(this.buffer)
return crypto.hash160(this.buffer)
}
return crypto.sha256ripe160(this.buffer)
return crypto.hash160(this.buffer)
}
//TODO: support testnet
@ -257,7 +257,7 @@ Script.prototype.simpleInPubKey = function() {
* This method is useful for indexing transactions.
*/
Script.prototype.simpleInHash = function() {
return crypto.sha256ripe160(this.simpleInPubKey())
return crypto.hash160(this.simpleInPubKey())
}
/**

View file

@ -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 crypto = require('./crypto')
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) }
@ -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)
}
/**
@ -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 ()
@ -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 = crypto.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)
}

View file

@ -1,17 +1,13 @@
var assert = require('assert')
var bitcoinjs = require('../')
var crypto = require('../').crypto
var sec = require('../src/jsbn/sec')
var BigInteger = require('../src/jsbn/jsbn.js')
var SHA256 = require('crypto-js/sha256')
var rng = require('secure-random')
var ecparams = sec('secp256k1')
var ECPointFp = bitcoinjs.ECPointFp
var convert = require('../src/convert')
function sha256FromBytesToBytes(message){
return convert.wordArrayToBytes(SHA256(convert.bytesToWordArray(message)))
}
it('Keys & Key Management', function () {
var p1 = bitcoinjs.Key().getPub().toBytes()
assert.equal(p1.length, 65)
@ -37,7 +33,7 @@ it('Signing and Verifying', function () {
assert.ok(s1.verify(BigInteger.ZERO, sig_a))
var message = new BigInteger(1024, rng).toByteArrayUnsigned()
var hash = sha256FromBytesToBytes(message)
var hash = crypto.sha256(message)
var sig_b = s1.sign(hash)
assert.ok(sig_b, 'Sign random string')
assert.ok(s1.verify(hash, sig_b))
@ -49,7 +45,7 @@ it('Signing and Verifying', function () {
'8a33f50d7cefb96a5dab897b5efcb99cbafb0d777cb83fc9b2115b69c0fa' +
'3d82507b932b84e4')
var hash2 = sha256FromBytesToBytes(message2)
var hash2 = crypto.sha256(message2)
var sig_c = bitcoinjs.convert.hexToBytes(
'3044022038d9b8dd5c9fbf330565c1f51d72a59ba869aeb2c2001be959d3' +

View file

@ -3,7 +3,6 @@ var assert = require('assert')
var Address = require('../src/address.js')
var Network = require('../src/network.js')
var crypto = require('../').crypto
var sha256ripe160 = crypto.sha256ripe160
var Convert = require('../src/convert.js')
var bytesToHex = Convert.bytesToHex
var hexToBytes = Convert.hexToBytes
@ -83,7 +82,7 @@ describe('Script', function() {
it('should create valid multi-sig address', function() {
script = Script.createMultiSigOutputScript(numSigs, compressedPubKeys.map(hexToBytes))
multisig = sha256ripe160(script.buffer)
multisig = crypto.hash160(script.buffer)
var multiSigAddress = Address(multisig, network).toString()
assert.ok(Address.validate(multiSigAddress))
@ -107,7 +106,7 @@ describe('Script', function() {
assert.equal(sigs[0], '02ea1297665dd733d444f31ec2581020004892cdaaf3dd6c0107c615afb839785f')
assert.equal(sigs[1], '02fab2dea1458990793f56f42e4a47dbf35a12a351f26fa5d7e0cc7447eaafa21f')
assert.equal(sigs[2], '036c6802ce7e8113723dd92cdb852e492ebb157a871ca532c3cb9ed08248ff0e19')
assert.equal(Address(sha256ripe160(redeemScript), network).toString(), '32vYjxBb7pHJJyXgNk8UoK3BdRDxBzny2v')
assert.equal(Address(crypto.hash160(redeemScript), network).toString(), '32vYjxBb7pHJJyXgNk8UoK3BdRDxBzny2v')
})
})
})

View file

@ -7,8 +7,7 @@ var Script = require('../src/script.js')
var convert = require('../src/convert.js')
var assert = require('assert')
var sinon = require('sinon')
var SHA256 = require('crypto-js/sha256')
var Crypto = require('crypto-js')
var crypto = require('../').crypto
var fixtureTxes = require('./fixtures/mainnet_tx')
var fixtureTx1Hex = fixtureTxes.prevTx
@ -17,7 +16,7 @@ var fixtureTx2Hex = fixtureTxes.tx
describe('Wallet', function() {
var seed, wallet
beforeEach(function(){
seed = convert.wordArrayToBytes(SHA256("don't use a string seed like this in real life"))
seed = crypto.sha256("don't use a string seed like this in real life")
wallet = new Wallet(seed)
})