Switch BIP-0039 to sjcl in browser

This commit is contained in:
Devrandom 2014-06-08 13:25:57 -07:00
parent 79d50e92d4
commit b523eee812
4 changed files with 11 additions and 70 deletions

View File

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

View File

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

View File

@ -19,7 +19,7 @@
<script src="test.Base58.js"></script>
<script src="test.basic.js"></script>
<script src="test.Bignum.browser.js"></script>
<script src="test.BIP32.js"></script>
<script src="test.HierarchicalKey.js"></script>
<script src="test.BIP39.js"></script>
<script src="test.Block.js"></script>
<script src="test.Bloom.js"></script>

View File

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