From b523eee8120324503a181846111ade6a7d5cbb92 Mon Sep 17 00:00:00 2001 From: Devrandom Date: Sun, 8 Jun 2014 13:25:57 -0700 Subject: [PATCH] Switch BIP-0039 to sjcl in browser --- lib/HierarchicalKey.js | 36 -------------------------------- lib/browser/cryptox.js | 40 ++++++++---------------------------- test/index.html | 2 +- test/test.HierarchicalKey.js | 3 ++- 4 files changed, 11 insertions(+), 70 deletions(-) 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'); }); }); + });