Skip to content

Instantly share code, notes, and snippets.

@liamsi
Last active May 16, 2018 16:00
Show Gist options
  • Save liamsi/18f175155aebc14f34d556530119daa3 to your computer and use it in GitHub Desktop.
Save liamsi/18f175155aebc14f34d556530119daa3 to your computer and use it in GitHub Desktop.
var test = require('tape')
const randomBytes = require('randombytes')
const bip39 = require('bip39')
test('generate wallet mnemonic', function (t) {
t.test('some bip39 experiments: can we "revert" "BytesToWords" with "WordsToBytes" like in TestCheckTypoDetection', function (t) {
// see https://github.com/tendermint/go-crypto/blob/906331a8d1661a504dc0eb2618a8767363fddb7c/keys/words/wordcodec_test.go#L146-L178
var strength = 128
for (var i = 0; i < 3400; i++) {
// new entropy:
var data = randomBytes(strength / 8).toString('hex')
// corresponds to:
// words, err := codec.BytesToWords(data)
// default word list is english:
var words = bip39.entropyToMnemonic(data)
// coresponds to:
// good, err := codec.WordsToBytes(words)
// default word list is english:
var good = bip39.mnemonicToEntropy(words)
t.equal(data, good)
// now try some tweaks...
try {
var cut = words.split(' ').slice(1).join(' ')
bip39.mnemonicToEntropy(cut)
t.fail('should have thrown')
} catch (err) {
t.ok(err, 'error was thrown')
t.equal(err.message, 'Invalid mnemonic', 'correct error message')
}
var diffWords = words.split(' ')
diffWords[3] = getDiffWord(diffWords[3])
var df = diffWords.join(' ')
try {
bip39.mnemonicToEntropy(df)
t.fail('should have thrown')
} catch (err) {
t.ok(err, 'error was thrown')
t.equal(err.message, 'Invalid mnemonic checksum', 'correct error message')
}
}
t.end()
})
t.end()
})
function getDiffWord(not) {
var banksize = bip39.wordlists.EN.length
var idx = Math.floor(Math.random() * banksize) % banksize
var w = bip39.wordlists.EN[idx]
if (w === not) {
w = getDiffWord(not)
}
return w
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment