Merge pull request #140 from matiu/bug/fix-ripe160-and-address

Bug/fix ripe160 and address
This commit is contained in:
Ryan X. Charles 2014-03-12 18:03:40 -04:00
commit c565d6207c
8 changed files with 133 additions and 32 deletions

View File

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

View File

@ -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 ../

View File

@ -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<<k[b]|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<<l[b]|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;

View File

@ -19,6 +19,7 @@
div.innerHTML += s + '<br />';
};
print('<hr> <h1>Address</h1>' );
var addrStrings = [
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
@ -38,34 +39,57 @@
}
});
print('<hr>');
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('<hr>');
print('<hr> <h1>KeyModule</h1>' );
/*
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('<hr>');
print('<hr> <h1>PeerManager</h1>' );
console.log('[example.html.65:PeerManager:]'); //TODO
var p = new bitcore.PeerManager();
var pm = require('PeerManager');
print('<hr> <h1>Util</h1>' );
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('<hr><h1>WalletKey </h1>');
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);
</script>
</body>
</html>

View File

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

View File

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

View File

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