Merge pull request #140 from matiu/bug/fix-ripe160-and-address
Bug/fix ripe160 and address
This commit is contained in:
commit
c565d6207c
|
@ -37,14 +37,11 @@ requireWhenAccessed('PrivateKey', './PrivateKey');
|
||||||
requireWhenAccessed('RpcClient', './RpcClient');
|
requireWhenAccessed('RpcClient', './RpcClient');
|
||||||
requireWhenAccessed('Wallet', './Wallet');
|
requireWhenAccessed('Wallet', './Wallet');
|
||||||
requireWhenAccessed('WalletKey', './WalletKey');
|
requireWhenAccessed('WalletKey', './WalletKey');
|
||||||
|
requireWhenAccessed('PeerManager', './PeerManager');
|
||||||
module.exports.Buffer = Buffer;
|
module.exports.Buffer = Buffer;
|
||||||
|
|
||||||
if (typeof process.versions === 'undefined') {
|
if (typeof process.versions === 'undefined') {
|
||||||
// Browser specific
|
// Browser specific
|
||||||
module.exports.bignum.config({EXPONENTIAL_AT: 9999999, DECIMAL_PLACES: 0, ROUNDING_MODE: 1});
|
module.exports.bignum.config({EXPONENTIAL_AT: 9999999, DECIMAL_PLACES: 0, ROUNDING_MODE: 1});
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// Nodejs specific
|
|
||||||
requireWhenAccessed('PeerManager', './PeerManager');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
|
|
||||||
cd vendor/
|
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 ../
|
mv vendor-bundle.js ../
|
||||||
cd ../
|
cd ../
|
||||||
|
|
||||||
|
|
|
@ -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;
|
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);
|
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.crypto31 = CryptoJS;
|
||||||
module.exports.RIPEMD160 = CryptoJS.RIPEMD160;
|
|
||||||
module.exports.WordArray = CryptoJS.lib.WordArray;
|
|
|
@ -19,6 +19,7 @@
|
||||||
div.innerHTML += s + '<br />';
|
div.innerHTML += s + '<br />';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
print('<hr> <h1>Address</h1>' );
|
||||||
var addrStrings = [
|
var addrStrings = [
|
||||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
|
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
|
||||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
||||||
|
@ -38,34 +39,57 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
print('<hr>');
|
print('<hr> <h1>KeyModule</h1>' );
|
||||||
|
|
||||||
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>');
|
|
||||||
/*
|
/*
|
||||||
Using bitcore root module
|
Using bitcore root module
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var k = bitcore.KeyModule.Key.generateSync();
|
var k = bitcore.KeyModule.Key.generateSync();
|
||||||
|
|
||||||
print ('Generate Key Pair:');
|
print ('Generate Key Pair:');
|
||||||
print ('Private:' + buffertools.toHex(k.private));
|
print ('Private:' + bitcore.buffertools.toHex(k.private));
|
||||||
print ('Public:' + buffertools.toHex(k.public));
|
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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -50,6 +50,54 @@ describe('WalletKey', function() {
|
||||||
s.privKey.private.toString().should.equal(s2.privKey.private.toString());
|
s.privKey.private.toString().should.equal(s2.privKey.private.toString());
|
||||||
s.privKey.public.toString().should.equal(s2.privKey.public.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');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
describe('#ripemd160', function() {
|
||||||
var ripemdData = [
|
var ripemdData = [
|
||||||
['somemessage123', '12fd01a7ec6b9ba23b3a5c16fbfab3ac19624a88'],
|
['somemessage123', '12fd01a7ec6b9ba23b3a5c16fbfab3ac19624a88'],
|
||||||
|
@ -44,7 +71,7 @@ describe('util', function() {
|
||||||
];
|
];
|
||||||
ripemdData.forEach(function(datum) {
|
ripemdData.forEach(function(datum) {
|
||||||
it('should work for ' + datum[0], function() {
|
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]);
|
buffertools.toHex(r).should.equal(datum[1]);
|
||||||
});
|
});
|
||||||
it('should work for Buffer ' + datum[0], function() {
|
it('should work for Buffer ' + datum[0], function() {
|
||||||
|
|
19
util/util.js
19
util/util.js
|
@ -14,14 +14,21 @@ if (!process.versions) {
|
||||||
var sha256 = exports.sha256 = function (data) {
|
var sha256 = exports.sha256 = function (data) {
|
||||||
return new Buffer(crypto.createHash('sha256').update(data).digest('binary'), 'binary');
|
return new Buffer(crypto.createHash('sha256').update(data).digest('binary'), 'binary');
|
||||||
};
|
};
|
||||||
|
|
||||||
var ripe160 = exports.ripe160 = function (data) {
|
var ripe160 = exports.ripe160 = function (data) {
|
||||||
|
if (!Buffer.isBuffer(data)) {
|
||||||
|
throw new Error('arg should be a buffer');
|
||||||
|
}
|
||||||
|
|
||||||
if (!process.versions) {
|
if (!process.versions) {
|
||||||
var RIPEMD160 = browser.RIPEMD160;
|
|
||||||
var WordArray = browser.WordArray;
|
var w = new browser.crypto31.lib.WordArray.init(Crypto.util.bytesToWords(data), data.length);
|
||||||
data = data.toString();
|
var wordArray = browser.crypto31.RIPEMD160(w);
|
||||||
var result = RIPEMD160(data) + '';
|
var words = wordArray.words;
|
||||||
return new Buffer(result, 'hex');
|
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');
|
return new Buffer(crypto.createHash('rmd160').update(data).digest('binary'), 'binary');
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue