2016-10-06 01:02:59 +11:00
var bip39 = require ( '../' )
2016-10-06 00:15:53 +11:00
var proxyquire = require ( 'proxyquire' )
2016-10-06 01:02:59 +11:00
var WORDLISTS = {
2014-07-04 14:33:49 +10:00
english : require ( '../wordlists/en.json' ) ,
2015-09-28 22:35:33 +09:00
japanese : require ( '../wordlists/ja.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
2016-10-06 01:02:59 +11:00
test ( 'for ' + description + ' test vector ' + i , function ( t ) {
t . plan ( 5 )
2014-06-23 17:56:08 +10:00
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 ) + '...' )
2014-08-17 11:11:28 +10:00
2016-10-06 01:02:59 +11:00
t . equal ( bip39 . entropyToMnemonic ( ventropy , wordlist ) , vmnemonic , 'entropyToMnemonic returns ' + vmnemonic . slice ( 0 , 40 ) + '...' )
2014-06-23 17:56:08 +10:00
2016-10-06 01:02:59 +11:00
function rng ( ) { return new Buffer ( ventropy , 'hex' ) }
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 ( '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
} )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
test ( 'README example 1' , function ( t ) {
// defaults to BIP39 English word list
var entropy = '133755ff'
var mnemonic = bip39 . entropyToMnemonic ( entropy )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
t . plan ( 2 )
t . equal ( mnemonic , 'basket rival lemon' )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
// reversible
t . equal ( bip39 . mnemonicToEntropy ( mnemonic ) , entropy )
} )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
test ( 'README example 2' , function ( t ) {
var stub = {
randombytes : function ( size ) {
return new Buffer ( 'qwertyuiopasdfghjklzxcvbnm[];,./' . slice ( 0 , size ) )
2016-10-06 00:15:53 +11:00
}
2016-10-06 01:02:59 +11:00
}
var proxiedbip39 = proxyquire ( '../' , stub )
// mnemonic strength defaults to 128 bits
var mnemonic = proxiedbip39 . generateMnemonic ( )
2016-10-06 00:15:53 +11:00
2016-10-06 01:02:59 +11:00
t . plan ( 2 )
2016-10-06 01:11:19 +11:00
t . equal ( mnemonic , 'imitate robot frame trophy nuclear regret saddle around inflict case oil spice' )
2016-10-06 01:02:59 +11:00
t . equal ( bip39 . validateMnemonic ( mnemonic ) , true )
} )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
test ( 'README example 3' , function ( t ) {
var mnemonic = 'basket actual'
var seed = bip39 . mnemonicToSeed ( mnemonic )
var seedHex = bip39 . mnemonicToSeedHex ( mnemonic )
2014-12-09 20:23:15 +01:00
2016-10-06 01:10:38 +11:00
t . plan ( 3 )
2016-10-06 01:02:59 +11:00
t . equal ( seed . toString ( 'hex' ) , seedHex )
t . equal ( seedHex , '5cf2d4a8b0355e90295bdfc565a022a409af063d5365bb57bf74d9528f494bfa4400f53d8349b80fdae44082d7f9541e1dba2b003bcfec9d0d53781ca676651f' )
t . equal ( bip39 . validateMnemonic ( mnemonic ) , false )
} )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
test ( 'generateMnemonic can vary entropy length' , function ( t ) {
var words = bip39 . generateMnemonic ( 96 ) . split ( ' ' )
2014-12-09 20:23:15 +01:00
2016-10-06 01:02:59 +11:00
t . plan ( 1 )
t . equal ( words . length , 9 , 'can vary generated entropy bit length' )
} )
2015-10-02 00:30:01 +10:00
2016-10-06 01:02:59 +11:00
test ( 'generateMnemonic only requests the exact amount of data from an RNG' , function ( t ) {
t . plan ( 1 )
2015-08-17 10:36:58 +10:00
2016-10-06 01:02:59 +11:00
bip39 . generateMnemonic ( 96 , function ( size ) {
t . equal ( size , 96 / 8 )
return new Buffer ( 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 ( 4 )
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 ( '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 )
} )