Comparing version 2.1.0 to 2.1.2
21
index.js
var assert = require('assert') | ||
var crypto = require('crypto') | ||
var pbkdf2 = require('pbkdf2-compat').pbkdf2Sync | ||
var createHash = require('create-hash') | ||
var pbkdf2 = require('pbkdf2').pbkdf2Sync | ||
var randomBytes = require('randombytes') | ||
var unorm = require('unorm') | ||
@@ -8,3 +10,6 @@ var DEFAULT_WORDLIST = require('./wordlists/en.json') | ||
function mnemonicToSeed(mnemonic, password) { | ||
return pbkdf2(mnemonic, salt(password), 2048, 64, 'sha512') | ||
var mnemonicBuffer = new Buffer(mnemonic, 'utf8') | ||
var saltBuffer = new Buffer(salt(password), 'utf8') | ||
return pbkdf2(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512') | ||
} | ||
@@ -72,3 +77,3 @@ | ||
strength = strength || 128 | ||
rng = rng || crypto.randomBytes | ||
rng = rng || randomBytes | ||
@@ -90,3 +95,3 @@ var hex = rng(strength / 8).toString('hex') | ||
function checksumBits(entropyBuffer) { | ||
var hash = crypto.createHash('sha256').update(entropyBuffer).digest() | ||
var hash = createHash('sha256').update(entropyBuffer).digest() | ||
@@ -101,9 +106,5 @@ // Calculated constants from BIP39 | ||
function salt(password) { | ||
return encode_utf8('mnemonic' + (password || '')) | ||
return 'mnemonic' + (unorm.nfkd(password) || '') // Use unorm until String.prototype.normalize gets better browser support | ||
} | ||
function encode_utf8(s) { | ||
return unescape(encodeURIComponent(s)) | ||
} | ||
//=========== helper methods from bitcoinjs-lib ======== | ||
@@ -110,0 +111,0 @@ |
{ | ||
"name": "bip39", | ||
"version": "2.1.0", | ||
"version": "2.1.2", | ||
"description": "Bitcoin BIP39: Mnemonic code for generating deterministic keys", | ||
@@ -8,3 +8,3 @@ "main": "index.js", | ||
"test": "mocha --reporter list test/*.js", | ||
"compile": "browserify index.js -s BIP39 > bip39.js" | ||
"compile": "browserify index.js -s bip39 > bip39.js" | ||
}, | ||
@@ -25,22 +25,12 @@ "author": "Wei Lu", | ||
"dependencies": { | ||
"pbkdf2-compat": "2.0.0" | ||
"create-hash": "^1.1.0", | ||
"pbkdf2": "^3.0.0", | ||
"randombytes": "^2.0.1", | ||
"unorm": "^1.3.3" | ||
}, | ||
"devDependencies": { | ||
"browserify": "^5.12.0", | ||
"mocha": "^1.17.1", | ||
"sinon": "^1.10.3" | ||
}, | ||
"testling": { | ||
"browsers": [ | ||
"android-browser/4.2..latest", | ||
"chrome/20..latest", | ||
"firefox/21..latest", | ||
"ipad/6..latest", | ||
"iphone/6..latest", | ||
"opera/15..latest", | ||
"safari/latest" | ||
], | ||
"harness": "mocha-bdd", | ||
"files": "test/*.js" | ||
"browserify": "^9.0.0", | ||
"mocha": "^2.2.0", | ||
"mock-require": "^1.0.5" | ||
} | ||
} |
BIP39 | ||
===== | ||
[![Build Status](https://travis-ci.org/weilu/bip39.png?branch=master)](https://travis-ci.org/weilu/bip39) | ||
JavaScript implementation of [Bitcoin BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki): Mnemonic code for generating deterministic keys | ||
@@ -11,24 +13,24 @@ | ||
```javascript | ||
var BIP39 = require('bip39') | ||
var bip39 = require('bip39') | ||
var mnemonic = BIP39.entropyToMnemonic('1337') // hex input, defaults to BIP39 English word list | ||
var mnemonic = bip39.entropyToMnemonic('1337') // hex input, defaults to BIP39 English word list | ||
// 'basket actual' | ||
BIP39.mnemonicToEntropy(mnemonic) // hex input, defaults to BIP39 English word list | ||
bip39.mnemonicToEntropy(mnemonic) // hex input, defaults to BIP39 English word list | ||
// '1337' | ||
// Generate a random mnemonic using crypto.randomBytes | ||
mnemonic = BIP39.generateMnemonic() // strength defaults to 128 bits | ||
mnemonic = bip39.generateMnemonic() // strength defaults to 128 bits | ||
// 'seed sock milk update focus rotate barely fade car face mechanic mercy' | ||
BIP39.mnemonicToSeedHex('basket actual') | ||
bip39.mnemonicToSeedHex('basket actual') | ||
// '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f' | ||
BIP39.mnemonicToSeed('basket actual') | ||
bip39.mnemonicToSeed('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 ...> | ||
BIP39.validateMnemonic(mnemonic) | ||
bip39.validateMnemonic(mnemonic) | ||
// true | ||
BIP39.validateMnemonic('basket actual') | ||
bip39.validateMnemonic('basket actual') | ||
// false | ||
@@ -43,2 +45,2 @@ ``` | ||
After loading this file in your browser, you will be able to use the global `BIP39` object. | ||
After loading this file in your browser, you will be able to use the global `bip39` object. |
var assert = require('assert') | ||
var crypto = require('crypto') | ||
var mock = require('mock-require') | ||
mock('randombytes', function(size) { | ||
return new Buffer('qwertyuiopasdfghjklzxcvbnm[];,./'.slice(0, size)) | ||
}) | ||
var BIP39 = require('../index.js') | ||
var sinon = require('sinon') | ||
@@ -54,9 +58,7 @@ var wordlists = { | ||
vectors.english.forEach(function(v, i) { | ||
it('works for tests vector ' + i, sinon.test(function() { | ||
this.mock(crypto).expects('randomBytes') | ||
.exactly(1) | ||
.onCall(0).returns(new Buffer(v[0], 'hex')) | ||
it('works for tests vector ' + i, function() { | ||
function rng() { return new Buffer(v[0], 'hex') } | ||
assert.equal(BIP39.generateMnemonic(), v[1]) | ||
})) | ||
assert.equal(BIP39.generateMnemonic(undefined, rng), v[1]) | ||
}) | ||
}) | ||
@@ -71,2 +73,6 @@ | ||
it('defaults to randombytes for the RNG', function() { | ||
assert.equal(BIP39.generateMnemonic(32), 'imitate robot frequent') | ||
}) | ||
it('allows a custom RNG to be used', function() { | ||
@@ -125,2 +131,16 @@ var rng = function(size) { | ||
}) | ||
describe('utf8 passwords', function() { | ||
vectors.japanese.forEach(function(v) { | ||
it ('creates the correct seed', function() { | ||
var utf8Password = "㍍ガバヴァぱばぐゞちぢ十人十色" | ||
assert.equal(BIP39.mnemonicToSeedHex(v[1], utf8Password), v[2]) | ||
}) | ||
it ('works with already normalized password', function() { | ||
var normalizedPassword = "メートルガバヴァぱばぐゞちぢ十人十色" | ||
assert.equal(BIP39.mnemonicToSeedHex(v[1], normalizedPassword), v[2]) | ||
}) | ||
}) | ||
}) | ||
}) |
@@ -135,3 +135,10 @@ { | ||
] | ||
], | ||
"japanese": [ | ||
[ | ||
"00000000000000000000000000000000", | ||
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", | ||
"ba553eedefe76e67e2602dc20184c564010859faada929a090dd2c57aacb204ceefd15404ab50ef3e8dbeae5195aeae64b0def4d2eead1cdc728a33ced520ffd" | ||
] | ||
] | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
66578
10
4453
45
4
+ Addedcreate-hash@^1.1.0
+ Addedpbkdf2@^3.0.0
+ Addedrandombytes@^2.0.1
+ Addedunorm@^1.3.3
+ Addedcipher-base@1.0.4(transitive)
+ Addedcreate-hash@1.2.0(transitive)
+ Addedcreate-hmac@1.1.7(transitive)
+ Addedhash-base@3.1.0(transitive)
+ Addedmd5.js@1.3.5(transitive)
+ Addedpbkdf2@3.1.2(transitive)
+ Addedrandombytes@2.1.0(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedripemd160@2.0.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsha.js@2.4.11(transitive)
+ Addedstring_decoder@1.3.0(transitive)
+ Addedunorm@1.6.0(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
- Removedpbkdf2-compat@2.0.0
- Removedabbrev@1.0.9(transitive)
- Removedamdefine@1.0.1(transitive)
- Removedargparse@1.0.10(transitive)
- Removedasync@1.5.2(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedbrace-expansion@1.1.11(transitive)
- Removedconcat-map@0.0.1(transitive)
- Removeddeep-is@0.1.4(transitive)
- Removedescodegen@1.7.1(transitive)
- Removedesprima@1.2.52.5.04.0.1(transitive)
- Removedestraverse@1.9.3(transitive)
- Removedesutils@2.0.3(transitive)
- Removedfast-levenshtein@1.0.7(transitive)
- Removedfileset@0.2.1(transitive)
- Removedglob@5.0.15(transitive)
- Removedhandlebars@4.7.8(transitive)
- Removedhas-flag@1.0.0(transitive)
- Removedinflight@1.0.6(transitive)
- Removedisexe@2.0.0(transitive)
- Removedistanbul@0.3.22(transitive)
- Removedjs-yaml@3.14.1(transitive)
- Removedlevn@0.2.5(transitive)
- Removedminimatch@2.0.10(transitive)
- Removedminimist@1.2.8(transitive)
- Removedmkdirp@0.5.6(transitive)
- Removedneo-async@2.6.2(transitive)
- Removednopt@3.0.6(transitive)
- Removedonce@1.4.0(transitive)
- Removedoptionator@0.5.0(transitive)
- Removedpath-is-absolute@1.0.1(transitive)
- Removedpbkdf2-compat@2.0.0(transitive)
- Removedprelude-ls@1.1.2(transitive)
- Removedresolve@1.1.7(transitive)
- Removedsource-map@0.2.00.6.1(transitive)
- Removedsprintf-js@1.0.3(transitive)
- Removedsupports-color@3.2.3(transitive)
- Removedtype-check@0.3.2(transitive)
- Removeduglify-js@3.19.3(transitive)
- Removedwhich@1.3.1(transitive)
- Removedwordwrap@0.0.31.0.0(transitive)
- Removedwrappy@1.0.2(transitive)