diff --git a/index.js b/index.js index aa0f29f..efed68c 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ var Buffer = require('safe-buffer').Buffer var createHash = require('create-hash') -var pbkdf2 = require('pbkdf2').pbkdf2Sync +var _pbkdf2 = require('pbkdf2') +var pbkdf2 = _pbkdf2.pbkdf2Sync +var pbkdf2Async = _pbkdf2.pbkdf2 var randomBytes = require('randombytes') // use unorm until String.prototype.normalize gets better browser support @@ -58,6 +60,27 @@ function mnemonicToSeedHex (mnemonic, password) { return mnemonicToSeed(mnemonic, password).toString('hex') } +function mnemonicToSeedAsync (mnemonic, password) { + return new Promise(function (resolve, reject) { + try { + var mnemonicBuffer = Buffer.from(unorm.nfkd(mnemonic), 'utf8') + var saltBuffer = Buffer.from(salt(unorm.nfkd(password)), 'utf8') + } catch (error) { + return reject(error) + } + + pbkdf2Async(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512', function (err, data) { + if (err) return reject(err) + else return resolve(data) + }) + }) +} + +function mnemonicToSeedHexAsync (mnemonic, password) { + return mnemonicToSeedAsync(mnemonic, password) + .then(function (buf) { return buf.toString('hex') }) +} + function mnemonicToEntropy (mnemonic, wordlist) { wordlist = wordlist || DEFAULT_WORDLIST @@ -132,7 +155,9 @@ function validateMnemonic (mnemonic, wordlist) { module.exports = { mnemonicToSeed: mnemonicToSeed, + mnemonicToSeedAsync: mnemonicToSeedAsync, mnemonicToSeedHex: mnemonicToSeedHex, + mnemonicToSeedHexAsync: mnemonicToSeedHexAsync, mnemonicToEntropy: mnemonicToEntropy, entropyToMnemonic: entropyToMnemonic, generateMnemonic: generateMnemonic, diff --git a/test/index.js b/test/index.js index 63f36f0..b208567 100644 --- a/test/index.js +++ b/test/index.js @@ -16,10 +16,13 @@ function testVector (description, wordlist, password, v, i) { var vseedHex = v[2] test('for ' + description + '(' + i + '), ' + ventropy, function (t) { - t.plan(5) + t.plan(6) t.equal(bip39.mnemonicToEntropy(vmnemonic, wordlist), ventropy, 'mnemonicToEntropy returns ' + ventropy.slice(0, 40) + '...') t.equal(bip39.mnemonicToSeedHex(vmnemonic, password), vseedHex, 'mnemonicToSeedHex returns ' + vseedHex.slice(0, 40) + '...') + bip39.mnemonicToSeedHexAsync(vmnemonic, password).then(function (asyncSeedHex) { + t.equal(asyncSeedHex, vseedHex, 'mnemonicToSeedHexAsync returns ' + vseedHex.slice(0, 40) + '...') + }) t.equal(bip39.entropyToMnemonic(ventropy, wordlist), vmnemonic, 'entropyToMnemonic returns ' + vmnemonic.slice(0, 40) + '...') function rng () { return Buffer.from(ventropy, 'hex') }