1 const bip39 = require('bip39');
2 const utils = require('./utils');
3 import Error from '../error'
6 en: require('bip39/src/wordlists/english.json'),
7 zh: require('bip39/src/wordlists/chinese_simplified.json')
10 const keystore = require('./keystore');
12 const EntropyLength = 128;
13 const LightScryptN = 1 << 12;
14 const LightScryptP = 6;
26 if (mnemonic && mnemonic.length > 0 ){
27 return importKeyFromMnemonic(alias,password, mnemonic, language);
30 let obj = createNewKey(alias, password, language);
31 return {alias: obj.alias, xpub: obj.xPub.toString('hex'), keystore: obj.keystore, mnemonic:obj.mnemonic};
34 function isValidMnemonic(mnemonic, language){
35 // checksum length = entropy length /32
36 // mnemonic length = (entropy length + checksum length)/11
37 let mnemArray = mnemonic.trim().split(' ');
38 if (mnemArray.length != ((EntropyLength+EntropyLength/32)/11 )){
39 throw new Error('mnemonic length error', 'BTM3005');
42 // Pre validate that the mnemonic is well formed and only contains words that
43 // are present in the word list
44 if (!bip39.validateMnemonic(mnemonic, WORDLISTS[language])) {
45 throw new Error('mnemonic is invalid', 'BTM3006');
49 function importKeyFromMnemonic(alias, password, mnemonic, language) {
50 isValidMnemonic(mnemonic, language)
52 const result = createKeyFromMnemonic(alias, password, mnemonic);
53 result.xpub = result.xPub;
54 delete result['xPub'];
59 function createKeyFromMnemonic(alias,password, mnemonic) {
60 // Generate a Bip32 HD wallet for the mnemonic and a user supplied password
61 let seed = bip39.mnemonicToSeedSync(mnemonic, '');
62 let {xprv, xpub} = utils.newXKeys(seed);
69 let _keystore = keystore.encryptKey( key, password, LightScryptN, LightScryptP);
71 return {xPub: xpub.toString('hex'), alias, keystore: _keystore};
74 function createNewKey(alias, password, language) {
75 let normalizedAlias = alias.trim().toLowerCase();
76 return createChainKDKey(normalizedAlias, password, language);
79 function createChainKDKey(alias,password, language){
80 // Generate a mnemonic for memorization or user-friendly seeds
81 let mnemonic = bip39.generateMnemonic(EntropyLength,undefined, WORDLISTS[language]);
83 let object = createKeyFromMnemonic(alias, password, mnemonic);
84 object.mnemonic = mnemonic;
91 importKeyFromMnemonic,