diff --git a/README.md b/README.md index 50d6858..168c0cb 100644 --- a/README.md +++ b/README.md @@ -83,21 +83,21 @@ npm install bip39 const mnemonic = bip39.generateMnemonic() // => 'seed sock milk update focus rotate barely fade car face mechanic mercy' -bip39.mnemonicToSeedHex('basket actual') +bip39.mnemonicToSeedSync('basket actual').toString('hex') // => '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f' -bip39.mnemonicToSeed('basket actual') +bip39.mnemonicToSeedSync('basket actual') // => -// mnemonicToSeed and mnemonicToSeedHex have async versions -// mnemonicToSeedAsync mnemonicToSeedHexAsync are more performance oriented -bip39.mnemonicToSeedAsync('basket actual').then(console.log) +// mnemonicToSeed has an synchronous version +// mnemonicToSeedSync is less performance oriented +bip39.mnemonicToSeed('basket actual').then(console.log) // => -bip39.mnemonicToSeedHexAsync('basket actual').then(console.log) +bip39.mnemonicToSeed('basket actual').then(bytes => bytes.toString('hex')).then(console.log) // => '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f' -bip39.mnemonicToSeed('basket actual', 'a password') +bip39.mnemonicToSeedSync('basket actual', 'a password') // => bip39.validateMnemonic(mnemonic) diff --git a/src/index.js b/src/index.js index 40cb8e0..0cd3522 100644 --- a/src/index.js +++ b/src/index.js @@ -32,17 +32,13 @@ function deriveChecksumBits(entropyBuffer) { function salt(password) { return 'mnemonic' + (password || ''); } -function mnemonicToSeed(mnemonic, password) { +function mnemonicToSeedSync(mnemonic, password) { const mnemonicBuffer = Buffer.from((mnemonic || '').normalize('NFKD'), 'utf8'); const saltBuffer = Buffer.from(salt((password || '').normalize('NFKD')), 'utf8'); return pbkdf2_1.pbkdf2Sync(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512'); } -exports.mnemonicToSeed = mnemonicToSeed; -function mnemonicToSeedHex(mnemonic, password) { - return mnemonicToSeed(mnemonic, password).toString('hex'); -} -exports.mnemonicToSeedHex = mnemonicToSeedHex; -function mnemonicToSeedAsync(mnemonic, password) { +exports.mnemonicToSeedSync = mnemonicToSeedSync; +function mnemonicToSeed(mnemonic, password) { return new Promise((resolve, reject) => { try { const mnemonicBuffer = Buffer.from((mnemonic || '').normalize('NFKD'), 'utf8'); @@ -59,12 +55,7 @@ function mnemonicToSeedAsync(mnemonic, password) { } }); } -exports.mnemonicToSeedAsync = mnemonicToSeedAsync; -async function mnemonicToSeedHexAsync(mnemonic, password) { - const buf = await mnemonicToSeedAsync(mnemonic, password); - return buf.toString('hex'); -} -exports.mnemonicToSeedHexAsync = mnemonicToSeedHexAsync; +exports.mnemonicToSeed = mnemonicToSeed; function mnemonicToEntropy(mnemonic, wordlist) { wordlist = wordlist || DEFAULT_WORDLIST; if (!wordlist) { diff --git a/test/index.js b/test/index.js index 005c0d2..8cb9ede 100644 --- a/test/index.js +++ b/test/index.js @@ -18,9 +18,9 @@ function testVector (description, wordlist, password, v, i) { 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.mnemonicToSeedSync(vmnemonic, password).toString('hex'), vseedHex, 'mnemonicToSeedSync returns ' + vseedHex.slice(0, 40) + '...') + bip39.mnemonicToSeed(vmnemonic, password).then(function (asyncSeed) { + t.equal(asyncSeed.toString('hex'), vseedHex, 'mnemonicToSeed returns ' + vseedHex.slice(0, 40) + '...') }) t.equal(bip39.entropyToMnemonic(ventropy, wordlist), vmnemonic, 'entropyToMnemonic returns ' + vmnemonic.slice(0, 40) + '...') @@ -100,8 +100,8 @@ test('UTF8 passwords', function (t) { var password = '㍍ガバヴァぱばぐゞちぢ十人十色' var normalizedPassword = 'メートルガバヴァぱばぐゞちぢ十人十色' - t.equal(bip39.mnemonicToSeedHex(vmnemonic, password), vseedHex, 'mnemonicToSeedHex normalizes passwords') - t.equal(bip39.mnemonicToSeedHex(vmnemonic, normalizedPassword), vseedHex, 'mnemonicToSeedHex leaves normalizes passwords as-is') + t.equal(bip39.mnemonicToSeedSync(vmnemonic, password).toString('hex'), vseedHex, 'mnemonicToSeedSync normalizes passwords') + t.equal(bip39.mnemonicToSeedSync(vmnemonic, normalizedPassword).toString('hex'), vseedHex, 'mnemonicToSeedSync leaves normalizes passwords as-is') }) }) diff --git a/test/readme.js b/test/readme.js index aa39655..ea0bf5c 100644 --- a/test/readme.js +++ b/test/readme.js @@ -33,11 +33,9 @@ test('README example 2', function (t) { test('README example 3', function (t) { const mnemonic = 'basket actual' - const seed = bip39.mnemonicToSeed(mnemonic) - const seedHex = bip39.mnemonicToSeedHex(mnemonic) + const seed = bip39.mnemonicToSeedSync(mnemonic) - t.plan(3) - t.equal(seed.toString('hex'), seedHex) - t.equal(seedHex, '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f') + t.plan(2) + t.equal(seed.toString('hex'), '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f') t.equal(bip39.validateMnemonic(mnemonic), false) }) diff --git a/ts_src/index.ts b/ts_src/index.ts index 024b4ab..d51b7d4 100644 --- a/ts_src/index.ts +++ b/ts_src/index.ts @@ -1,5 +1,5 @@ import * as createHash from 'create-hash'; -import { pbkdf2 as pbkdf2Async, pbkdf2Sync as pbkdf2 } from 'pbkdf2'; +import { pbkdf2, pbkdf2Sync } from 'pbkdf2'; import * as randomBytes from 'randombytes'; import { _default as _DEFAULT_WORDLIST, wordlists } from './_wordlists'; @@ -39,7 +39,7 @@ function salt(password?: string): string { return 'mnemonic' + (password || ''); } -export function mnemonicToSeed(mnemonic: string, password: string): Buffer { +export function mnemonicToSeedSync(mnemonic: string, password: string): Buffer { const mnemonicBuffer = Buffer.from( (mnemonic || '').normalize('NFKD'), 'utf8', @@ -49,14 +49,10 @@ export function mnemonicToSeed(mnemonic: string, password: string): Buffer { 'utf8', ); - return pbkdf2(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512'); + return pbkdf2Sync(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512'); } -export function mnemonicToSeedHex(mnemonic: string, password: string): string { - return mnemonicToSeed(mnemonic, password).toString('hex'); -} - -export function mnemonicToSeedAsync( +export function mnemonicToSeed( mnemonic: string, password: string, ): Promise { @@ -71,17 +67,10 @@ export function mnemonicToSeedAsync( salt((password || '').normalize('NFKD')), 'utf8', ); - pbkdf2Async( - mnemonicBuffer, - saltBuffer, - 2048, - 64, - 'sha512', - (err, data) => { - if (err) return reject(err); - else return resolve(data); - }, - ); + pbkdf2(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512', (err, data) => { + if (err) return reject(err); + else return resolve(data); + }); } catch (error) { return reject(error); } @@ -89,14 +78,6 @@ export function mnemonicToSeedAsync( ); } -export async function mnemonicToSeedHexAsync( - mnemonic: string, - password: string, -): Promise { - const buf = await mnemonicToSeedAsync(mnemonic, password); - return buf.toString('hex'); -} - export function mnemonicToEntropy( mnemonic: string, wordlist?: string[], diff --git a/types/index.d.ts b/types/index.d.ts index e4701a7..69e0381 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,8 +1,6 @@ /// -export declare function mnemonicToSeed(mnemonic: string, password: string): Buffer; -export declare function mnemonicToSeedHex(mnemonic: string, password: string): string; -export declare function mnemonicToSeedAsync(mnemonic: string, password: string): Promise; -export declare function mnemonicToSeedHexAsync(mnemonic: string, password: string): Promise; +export declare function mnemonicToSeedSync(mnemonic: string, password: string): Buffer; +export declare function mnemonicToSeed(mnemonic: string, password: string): Promise; export declare function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): string; export declare function entropyToMnemonic(entropy: Buffer | string, wordlist?: string[]): string; export declare function generateMnemonic(strength?: number, rng?: (size: number) => Buffer, wordlist?: string[]): string;