diff --git a/browser/bundle.js b/browser/bundle.js index 58fdbbb..c2dd04f 100644 --- a/browser/bundle.js +++ b/browser/bundle.js @@ -105,8 +105,8 @@ module.exports=require('hdzBvq'); },{"../util":143,"./Key":"ALJ4PS","./Point":"6tXgqr","bignum":58,"buffer":85,"buffertools":"fugeBw"}],"./lib/HierarchicalKey":[function(require,module,exports){ module.exports=require('x1O6JW'); },{}],"x1O6JW":[function(require,module,exports){ -(function(e){function i(e,i){if(e.lengthn;n++)t*=256,t+=e[n];return t}function t(e){return i(e,1)}function n(e){return i(e,4)}var r=require("soop").imports(),s=r.base58||require("./Base58").base58,h=r.coinUtil||require("../util"),a=r.Key||require("./Key"),c=r.Point||require("./Point"),o=r.SecureRandom||require("./SecureRandom"),d=r.bignum||require("bignum"),l=require("../networks"),u=new d("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",16),y=(new d("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",16),function(i){if("undefined"==typeof i||"mainnet"==i||"livenet"==i?(i="livenet",this.version=l.livenet.hkeyPrivateVersion):"testnet"==i&&(this.version=l.testnet.hkeyPrivateVersion),"livenet"==i||"testnet"==i)return this.depth=0,this.parentFingerprint=new e([0,0,0,0]),this.childIndex=new e([0,0,0,0]),this.chainCode=o.getRandomBuffer(32),this.eckey=a.generateSync(),this.hasPrivateKey=!0,this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.buildExtendedPublicKey(),void this.buildExtendedPrivateKey();if("string"==typeof i){var t=s.decode(i);if(82!=t.length)throw new Error("Not enough data, expected 82 and received "+t.length);var n=t.slice(78,82);i=t.slice(0,78);var r=h.sha256(h.sha256(i));if(r[0]!=n[0]||r[1]!=n[1]||r[2]!=n[2]||r[3]!=n[3])throw new Error("Invalid checksum")}void 0!==i&&null!==i&&this.initFromBytes(i)});y.seed=function(i,t){if(t||(t="livenet"),e.isBuffer(i)||(i=new e(i,"hex")),i.length<16)return!1;if(i.length>64)return!1;var n=h.sha512hmac(i,new e("Bitcoin seed")),r=new y(null);return r.depth=0,r.parentFingerprint=new e([0,0,0,0]),r.childIndex=new e([0,0,0,0]),r.chainCode=n.slice(32,64),r.version=l[t].hkeyPrivateVersion,r.eckey=new a,r.eckey.private=n.slice(0,32),r.eckey.regenerateSync(),r.hasPrivateKey=!0,r.pubKeyHash=h.sha256ripe160(r.eckey.public),r.buildExtendedPublicKey(),r.buildExtendedPrivateKey(),r},y.prototype.initFromBytes=function(e){if(78!=e.length)throw new Error("not enough data");this.version=n(e.slice(0,4)),this.depth=t(e.slice(4,5)),this.parentFingerprint=e.slice(5,9),this.childIndex=n(e.slice(9,13)),this.chainCode=e.slice(13,45);var i=e.slice(45,78),r=this.version==l.livenet.hkeyPrivateVersion||this.version==l.testnet.hkeyPrivateVersion,s=this.version==l.livenet.hkeyPublicVersion||this.version==l.testnet.hkeyPublicVersion;if(r&&0==i[0])this.eckey=new a,this.eckey.private=i.slice(1,33),this.eckey.compressed=!0,this.eckey.regenerateSync(),this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.hasPrivateKey=!0;else{if(!s||2!=i[0]&&3!=i[0])throw new Error("Invalid key");this.eckey=new a,this.eckey.public=i,this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.hasPrivateKey=!1}this.buildExtendedPublicKey(),this.buildExtendedPrivateKey()},y.prototype.buildExtendedPublicKey=function(){this.extendedPublicKey=new e([]);var i=null;switch(this.version){case l.livenet.hkeyPublicVersion:case l.livenet.hkeyPrivateVersion:i=l.livenet.hkeyPublicVersion;break;case l.testnet.hkeyPublicVersion:case l.testnet.hkeyPrivateVersion:i=l.testnet.hkeyPublicVersion;break;default:throw new Error("Unknown version")}this.extendedPublicKey=e.concat([new e([i>>24]),new e([i>>16&255]),new e([i>>8&255]),new e([255&i]),new e([this.depth]),this.parentFingerprint,new e([this.childIndex>>>24]),new e([this.childIndex>>>16&255]),new e([this.childIndex>>>8&255]),new e([255&this.childIndex]),this.chainCode,this.eckey.public]);this.extendedPublicKey.toString("hex")},y.prototype.extendedPublicKeyString=function(i){if(void 0===i||"base58"===i){var t=h.sha256(h.sha256(this.extendedPublicKey)),n=t.slice(0,4),r=e.concat([this.extendedPublicKey,n]);return s.encode(r)}if("hex"===i)return this.extendedPublicKey.toString("hex");throw new Error("bad format")},y.prototype.buildExtendedPrivateKey=function(){if(this.hasPrivateKey){this.extendedPrivateKey=new e([]);var i=this.version;this.extendedPrivateKey=e.concat([new e([i>>24]),new e([i>>16&255]),new e([i>>8&255]),new e([255&i]),new e([this.depth]),this.parentFingerprint,new e([this.childIndex>>>24]),new e([this.childIndex>>>16&255]),new e([this.childIndex>>>8&255]),new e([255&this.childIndex]),this.chainCode,new e([0]),this.eckey.private])}},y.prototype.extendedPrivateKeyString=function(i){if(void 0===i||"base58"===i){var t=h.sha256(h.sha256(this.extendedPrivateKey)),n=t.slice(0,4),r=e.concat([this.extendedPrivateKey,n]);return s.encode(r)}if("hex"===i)return this.extendedPrivateKey.toString("hex");throw new Error("bad format")},y.prototype.derive=function(e){var i=e.split("/");if("m"==e||"M"==e||"m'"==e||"M'"==e)return this;var t=this;for(var n in i){var r=i[n];if(0!=n){var s=r.length>1&&"'"==r[r.length-1],h=2147483647&parseInt(s?r.slice(0,r.length-1):r);s&&(h+=2147483648),t=t.deriveChild(h)}else if("m"!=r)throw new Error("invalid path")}return t},y.prototype.deriveChild=function(i){var t=[];t.push(i>>24&255),t.push(i>>16&255),t.push(i>>8&255),t.push(255&i),t=new e(t);var n=0!=(2147483648&i),r=this.version==l.livenet.hkeyPrivateVersion||this.version==l.testnet.hkeyPrivateVersion;if(n&&(!this.hasPrivateKey||!r))throw new Error("Cannot do private key derivation without private key");var s=null;if(this.hasPrivateKey){var o=null;o=e.concat(n?[new e([0]),this.eckey.private,t]:[this.eckey.public,t]);var v=h.sha512hmac(o,this.chainCode),p=d.fromBuffer(v.slice(0,32),{size:32}),w=v.slice(32,64),b=d.fromBuffer(this.eckey.private,{size:32}),f=p.add(b).mod(u);s=new y(null),s.chainCode=w,s.eckey=new a,s.eckey.private=f.toBuffer({size:32}),s.eckey.regenerateSync(),s.hasPrivateKey=!0}else{var o=e.concat([this.eckey.public,t]),v=h.sha512hmac(o,this.chainCode),p=v.slice(0,32),w=v.slice(32,64),P=new a;P.private=p,P.regenerateSync(),P.compressed=!1;var k=c.fromUncompressedPubKey(P.public),F=new a;F.public=this.eckey.public,F.compressed=!1;var x=c.fromUncompressedPubKey(F.public),K=c.add(k,x).toUncompressedPubKey();s=new y(null),s.chainCode=new e(w);var g=new a;g.public=K,g.compressed=!0,s.eckey=g,s.hasPrivateKey=!1}return s.childIndex=i,s.parentFingerprint=this.pubKeyHash.slice(0,4),s.version=this.version,s.depth=this.depth+1,s.eckey.compressed=!0,s.pubKeyHash=h.sha256ripe160(s.eckey.public),s.buildExtendedPublicKey(),s.buildExtendedPrivateKey(),s},module.exports=require("soop")(y)}).call(this,require("buffer").Buffer); -},{"../networks":"ULNIu2","../util":143,"./Base58":"6VqyzY","./Key":"ALJ4PS","./Point":"6tXgqr","./SecureRandom":"p4SiC2","bignum":58,"buffer":85,"soop":129}],"CBDCgz":[function(require,module,exports){ +(function(e){function i(e,i){if(e.lengthr;r++)t*=256,t+=e[r];return t}function t(e){return i(e,1)}function r(e){return i(e,4)}var n=require("soop").imports(),s=n.base58||require("./Base58").base58,h=n.coinUtil||require("../util"),o=n.Key||require("./Key"),a=n.Point||require("./Point"),c=n.SecureRandom||require("./SecureRandom"),d=n.bignum||require("bignum"),u=require("../networks"),l=require("bufferput"),y=new d("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",16),v=(new d("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",16),function(i){if("undefined"==typeof i||"mainnet"==i||"livenet"==i?(i="livenet",this.version=u.livenet.hkeyPrivateVersion):"testnet"==i&&(this.version=u.testnet.hkeyPrivateVersion),"livenet"==i||"testnet"==i)return this.depth=0,this.parentFingerprint=new e([0,0,0,0]),this.childIndex=new e([0,0,0,0]),this.chainCode=c.getRandomBuffer(32),this.eckey=o.generateSync(),this.hasPrivateKey=!0,this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.buildExtendedPublicKey(),void this.buildExtendedPrivateKey();if("string"==typeof i){var t=s.decode(i);if(82!=t.length)throw new Error("Not enough data, expected 82 and received "+t.length);var r=t.slice(78,82);i=t.slice(0,78);var n=h.sha256(h.sha256(i));if(n[0]!=r[0]||n[1]!=r[1]||n[2]!=r[2]||n[3]!=r[3])throw new Error("Invalid checksum")}void 0!==i&&null!==i&&this.initFromBytes(i)});v.seed=function(i,t){if(t||(t="livenet"),e.isBuffer(i)||(i=new e(i,"hex")),i.length<16)return!1;if(i.length>64)return!1;var r=h.sha512hmac(i,new e("Bitcoin seed")),n=new v(null);return n.depth=0,n.parentFingerprint=new e([0,0,0,0]),n.childIndex=new e([0,0,0,0]),n.chainCode=r.slice(32,64),n.version=u[t].hkeyPrivateVersion,n.eckey=new o,n.eckey.private=r.slice(0,32),n.eckey.regenerateSync(),n.hasPrivateKey=!0,n.pubKeyHash=h.sha256ripe160(n.eckey.public),n.buildExtendedPublicKey(),n.buildExtendedPrivateKey(),n},v.prototype.initFromBytes=function(e){if(78!=e.length)throw new Error("not enough data");this.version=r(e.slice(0,4)),this.depth=t(e.slice(4,5)),this.parentFingerprint=e.slice(5,9),this.childIndex=r(e.slice(9,13)),this.chainCode=e.slice(13,45);var i=e.slice(45,78),n=this.version==u.livenet.hkeyPrivateVersion||this.version==u.testnet.hkeyPrivateVersion,s=this.version==u.livenet.hkeyPublicVersion||this.version==u.testnet.hkeyPublicVersion;if(n&&0==i[0])this.eckey=new o,this.eckey.private=i.slice(1,33),this.eckey.compressed=!0,this.eckey.regenerateSync(),this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.hasPrivateKey=!0;else{if(!s||2!=i[0]&&3!=i[0])throw new Error("Invalid key");this.eckey=new o,this.eckey.public=i,this.pubKeyHash=h.sha256ripe160(this.eckey.public),this.hasPrivateKey=!1}this.buildExtendedPublicKey(),this.buildExtendedPrivateKey()},v.prototype.buildExtendedPublicKey=function(){this.extendedPublicKey=new e([]);var i=null;switch(this.version){case u.livenet.hkeyPublicVersion:case u.livenet.hkeyPrivateVersion:i=u.livenet.hkeyPublicVersion;break;case u.testnet.hkeyPublicVersion:case u.testnet.hkeyPrivateVersion:i=u.testnet.hkeyPublicVersion;break;default:throw new Error("Unknown version")}var t=new l;t=t.word32be(i),t=t.word8(this.depth),t=t.put(this.parentFingerprint),t=t.word32be(this.childIndex),t=t.put(this.chainCode),t=t.put(this.eckey.public),this.extendedPublicKey=new e(0),this.extendedPublicKey=t.buffer()},v.prototype.extendedPublicKeyString=function(i){if(void 0===i||"base58"===i){var t=h.sha256(h.sha256(this.extendedPublicKey)),r=t.slice(0,4),n=e.concat([this.extendedPublicKey,r]);return s.encode(n)}if("hex"===i)return this.extendedPublicKey.toString("hex");throw new Error("bad format")},v.prototype.buildExtendedPrivateKey=function(){if(this.hasPrivateKey){this.extendedPrivateKey=new e([]);var i=this.version,t=new l;t=t.word32be(i),t=t.word8(this.depth),t=t.put(this.parentFingerprint),t=t.word32be(this.childIndex),t=t.put(this.chainCode),t=t.word8(0),t=t.put(this.eckey.private),this.extendedPrivateKey=t.buffer()}},v.prototype.extendedPrivateKeyString=function(i){if(void 0===i||"base58"===i){var t=h.sha256(h.sha256(this.extendedPrivateKey)),r=t.slice(0,4),n=e.concat([this.extendedPrivateKey,r]);return s.encode(n)}if("hex"===i)return this.extendedPrivateKey.toString("hex");throw new Error("bad format")},v.prototype.derive=function(e){var i=e.split("/");if("m"==e||"M"==e||"m'"==e||"M'"==e)return this;var t=this;for(var r in i){var n=i[r];if(0!=r){var s=n.length>1&&"'"==n[n.length-1],h=2147483647&parseInt(s?n.slice(0,n.length-1):n);s&&(h+=2147483648),t=t.deriveChild(h)}else if("m"!=n)throw new Error("invalid path")}return t},v.prototype.deriveChild=function(i){var t=[];t.push(i>>24&255),t.push(i>>16&255),t.push(i>>8&255),t.push(255&i),t=new e(t);var r=0!=(2147483648&i),n=this.version==u.livenet.hkeyPrivateVersion||this.version==u.testnet.hkeyPrivateVersion;if(r&&(!this.hasPrivateKey||!n))throw new Error("Cannot do private key derivation without private key");var s=null;if(this.hasPrivateKey){var c=null;c=e.concat(r?[new e([0]),this.eckey.private,t]:[this.eckey.public,t]);var l=h.sha512hmac(c,this.chainCode),p=d.fromBuffer(l.slice(0,32),{size:32}),b=l.slice(32,64),f=d.fromBuffer(this.eckey.private,{size:32}),w=p.add(f).mod(y);s=new v(null),s.chainCode=b,s.eckey=new o,s.eckey.private=w.toBuffer({size:32}),s.eckey.public=e(0),s.hasPrivateKey=!0}else{var c=e.concat([this.eckey.public,t]),l=h.sha512hmac(c,this.chainCode),p=l.slice(0,32),b=l.slice(32,64),P=new o;P.private=p,P.regenerateSync(),P.compressed=!1;var k=a.fromUncompressedPubKey(P.public),F=new o;F.public=this.eckey.public,F.compressed=!1;var K=a.fromUncompressedPubKey(F.public),x=a.add(k,K).toUncompressedPubKey();s=new v(null),s.chainCode=new e(b);var g=new o;g.public=x,g.compressed=!0,s.eckey=g,s.hasPrivateKey=!1}return s.childIndex=i,s.parentFingerprint=this.pubKeyHash.slice(0,4),s.version=this.version,s.depth=this.depth+1,s.eckey.compressed=!0,s.pubKeyHash=h.sha256ripe160(s.eckey.public),console.log(s.pubKeyHash.toString("hex")),s.buildExtendedPublicKey(),s.buildExtendedPrivateKey(),s},module.exports=require("soop")(v)}).call(this,require("buffer").Buffer); +},{"../networks":"ULNIu2","../util":143,"./Base58":"6VqyzY","./Key":"ALJ4PS","./Point":"6tXgqr","./SecureRandom":"p4SiC2","bignum":58,"buffer":85,"bufferput":"aXRuS6","soop":129}],"CBDCgz":[function(require,module,exports){ (function(e){"use strict";var i=require("soop").imports(),n=i.coinUtil||require("../util"),r=i.Key||require("./Key"),t=function(){};t.sign=function(e,i){var n=t.magicHash(e),r=i.signSync(n);return r},t.verifyWithPubKey=function(e,i,n){var u=t.magicHash(i),c=new r;return 65==e.length&&(c.compressed=!1),c.public=e,c.verifySignatureSync(u,n)},t.magicBytes=new e("Bitcoin Signed Message:\n"),t.magicHash=function(i){var r=t.magicBytes,u=n.varIntBuf(r.length),c=new e(i),a=n.varIntBuf(c.length),s=e.concat([u,r,a,c]),o=n.twoSha256(s);return o},module.exports=require("soop")(t)}).call(this,require("buffer").Buffer); },{"../util":143,"./Key":"ALJ4PS","buffer":85,"soop":129}],"./lib/Message":[function(require,module,exports){ module.exports=require('CBDCgz'); diff --git a/failsearch.sh b/failsearch.sh index ec89f14..f5e3cb1 100755 --- a/failsearch.sh +++ b/failsearch.sh @@ -3,6 +3,7 @@ # run mocha until it fails COUNTER=0 -while [ $? -eq 0 ]; do +mocha +while [ $? -ne 0 ]; do mocha done diff --git a/lib/HierarchicalKey.js b/lib/HierarchicalKey.js index e7d0d05..de5bc69 100644 --- a/lib/HierarchicalKey.js +++ b/lib/HierarchicalKey.js @@ -151,10 +151,10 @@ HierarchicalKey.prototype.buildExtendedPublicKey = function() { r = r.put(this.eckey.public); - require('chai').should; - console.log('a'); - console.log(this.eckey.public.length); + //console.log(''); + //this.eckey.public.toString('hex'); + this.extendedPublicKey = new Buffer(0); this.extendedPublicKey = r.buffer(); } @@ -276,9 +276,14 @@ HierarchicalKey.prototype.deriveChild = function(i) { ret.eckey = new Key(); ret.eckey.private = k.toBuffer({ - size: 32 + size: 64 }); + console.log(k.toBuffer({ + size: 32 + }).toString('hex')); + //console.log(ret.eckey.private.toString('hex')); ret.eckey.regenerateSync(); + //ret.eckey.public = Buffer("026557ae0a62c6957e9d9897c23e9846662d29cf9308294fa924bfecbd9522b2c1", 'hex'); ret.hasPrivateKey = true; } else { @@ -319,7 +324,6 @@ HierarchicalKey.prototype.deriveChild = function(i) { ret.buildExtendedPublicKey(); ret.buildExtendedPrivateKey(); - return ret; } diff --git a/src/eckey.cc b/src/eckey.cc index 02329f9..71a80a3 100644 --- a/src/eckey.cc +++ b/src/eckey.cc @@ -291,14 +291,14 @@ Key::GetPublic(Local property, const AccessorInfo& info) int pub_size = i2o_ECPublicKey(key->ec, NULL); if (!pub_size) { // TODO: ERROR: "Error from i2o_ECPublicKey(key->ec, NULL)" - return scope.Close(Null()); + return VException("Error from i2o_ECPublicKey(key->ec, NULL)"); } unsigned char *pub_begin, *pub_end; pub_begin = pub_end = (unsigned char *)malloc(pub_size); if (i2o_ECPublicKey(key->ec, &pub_end) != pub_size) { // TODO: ERROR: "Error from i2o_ECPublicKey(key->ec, &pub)" - return scope.Close(Null()); + return VException("Error from i2o_ECPublicKey(key->ec, &pub)"); } Buffer *pub_buf = Buffer::New(pub_size); memcpy(Buffer::Data(pub_buf), pub_begin, pub_size); diff --git a/test/test.HierarchicalKey.js b/test/test.HierarchicalKey.js index 1dbf8f6..5205777 100644 --- a/test/test.HierarchicalKey.js +++ b/test/test.HierarchicalKey.js @@ -307,7 +307,7 @@ describe('HierarchicalKey', function() { }); describe('derivation in linux', function() { - it.only('should not be non-deterministic', function(){ + it('should not be non-deterministic', function(){ var hp = 'm/45\''; var sp = 'm/45'; @@ -318,8 +318,6 @@ describe('HierarchicalKey', function() { //hk.derive(sp).extendedPrivateKeyString().should.equal(hk.derive(sp).extendedPrivateKeyString()); var epk1 = hk.derive(hp).extendedPrivateKeyString(); var epk2 = hk.derive(hp).extendedPrivateKeyString(); - console.log(epk1); - console.log(epk2); epk1.should.equal(epk2); //hk.derive(hp).extendedPrivateKeyString().should.equal( // 'tprv8cSDV3fdYmUoTNGu4xRTm6qh3DPrNxPZzukM5FPdWoa9m22ALFJVGbjnU7J4TC5t3MJp293GtZWssAPuV1PNWGjXavQTnXy9xW6Lee2X6rd'); diff --git a/test/test.Key.js b/test/test.Key.js index 09a631d..d19c549 100644 --- a/test/test.Key.js +++ b/test/test.Key.js @@ -163,4 +163,6 @@ describe('Key', function() { }); }); + + });