Skip to content

Commit

Permalink
Remove hex functions and make async default
Browse files Browse the repository at this point in the history
  • Loading branch information
junderw committed Apr 2, 2019
1 parent 91b0efd commit 4acb712
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 61 deletions.
14 changes: 7 additions & 7 deletions README.md
Expand Up @@ -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')
// => <Buffer 5c f2 d4 a8 b0 35 5e 90 29 5b df c5 65 a0 22 a4 09 af 06 3d 53 65 bb 57 bf 74 d9 52 8f 49 4b fa 44 00 f5 3d 83 49 b8 0f da e4 40 82 d7 f9 54 1e 1d ba 2b ...>

// 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)
// => <Buffer 5c f2 d4 a8 b0 35 5e 90 29 5b df c5 65 a0 22 a4 09 af 06 3d 53 65 bb 57 bf 74 d9 52 8f 49 4b fa 44 00 f5 3d 83 49 b8 0f da e4 40 82 d7 f9 54 1e 1d ba 2b ...>

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')
// => <Buffer 46 16 a4 4f 2c 90 b9 69 02 14 b8 fd 43 5b b4 14 62 43 de 10 7b 30 87 59 0a 3b b8 d3 1b 2f 3a ef ab 1d 4b 52 6d 21 e5 0a 04 02 3d 7a d0 66 43 ea 68 3b ... >

bip39.validateMnemonic(mnemonic)
Expand Down
17 changes: 4 additions & 13 deletions src/index.js
Expand Up @@ -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');
Expand All @@ -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) {
Expand Down
10 changes: 5 additions & 5 deletions test/index.js
Expand Up @@ -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) + '...')

Expand Down Expand Up @@ -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')
})
})

Expand Down
8 changes: 3 additions & 5 deletions test/readme.js
Expand Up @@ -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)
})
35 changes: 8 additions & 27 deletions 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';

Expand Down Expand Up @@ -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',
Expand All @@ -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<Buffer> {
Expand All @@ -71,32 +67,17 @@ 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);
}
},
);
}

export async function mnemonicToSeedHexAsync(
mnemonic: string,
password: string,
): Promise<string> {
const buf = await mnemonicToSeedAsync(mnemonic, password);
return buf.toString('hex');
}

export function mnemonicToEntropy(
mnemonic: string,
wordlist?: string[],
Expand Down
6 changes: 2 additions & 4 deletions types/index.d.ts
@@ -1,8 +1,6 @@
/// <reference types="node" />
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<Buffer>;
export declare function mnemonicToSeedHexAsync(mnemonic: string, password: string): Promise<string>;
export declare function mnemonicToSeedSync(mnemonic: string, password: string): Buffer;
export declare function mnemonicToSeed(mnemonic: string, password: string): Promise<Buffer>;
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;
Expand Down

0 comments on commit 4acb712

Please sign in to comment.