diff --git a/bitcore.js b/bitcore.js index c66b5c5df..0b12d8385 100644 --- a/bitcore.js +++ b/bitcore.js @@ -37,14 +37,11 @@ requireWhenAccessed('PrivateKey', './PrivateKey'); requireWhenAccessed('RpcClient', './RpcClient'); requireWhenAccessed('Wallet', './Wallet'); requireWhenAccessed('WalletKey', './WalletKey'); +requireWhenAccessed('PeerManager', './PeerManager'); module.exports.Buffer = Buffer; if (typeof process.versions === 'undefined') { // Browser specific module.exports.bignum.config({EXPONENTIAL_AT: 9999999, DECIMAL_PLACES: 0, ROUNDING_MODE: 1}); } -else { - // Nodejs specific - requireWhenAccessed('PeerManager', './PeerManager'); -} diff --git a/browser/concat.sh b/browser/concat.sh index b8676e980..f747c6684 100755 --- a/browser/concat.sh +++ b/browser/concat.sh @@ -1,7 +1,7 @@ #! /bin/bash cd vendor/ -cat browser-adapter.js crypto.js ripemd160.js jsbn.js jsbn2.js prng4.js util.js rng.js ec.js sec.js ecdsa.js eckey.js > vendor-bundle.js +cat browser-adapter.js crypto-2.0.js crypto-3.1.js jsbn.js jsbn2.js prng4.js util.js rng.js ec.js sec.js ecdsa.js eckey.js > vendor-bundle.js mv vendor-bundle.js ../ cd ../ diff --git a/browser/vendor/crypto.js b/browser/vendor/crypto-2.0.js similarity index 100% rename from browser/vendor/crypto.js rename to browser/vendor/crypto-2.0.js diff --git a/browser/vendor/ripemd160.js b/browser/vendor/crypto-3.1.js similarity index 98% rename from browser/vendor/ripemd160.js rename to browser/vendor/crypto-3.1.js index a230b4b7e..044f8c2e4 100644 --- a/browser/vendor/ripemd160.js +++ b/browser/vendor/crypto-3.1.js @@ -28,6 +28,4 @@ g)).finalize(c)}}});var b=e.algo={};return e}(Math); f+(((m|~n)^p)+c[2]):64>b?f+((m&p|n&~p)+c[3]):f+((m^(n|~p))+c[4]),f|=0,f=f<>>32-k[b],f=f+x|0,B=x,x=p,p=n<<10|n>>>22,n=m,m=f,f=C+g[e+j[b]]|0,f=16>b?f+((q^(r|~s))+h[0]):32>b?f+((q&s|r&~s)+h[1]):48>b?f+(((q|~r)^s)+h[2]):64>b?f+((q&r|~q&s)+h[3]):f+((q^r^s)+h[4]),f|=0,f=f<>>32-l[b],f=f+y|0,C=y,y=s,s=r<<10|r>>>22,r=q,q=f;f=a[1]+n+s|0;a[1]=a[2]+p+y|0;a[2]=a[3]+x+C|0;a[3]=a[4]+B+q|0;a[4]=a[0]+m+r|0;a[0]=f},_doFinalize:function(){var g=this._data,e=g.words,b=8*this._nDataBytes,a=8*g.sigBytes; e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;g.sigBytes=4*(e.length+1);this._process();g=this._hash;e=g.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return g},clone:function(){var e=l.clone.call(this);e._hash=this._hash.clone();return e}});j.RIPEMD160=l._createHelper(k);j.HmacRIPEMD160=l._createHmacHelper(k)})(Math); - -module.exports.RIPEMD160 = CryptoJS.RIPEMD160; -module.exports.WordArray = CryptoJS.lib.WordArray; +module.exports.crypto31 = CryptoJS; diff --git a/examples/example.html b/examples/example.html index 951ef1e72..e2b132041 100644 --- a/examples/example.html +++ b/examples/example.html @@ -19,6 +19,7 @@ div.innerHTML += s + '
'; }; + print('

Address

' ); var addrStrings = [ "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", "1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", @@ -38,34 +39,57 @@ } }); - print('
'); - - var Key = require('KeyModule').Key; - var buffertools = require('buffertools'); - var k = Key.generateSync(); - - print ('Generate Key Pair:'); - print ('Private:' + buffertools.toHex(k.private)); - print ('Public:' + buffertools.toHex(k.public)); - - print('
'); + print('

KeyModule

' ); /* Using bitcore root module */ - var bitcore = require('bitcore'); var k = bitcore.KeyModule.Key.generateSync(); print ('Generate Key Pair:'); - print ('Private:' + buffertools.toHex(k.private)); - print ('Public:' + buffertools.toHex(k.public)); + print ('Private:' + bitcore.buffertools.toHex(k.private)); + print ('Public:' + bitcore.buffertools.toHex(k.public)); - print('
'); + print('

PeerManager

' ); -console.log('[example.html.65:PeerManager:]'); //TODO + var p = new bitcore.PeerManager(); - var pm = require('PeerManager'); + print('

Util

' ); + var coinUtil = bitcore.util; + + var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071' + var pubKeyHash = coinUtil.sha256(pk); + print(bitcore.buffertools.toHex(pubKeyHash)); + pubKeyHash = coinUtil.sha256ripe160(pk); + print(bitcore.buffertools.toHex(pubKeyHash)); + + + var Buffer = bitcore.Buffer; + + pubKeyHash = coinUtil.ripe160(new bitcore.Buffer('hola')); + print(bitcore.buffertools.toHex(pubKeyHash)); + + var bu = new Buffer('a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d', 'hex'); + print(bitcore.buffertools.toHex(bu)); + + var pubKeyHash2 = coinUtil.ripe160(bu); + print(bitcore.buffertools.toHex(pubKeyHash2)); + + + print('

WalletKey

'); + var WalletKey = bitcore.WalletKey; + var networks = bitcore.networks; + + var priv = 'L4cEVwoNDeYdCQfFJAGkGKPnE2TmqLEuBn4znQChD2ojjQRJVKpU'; + var s = new WalletKey({ + network: networks.livenet + }); + s.fromObj({ priv: priv}); + var o = s.storeObj(); + print("Private: " + o.priv); + print("Public: " + o.pub); + print("Addr: " + o.addr); diff --git a/test/test.WalletKey.js b/test/test.WalletKey.js index eb29ce02c..6bd8ababf 100644 --- a/test/test.WalletKey.js +++ b/test/test.WalletKey.js @@ -50,6 +50,54 @@ describe('WalletKey', function() { s.privKey.private.toString().should.equal(s2.privKey.private.toString()); s.privKey.public.toString().should.equal(s2.privKey.public.toString()); }); + + it('should import priv key testnet / compressed', function() { + var priv = 'cU5NxfpfecLCUWnJyoUF6dCZqCfLSAZnTBPraCPis2if8iHHbNk1'; + var s = new WalletKey({ + network: networks.testnet + }); + s.fromObj({ priv: priv}); + s.privKey.compressed.should.equal(true); + var o = s.storeObj(); + o.priv.should.equal(priv); + o.pub.should.equal('03fd4788dd045c791043d739dd10d5e8b15aa6c9702f26116dde88ebbce6eb7706'); + o.addr.should.equal('mqBsTsnVF2zifoGtm7UsXRfdJUr52Jg5d4'); + }); + + + it('should import priv key livenet / uncompressed', function() { + + //this is a WIF priv, compress flag = false + var priv = '5KMpLZExnGzeU3oC9qZnKBt7yejLUS8boPiWag33TMX2XEK2Ayc'; + var s = new WalletKey({ + network: networks.livenet, + }); + s.fromObj({ priv: priv}); + s.privKey.compressed.should.equal(false); + var o = s.storeObj(); + o.priv.should.equal(priv); + o.pub.should.equal('04470bbc100896e4df317526efa22f15aac3681ef02d230d00d15b4cba8eea1e88477523d644f20edb6b344f06bba77a9dff81be69d74282866b0b7f3e9d0d910b'); + o.addr.should.equal('1v5GwPNomikEqmMe7h6q1jRw62WKTD6Xo'); + }); + + + it('should import priv key livenet / compressed', function() { + + //this is a WIF priv, compress flag = true + var priv = 'L4cEVwoNDeYdCQfFJAGkGKPnE2TmqLEuBn4znQChD2ojjQRJVKpU'; + var s = new WalletKey({ + network: networks.livenet, + }); + s.fromObj({ priv: priv}); + s.privKey.compressed.should.equal(true); + var o = s.storeObj(); + o.priv.should.equal(priv); + o.pub.should.equal('03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071'); + o.addr.should.equal('1JEgFNDmEUdd6FvNhDBqSuw2uZ4yisSr7A'); + }); + + + }); diff --git a/test/test.util.js b/test/test.util.js index e3de356a8..99ff94911 100644 --- a/test/test.util.js +++ b/test/test.util.js @@ -36,6 +36,33 @@ describe('util', function() { }); }); }); + describe('#ripe160', function() { + var pk = 'a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d'; + it('should work for ' + pk, function() { + var pubKeyHash = coinUtil.ripe160(new Buffer(pk,'hex')); + var pkh = buffertools.toHex(pubKeyHash); + pkh.should.equal('d166a41f27fd4b158f70314e5eee8998bf3d97d5'); + }); + }); + + + describe('#sha256', function() { + var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071' + it('should work for ' + pk, function() { + var pubKeyHash = coinUtil.sha256(pk); + var pkh = buffertools.toHex(pubKeyHash); + pkh.should.equal('a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d'); + }); + }); + + describe('#sha256ripe160', function() { + var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071' + it('should work for ' + pk, function() { + var pubKeyHash = coinUtil.sha256ripe160(pk); + var pkh = buffertools.toHex(pubKeyHash); + pkh.should.equal('d166a41f27fd4b158f70314e5eee8998bf3d97d5'); + }); + }); describe('#ripemd160', function() { var ripemdData = [ ['somemessage123', '12fd01a7ec6b9ba23b3a5c16fbfab3ac19624a88'], @@ -44,7 +71,7 @@ describe('util', function() { ]; ripemdData.forEach(function(datum) { it('should work for ' + datum[0], function() { - var r = coinUtil.ripe160(datum[0]); + var r = coinUtil.ripe160( new bitcore.Buffer(datum[0])); buffertools.toHex(r).should.equal(datum[1]); }); it('should work for Buffer ' + datum[0], function() { diff --git a/util/util.js b/util/util.js index 74256070d..d90cb2583 100644 --- a/util/util.js +++ b/util/util.js @@ -14,14 +14,21 @@ if (!process.versions) { var sha256 = exports.sha256 = function (data) { return new Buffer(crypto.createHash('sha256').update(data).digest('binary'), 'binary'); }; - var ripe160 = exports.ripe160 = function (data) { + if (!Buffer.isBuffer(data)) { + throw new Error('arg should be a buffer'); + } + if (!process.versions) { - var RIPEMD160 = browser.RIPEMD160; - var WordArray = browser.WordArray; - data = data.toString(); - var result = RIPEMD160(data) + ''; - return new Buffer(result, 'hex'); + + var w = new browser.crypto31.lib.WordArray.init(Crypto.util.bytesToWords(data), data.length); + var wordArray = browser.crypto31.RIPEMD160(w); + var words = wordArray.words; + var answer = []; + for (var b = 0; b < words.length * 32; b += 8) { + answer.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF); + } + return new Buffer(answer, 'hex'); } return new Buffer(crypto.createHash('rmd160').update(data).digest('binary'), 'binary'); };