bip39/test/index.js

110 lines
10 KiB
JavaScript
Raw Normal View History

2016-10-06 01:02:59 +11:00
var bip39 = require('../')
2017-05-23 15:04:19 +10:00
var Buffer = require('safe-buffer').Buffer
2017-03-15 09:57:19 +03:00
var download = require('../util/wordlists').download
2016-10-06 01:02:59 +11:00
var WORDLISTS = {
2017-03-14 16:10:53 +03:00
english: require('../wordlists/english.json'),
japanese: require('../wordlists/japanese.json'),
2014-07-04 14:33:49 +10:00
custom: require('./wordlist.json')
}
var vectors = require('./vectors.json')
2016-10-06 01:02:59 +11:00
var test = require('tape')
2014-03-11 12:38:09 +08:00
2016-10-06 01:02:59 +11:00
function testVector (description, wordlist, password, v, i) {
var ventropy = v[0]
var vmnemonic = v[1]
var vseedHex = v[2]
2014-07-04 14:33:49 +10:00
2017-05-12 12:31:52 +10:00
test('for ' + description + '(' + i + '), ' + ventropy, function (t) {
t.plan(6)
2016-10-06 01:02:59 +11:00
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) + '...')
})
2016-10-06 01:02:59 +11:00
t.equal(bip39.entropyToMnemonic(ventropy, wordlist), vmnemonic, 'entropyToMnemonic returns ' + vmnemonic.slice(0, 40) + '...')
2017-05-23 15:04:19 +10:00
function rng () { return Buffer.from(ventropy, 'hex') }
2016-10-06 01:02:59 +11:00
t.equal(bip39.generateMnemonic(undefined, rng, wordlist), vmnemonic, 'generateMnemonic returns RNG entropy unmodified')
t.equal(bip39.validateMnemonic(vmnemonic, wordlist), true, 'validateMnemonic returns true')
2014-04-05 12:44:16 +08:00
})
2016-10-06 01:02:59 +11:00
}
2014-04-05 12:44:16 +08:00
2016-10-06 01:02:59 +11:00
vectors.english.forEach(function (v, i) { testVector('English', undefined, 'TREZOR', v, i) })
vectors.japanese.forEach(function (v, i) { testVector('Japanese', WORDLISTS.japanese, '㍍ガバヴァぱばぐゞちぢ十人十色', v, i) })
vectors.custom.forEach(function (v, i) { testVector('Custom', WORDLISTS.custom, undefined, v, i) })
test('invalid entropy', function (t) {
t.plan(3)
t.throws(function () {
2017-05-23 15:04:19 +10:00
bip39.entropyToMnemonic(Buffer.from('', 'hex'))
2017-05-12 12:57:37 +10:00
}, /^TypeError: Invalid entropy$/, 'throws for empty entropy')
t.throws(function () {
2017-05-23 15:04:19 +10:00
bip39.entropyToMnemonic(Buffer.from('000000', 'hex'))
2017-05-12 12:57:37 +10:00
}, /^TypeError: Invalid entropy$/, 'throws for entropy that\'s not a multitude of 4 bytes')
t.throws(function () {
2017-05-23 15:04:19 +10:00
bip39.entropyToMnemonic(Buffer.from(new Array(1028 + 1).join('00'), 'hex'))
2017-05-12 12:57:37 +10:00
}, /^TypeError: Invalid entropy$/, 'throws for entropy that is larger than 1024')
})
2016-10-06 01:02:59 +11:00
test('UTF8 passwords', function (t) {
t.plan(vectors.japanese.length * 2)
2014-09-28 02:08:00 +10:00
2016-10-06 01:02:59 +11:00
vectors.japanese.forEach(function (v) {
var vmnemonic = v[1]
var vseedHex = v[2]
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')
2014-09-28 02:08:00 +10:00
})
2016-10-06 01:02:59 +11:00
})
2016-10-06 01:02:59 +11:00
test('generateMnemonic can vary entropy length', function (t) {
var words = bip39.generateMnemonic(160).split(' ')
2016-10-06 01:02:59 +11:00
t.plan(1)
t.equal(words.length, 15, 'can vary generated entropy bit length')
2016-10-06 01:02:59 +11:00
})
2015-10-02 00:30:01 +10:00
test('generateMnemonic requests the exact amount of data from an RNG', function (t) {
2016-10-06 01:02:59 +11:00
t.plan(1)
2015-08-17 10:36:58 +10:00
bip39.generateMnemonic(160, function (size) {
t.equal(size, 160 / 8)
2017-05-23 15:04:19 +10:00
return Buffer.allocUnsafe(size)
2015-08-17 10:36:58 +10:00
})
2014-04-05 12:44:16 +08:00
})
2016-10-06 01:02:59 +11:00
test('validateMnemonic', function (t) {
t.plan(5)
2016-10-06 01:02:59 +11:00
t.equal(bip39.validateMnemonic('sleep kitten'), false, 'fails for a mnemonic that is too short')
t.equal(bip39.validateMnemonic('sleep kitten sleep kitten sleep kitten'), false, 'fails for a mnemonic that is too short')
t.equal(bip39.validateMnemonic('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon aband
2016-10-06 01:02:59 +11:00
t.equal(bip39.validateMnemonic('turtle front uncle idea crush write shrug there lottery flower risky shell'), false, 'fails if mnemonic words are not in the word list')
t.equal(bip39.validateMnemonic('sleep kitten sleep kitten sleep kitten sleep kitten sleep kitten sleep kitten'), false, 'fails for invalid checksum')
})
test('exposes standard wordlists', function (t) {
t.plan(2)
t.same(bip39.wordlists.EN, WORDLISTS.english)
t.equal(bip39.wordlists.EN.length, 2048)
})
2017-03-15 09:57:19 +03:00
test('verify wordlists from https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md', function (t) {
download().then(function (wordlists) {
Object.keys(wordlists).forEach(function (name) {
t.same(bip39.wordlists[name], wordlists[name])
})
t.end()
})
})