diff --git a/lib/HierarchicalKey.js b/lib/HierarchicalKey.js
index 32c041c..4f45afb 100644
--- a/lib/HierarchicalKey.js
+++ b/lib/HierarchicalKey.js
@@ -5,7 +5,6 @@ var Key = imports.Key || require('./Key');
var Point = imports.Point || require('./Point');
var SecureRandom = imports.SecureRandom || require('./SecureRandom');
var bignum = imports.bignum || require('bignum');
-var crypto = require('crypto');
var networks = require('../networks');
var secp256k1_n = new bignum('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16);
@@ -56,41 +55,6 @@ var HierarchicalKey = function(bytes) {
this.initFromBytes(bytes);
}
-HierarchicalKey.mnemonic = function(wordlist, bits) {
- if (!bits)
- bits = 128;
- if (bits % 32 != 0)
- throw new Error("bits must be multiple of 32");
- var bytes = crypto.randomBytes(bits / 8);
- return BIP32.to_mnemonic(wordlist, bytes);
-}
-
-HierarchicalKey.to_mnemonic = function(wordlist, bytes) {
- var hash = coinUtil.sha256(new Buffer(bytes));
- var bin = "";
- var bits = bytes.length * 8;
- for (var i = 0 ; i < bytes.length ; i++) {
- bin = bin + ("00000000" + bytes[i].toString(2)).slice(-8);
- }
- var hashbits = hash[0].toString(2);
- hashbits = ("00000000" + hashbits).slice(-8).slice(0, bits/32);
- bin = bin + hashbits;
- if (bin.length % 11 != 0)
- throw new Error("interal error - entropy not an even multiple of 11 bits - " + bin.length);
- var mnemonic = "";
- for (var i = 0 ; i < bin.length / 11 ; i++) {
- if (mnemonic != "")
- mnemonic = mnemonic + " ";
- var wi = parseInt(bin.slice(i*11, (i+1)*11), 2);
- mnemonic = mnemonic + wordlist[wi];
- }
- return mnemonic;
-}
-
-HierarchicalKey.mnemonic_to_seed = function(mnemonic, passphrase) {
- return cryptox.pbkdf2Sync_sha512(mnemonic, "mnemonic" + passphrase, 2048, 64);
-}
-
HierarchicalKey.seed = function(bytes, network) {
if (!network)
network = 'livenet';
diff --git a/lib/browser/cryptox.js b/lib/browser/cryptox.js
index 71647ea..f32503a 100644
--- a/lib/browser/cryptox.js
+++ b/lib/browser/cryptox.js
@@ -2,40 +2,16 @@
//
// PBKDF2 with SHA512 - browser version
-var jssha = require('jssha')
+var sjcl = require('../sjcl');
-var pbkdf2_sha512 = function (password, salt, keylen, options) {
- password = new Buffer(password);
- salt = new Buffer(salt);
- // Defaults
- var iterations = options && options.iterations || 1;
-
- // Pseudo-random function
- function PRF(password, salt) {
- var j = new jssha(salt.toString('hex'), 'HEX');
- var hash = j.getHMAC(password.toString('hex'), "HEX", "SHA-512", "HEX");
- return new Buffer(hash, 'hex');
- }
-
- // Generate key
- var derivedKeyBytes = new Buffer([]),
- blockindex = 1;
- while (derivedKeyBytes.length < keylen) {
- var block = PRF(password, salt.concat([0, 0, 0, blockindex]));
- for (var u = block, i = 1; i < iterations; i++) {
- u = PRF(password, u);
- for (var j = 0; j < block.length; j++) block[j] ^= u[j];
- }
- derivedKeyBytes = derivedKeyBytes.concat(block);
- blockindex++;
- }
-
- // Truncate excess bytes - TODO
- //derivedKeyBytes.length = keylen;
-
- return new Buffer(derivedKeyBytes);
+var hmacSHA512 = function (key) {
+ var hasher = new sjcl.misc.hmac( key, sjcl.hash.sha512 );
+ this.encrypt = function () {
+ return hasher.encrypt.apply( hasher, arguments );
+ };
};
exports.pbkdf2Sync_sha512 = function(password, salt, iterations, keylen) {
- return pbkdf2_sha512(password, salt, keylen, {iterations: iterations});
+ var derivedKey = sjcl.misc.pbkdf2( password, salt, iterations, 512, hmacSHA512 );
+ return sjcl.codec.hex.fromBits( derivedKey )
};
diff --git a/test/index.html b/test/index.html
index c0bab93..2b645fd 100644
--- a/test/index.html
+++ b/test/index.html
@@ -19,7 +19,7 @@
-
+
diff --git a/test/test.HierarchicalKey.js b/test/test.HierarchicalKey.js
index 2660d12..b1d1946 100644
--- a/test/test.HierarchicalKey.js
+++ b/test/test.HierarchicalKey.js
@@ -4,7 +4,6 @@ var chai = chai || require('chai');
var should = chai.should();
var bitcore = bitcore || require('../bitcore');
var HierarchicalKey = bitcore.HierarchicalKey;
-var BIP39WordlistEn = bitcore.BIP39WordlistEn;
describe('HierarchicalKey', function() {
@@ -36,6 +35,7 @@ describe('HierarchicalKey', function() {
var vector2_m02147483647h12147483646h2_public = 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt';
var vector2_m02147483647h12147483646h2_private = 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j';
+
it('should initialize the class', function() {
should.exist(HierarchicalKey);
});
@@ -305,4 +305,5 @@ describe('HierarchicalKey', function() {
b.extendedPublicKeyString().substring(0,4).should.equal('tpub');
});
});
+
});