Browse Source

Remove hex functions and make async default

fixTypes
junderw 6 years ago
parent
commit
4acb7127f7
No known key found for this signature in database GPG Key ID: B256185D3A971908
  1. 14
      README.md
  2. 17
      src/index.js
  3. 10
      test/index.js
  4. 8
      test/readme.js
  5. 31
      ts_src/index.ts
  6. 6
      types/index.d.ts

14
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')
// => <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)

17
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) {

10
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')
})
})

8
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)
})

31
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<Buffer> {
@ -71,17 +67,10 @@ export function mnemonicToSeedAsync(
salt((password || '').normalize('NFKD')),
'utf8',
);
pbkdf2Async(
mnemonicBuffer,
saltBuffer,
2048,
64,
'sha512',
(err, 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<string> {
const buf = await mnemonicToSeedAsync(mnemonic, password);
return buf.toString('hex');
}
export function mnemonicToEntropy(
mnemonic: string,
wordlist?: string[],

6
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;

Loading…
Cancel
Save