Switch BIP-0039 to sjcl in browser
This commit is contained in:
parent
79d50e92d4
commit
b523eee812
|
@ -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';
|
||||
|
|
|
@ -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 )
|
||||
};
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue