github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/bip39/bip39_test.go (about)

     1  package bip39
     2  
     3  import (
     4  	"crypto/rand"
     5  	"encoding/hex"
     6  	"testing"
     7  )
     8  
     9  type vector struct {
    10  	entropy  string
    11  	mnemonic string
    12  	seed     string
    13  }
    14  
    15  func TestGetWordList(t *testing.T) {
    16  	assertEqualStringSlices(t, wordlistsEnglish, GetWordList())
    17  }
    18  
    19  func TestGetWordIndex(t *testing.T) {
    20  	for expectedIdx, word := range wordList {
    21  		actualIdx, ok := GetWordIndex(word)
    22  		assertTrue(t, ok)
    23  		assertEqual(t, actualIdx, expectedIdx)
    24  	}
    25  
    26  	for _, word := range []string{"a", "set", "of", "invalid", "words"} {
    27  		actualIdx, ok := GetWordIndex(word)
    28  		assertFalse(t, ok)
    29  		assertEqual(t, actualIdx, 0)
    30  	}
    31  }
    32  
    33  func TestNewMnemonic(t *testing.T) {
    34  	for _, vector := range testVectors() {
    35  		entropy, err := hex.DecodeString(vector.entropy)
    36  		assertNil(t, err)
    37  
    38  		mnemonic, err := NewMnemonic(entropy)
    39  		assertNil(t, err)
    40  		assertEqualString(t, vector.mnemonic, mnemonic)
    41  
    42  		_, err = NewSeedWithErrorChecking(mnemonic, "TREZOR")
    43  		assertNil(t, err)
    44  
    45  		seed := NewSeed(mnemonic, "TREZOR")
    46  		assertEqualString(t, vector.seed, hex.EncodeToString(seed))
    47  	}
    48  }
    49  
    50  func TestNewMnemonicInvalidEntropy(t *testing.T) {
    51  	_, err := NewMnemonic([]byte{})
    52  	assertNotNil(t, err)
    53  }
    54  
    55  func TestNewSeedWithErrorCheckingInvalidMnemonics(t *testing.T) {
    56  	for _, vector := range badMnemonicSentences() {
    57  		_, err := NewSeedWithErrorChecking(vector.mnemonic, "TREZOR")
    58  		assertNotNil(t, err)
    59  	}
    60  }
    61  
    62  func TestIsMnemonicValid(t *testing.T) {
    63  	for _, vector := range badMnemonicSentences() {
    64  		assertFalse(t, IsMnemonicValid(vector.mnemonic) == nil)
    65  	}
    66  
    67  	for _, vector := range testVectors() {
    68  		assertTrue(t, IsMnemonicValid(vector.mnemonic) == nil)
    69  	}
    70  }
    71  
    72  func TestMnemonicToByteArrayInvalidMnemonic(t *testing.T) {
    73  	for _, vector := range badMnemonicSentences() {
    74  		_, err := MnemonicToByteArray(vector.mnemonic)
    75  		assertNotNil(t, err)
    76  	}
    77  
    78  	_, err := MnemonicToByteArray("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow")
    79  	assertNotNil(t, err)
    80  	assertEqual(t, err, ErrChecksumIncorrect)
    81  }
    82  
    83  func TestNewEntropy(t *testing.T) {
    84  	// Good tests.
    85  	for i := 128; i <= 256; i += 32 {
    86  		_, err := NewEntropy(i)
    87  		assertNil(t, err)
    88  	}
    89  	// Bad Values
    90  	for i := 0; i <= 256; i++ {
    91  		if i%8 != 0 {
    92  			_, err := NewEntropy(i)
    93  			assertNotNil(t, err)
    94  		}
    95  	}
    96  }
    97  
    98  func TestMnemonicToByteArrayForDifferentArrayLangths(t *testing.T) {
    99  	max := 1000
   100  	for i := 0; i < max; i++ {
   101  		//16, 20, 24, 28, 32
   102  		length := 16 + (i%5)*4
   103  		seed := make([]byte, length)
   104  		if n, err := rand.Read(seed); err != nil {
   105  			t.Errorf("%v", err)
   106  		} else if n != length {
   107  			t.Errorf("Wrong number of bytes read: %d", n)
   108  		}
   109  
   110  		mnemonic, err := NewMnemonic(seed)
   111  		if err != nil {
   112  			t.Errorf("%v", err)
   113  		}
   114  
   115  		_, err = MnemonicToByteArray(mnemonic)
   116  		if err != nil {
   117  			t.Errorf("Failed for %x - %v", seed, mnemonic)
   118  		}
   119  	}
   120  }
   121  func TestPadByteSlice(t *testing.T) {
   122  	assertEqualByteSlices(t, []byte{0}, padByteSlice([]byte{}, 1))
   123  	assertEqualByteSlices(t, []byte{0, 1}, padByteSlice([]byte{1}, 2))
   124  	assertEqualByteSlices(t, []byte{1, 1}, padByteSlice([]byte{1, 1}, 2))
   125  	assertEqualByteSlices(t, []byte{1, 1, 1}, padByteSlice([]byte{1, 1, 1}, 2))
   126  }
   127  
   128  func TestCompareByteSlices(t *testing.T) {
   129  	assertTrue(t, compareByteSlices([]byte{}, []byte{}))
   130  	assertTrue(t, compareByteSlices([]byte{1}, []byte{1}))
   131  	assertFalse(t, compareByteSlices([]byte{1}, []byte{0}))
   132  	assertFalse(t, compareByteSlices([]byte{1}, []byte{}))
   133  	assertFalse(t, compareByteSlices([]byte{1}, nil))
   134  }
   135  
   136  func TestMnemonicToByteArrayForZeroLeadingSeeds(t *testing.T) {
   137  	ms := []string{
   138  		"00000000000000000000000000000000",
   139  		"00a84c51041d49acca66e6160c1fa999",
   140  		"00ca45df1673c76537a2020bfed1dafd",
   141  		"0019d5871c7b81fd83d474ef1c1e1dae",
   142  		"00dcb021afb35ffcdd1d032d2056fc86",
   143  		"0062be7bd09a27288b6cf0eb565ec739",
   144  		"00dc705b5efa0adf25b9734226ba60d4",
   145  		"0017747418d54c6003fa64fade83374b",
   146  		"000d44d3ee7c3dfa45e608c65384431b",
   147  		"008241c1ef976b0323061affe5bf24b9",
   148  		"00a6aec77e4d16bea80b50a34991aaba",
   149  		"0011527b8c6ddecb9d0c20beccdeb58d",
   150  		"001c938c503c8f5a2bba2248ff621546",
   151  		"0002f90aaf7a8327698f0031b6317c36",
   152  		"00bff43071ed7e07f77b14f615993bac",
   153  		"00da143e00ef17fc63b6fb22dcc2c326",
   154  		"00ffc6764fb32a354cab1a3ddefb015d",
   155  		"0062ef47e0985e8953f24760b7598cdd",
   156  		"003bf9765064f71d304908d906c065f5",
   157  		"00993851503471439d154b3613947474",
   158  		"007ad0ffe9eae753a483a76af06dfa67",
   159  		"00091824db9ec19e663bee51d64c83cc",
   160  		"00f48ac621f7e3cb39b2012ac3121543",
   161  		"0072917415cdca24dfa66c4a92c885b4",
   162  		"0027ced2b279ea8a91d29364487cdbf4",
   163  		"00b9c0d37fb10ba272e55842ad812583",
   164  		"004b3d0d2b9285946c687a5350479c8c",
   165  		"00c7c12a37d3a7f8c1532b17c89b724c",
   166  		"00f400c5545f06ae17ad00f3041e4e26",
   167  		"001e290be10df4d209f247ac5878662b",
   168  		"00bf0f74568e582a7dd1ee64f792ec8b",
   169  		"00d2e43ecde6b72b847db1539ed89e23",
   170  		"00cecba6678505bb7bfec8ed307251f6",
   171  		"000aeed1a9edcbb4bc88f610d3ce84eb",
   172  		"00d06206aadfc25c2b21805d283f15ae",
   173  		"00a31789a2ab2d54f8fadd5331010287",
   174  		"003493c5f520e8d5c0483e895a121dc9",
   175  		"004706112800b76001ece2e268bc830e",
   176  		"00ab31e28bb5305be56e38337dbfa486",
   177  		"006872fe85df6b0fa945248e6f9379d1",
   178  		"00717e5e375da6934e3cfdf57edaf3bd",
   179  		"007f1b46e7b9c4c76e77c434b9bccd6b",
   180  		"00dc93735aa35def3b9a2ff676560205",
   181  		"002cd5dcd881a49c7b87714c6a570a76",
   182  		"0013b5af9e13fac87e0c505686cfb6bf",
   183  		"007ab1ec9526b0bc04b64ae65fd42631",
   184  		"00abb4e11d8385c1cca905a6a65e9144",
   185  		"00574fc62a0501ad8afada2e246708c3",
   186  		"005207e0a815bb2da6b4c35ec1f2bf52",
   187  		"00f3460f136fb9700080099cbd62bc18",
   188  		"007a591f204c03ca7b93981237112526",
   189  		"00cfe0befd428f8e5f83a5bfc801472e",
   190  		"00987551ac7a879bf0c09b8bc474d9af",
   191  		"00cadd3ce3d78e49fbc933a85682df3f",
   192  		"00bfbf2e346c855ccc360d03281455a1",
   193  		"004cdf55d429d028f715544ce22d4f31",
   194  		"0075c84a7d15e0ac85e1e41025eed23b",
   195  		"00807dddd61f71725d336cab844d2cb5",
   196  		"00422f21b77fe20e367467ed98c18410",
   197  		"00b44d0ac622907119c626c850a462fd",
   198  		"00363f5e7f22fc49f3cd662a28956563",
   199  		"000fe5837e68397bbf58db9f221bdc4e",
   200  		"0056af33835c888ef0c22599686445d3",
   201  		"00790a8647fd3dfb38b7e2b6f578f2c6",
   202  		"00da8d9009675cb7beec930e263014fb",
   203  		"00d4b384540a5bb54aa760edaa4fb2fe",
   204  		"00be9b1479ed680fdd5d91a41eb926d0",
   205  		"009182347502af97077c40a6e74b4b5c",
   206  		"00f5c90ee1c67fa77fd821f8e9fab4f1",
   207  		"005568f9a2dd6b0c0cc2f5ba3d9cac38",
   208  		"008b481f8678577d9cf6aa3f6cd6056b",
   209  		"00c4323ece5e4fe3b6cd4c5c932931af",
   210  		"009791f7550c3798c5a214cb2d0ea773",
   211  		"008a7baab22481f0ad8167dd9f90d55c",
   212  		"00f0e601519aafdc8ff94975e64c946d",
   213  		"0083b61e0daa9219df59d697c270cd31",
   214  	}
   215  
   216  	for _, m := range ms {
   217  		seed, _ := hex.DecodeString(m)
   218  
   219  		mnemonic, err := NewMnemonic(seed)
   220  		if err != nil {
   221  			t.Errorf("%v", err)
   222  		}
   223  
   224  		_, err = MnemonicToByteArray(mnemonic)
   225  		if err != nil {
   226  			t.Errorf("Failed for %x - %v", seed, mnemonic)
   227  		}
   228  	}
   229  }
   230  func TestEntropyFromMnemonic128(t *testing.T) {
   231  	testEntropyFromMnemonic(t, 128)
   232  }
   233  
   234  func TestEntropyFromMnemonic160(t *testing.T) {
   235  	testEntropyFromMnemonic(t, 160)
   236  }
   237  
   238  func TestEntropyFromMnemonic192(t *testing.T) {
   239  	testEntropyFromMnemonic(t, 192)
   240  }
   241  
   242  func TestEntropyFromMnemonic224(t *testing.T) {
   243  	testEntropyFromMnemonic(t, 224)
   244  }
   245  
   246  func TestEntropyFromMnemonic256(t *testing.T) {
   247  	testEntropyFromMnemonic(t, 256)
   248  }
   249  
   250  func TestEntropyFromMnemonicInvalidChecksum(t *testing.T) {
   251  	_, err := EntropyFromMnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow")
   252  	assertEqual(t, ErrChecksumIncorrect, err)
   253  }
   254  
   255  func TestEntropyFromMnemonicInvalidMnemonicSize(t *testing.T) {
   256  	for _, mnemonic := range []string{
   257  		"a a a a a a a a a a a a a a a a a a a a a a a a a", // Too many words
   258  		"a",                           // Too few
   259  		"a a a a a a a a a a a a a a", // Not multiple of 3
   260  	} {
   261  		_, err := EntropyFromMnemonic(mnemonic)
   262  		assertEqual(t, ErrInvalidMnemonic, err)
   263  	}
   264  }
   265  
   266  func testEntropyFromMnemonic(t *testing.T, bitSize int) {
   267  	for i := 0; i < 512; i++ {
   268  		expectedEntropy, err := NewEntropy(bitSize)
   269  		assertNil(t, err)
   270  		assertTrue(t, len(expectedEntropy) != 0)
   271  
   272  		mnemonic, err := NewMnemonic(expectedEntropy)
   273  		assertNil(t, err)
   274  		assertTrue(t, len(mnemonic) != 0)
   275  
   276  		actualEntropy, err := EntropyFromMnemonic(mnemonic)
   277  		assertNil(t, err)
   278  		assertEqualByteSlices(t, expectedEntropy, actualEntropy)
   279  	}
   280  }
   281  
   282  func testVectors() []vector {
   283  	return []vector{
   284  		{
   285  			entropy:  "00000000000000000000000000000000",
   286  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
   287  			seed:     "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04",
   288  		},
   289  		{
   290  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   291  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow",
   292  			seed:     "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607",
   293  		},
   294  		{
   295  			entropy:  "80808080808080808080808080808080",
   296  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage above",
   297  			seed:     "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8",
   298  		},
   299  		{
   300  			entropy:  "ffffffffffffffffffffffffffffffff",
   301  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
   302  			seed:     "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069",
   303  		},
   304  		{
   305  			entropy:  "000000000000000000000000000000000000000000000000",
   306  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
   307  			seed:     "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa",
   308  		},
   309  		{
   310  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   311  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
   312  			seed:     "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd",
   313  		},
   314  		{
   315  			entropy:  "808080808080808080808080808080808080808080808080",
   316  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
   317  			seed:     "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65",
   318  		},
   319  		{
   320  			entropy:  "ffffffffffffffffffffffffffffffffffffffffffffffff",
   321  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
   322  			seed:     "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528",
   323  		},
   324  		{
   325  			entropy:  "0000000000000000000000000000000000000000000000000000000000000000",
   326  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
   327  			seed:     "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8",
   328  		},
   329  		{
   330  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   331  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
   332  			seed:     "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87",
   333  		},
   334  		{
   335  			entropy:  "8080808080808080808080808080808080808080808080808080808080808080",
   336  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
   337  			seed:     "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f",
   338  		},
   339  		{
   340  			entropy:  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
   341  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
   342  			seed:     "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad",
   343  		},
   344  		{
   345  			entropy:  "77c2b00716cec7213839159e404db50d",
   346  			mnemonic: "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge",
   347  			seed:     "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff",
   348  		},
   349  		{
   350  			entropy:  "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b",
   351  			mnemonic: "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
   352  			seed:     "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5",
   353  		},
   354  		{
   355  			entropy:  "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982",
   356  			mnemonic: "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic",
   357  			seed:     "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67",
   358  		},
   359  		{
   360  			entropy:  "0460ef47585604c5660618db2e6a7e7f",
   361  			mnemonic: "afford alter spike radar gate glance object seek swamp infant panel yellow",
   362  			seed:     "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4",
   363  		},
   364  		{
   365  			entropy:  "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f",
   366  			mnemonic: "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
   367  			seed:     "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba",
   368  		},
   369  		{
   370  			entropy:  "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416",
   371  			mnemonic: "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste",
   372  			seed:     "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449",
   373  		},
   374  		{
   375  			entropy:  "eaebabb2383351fd31d703840b32e9e2",
   376  			mnemonic: "turtle front uncle idea crush write shrug there lottery flower risk shell",
   377  			seed:     "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c",
   378  		},
   379  		{
   380  			entropy:  "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78",
   381  			mnemonic: "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
   382  			seed:     "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79",
   383  		},
   384  		{
   385  			entropy:  "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef",
   386  			mnemonic: "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top",
   387  			seed:     "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c",
   388  		},
   389  		{
   390  			entropy:  "18ab19a9f54a9274f03e5209a2ac8a91",
   391  			mnemonic: "board flee heavy tunnel powder denial science ski answer betray cargo cat",
   392  			seed:     "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8",
   393  		},
   394  		{
   395  			entropy:  "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4",
   396  			mnemonic: "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
   397  			seed:     "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9",
   398  		},
   399  		{
   400  			entropy:  "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419",
   401  			mnemonic: "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut",
   402  			seed:     "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd",
   403  		},
   404  	}
   405  }
   406  
   407  func badMnemonicSentences() []vector {
   408  	return []vector{
   409  		{mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon"},
   410  		{mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow yellow"},
   411  		{mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice caged above"},
   412  		{mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo, wrong"},
   413  		{mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon"},
   414  		{mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will will will"},
   415  		{mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always."},
   416  		{mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo why"},
   417  		{mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art art"},
   418  		{mnemonic: "legal winner thank year wave sausage worth useful legal winner thanks year wave worth useful legal winner thank year wave sausage worth title"},
   419  		{mnemonic: "letter advice cage absurd amount doctor acoustic avoid letters advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless"},
   420  		{mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo voted"},
   421  		{mnemonic: "jello better achieve collect unaware mountain thought cargo oxygen act hood bridge"},
   422  		{mnemonic: "renew, stay, biology, evidence, goat, welcome, casual, join, adapt, armor, shuffle, fault, little, machine, walk, stumble, urge, swap"},
   423  		{mnemonic: "dignity pass list indicate nasty"},
   424  
   425  		// From issue 32
   426  		{mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon letter"},
   427  	}
   428  }
   429  
   430  func assertNil(t *testing.T, object interface{}) {
   431  	if object != nil {
   432  		t.Errorf("Expected nil, got %v", object)
   433  	}
   434  }
   435  
   436  func assertNotNil(t *testing.T, object interface{}) {
   437  	if object == nil {
   438  		t.Error("Expected not nil")
   439  	}
   440  }
   441  
   442  func assertTrue(t *testing.T, a bool) {
   443  	if !a {
   444  		t.Error("Expected true, got false")
   445  	}
   446  }
   447  
   448  func assertFalse(t *testing.T, a bool) {
   449  	if a {
   450  		t.Error("Expected false, got true")
   451  	}
   452  }
   453  
   454  func assertEqual(t *testing.T, a, b interface{}) {
   455  	if a != b {
   456  		t.Errorf("Objects not equal, expected `%s` and got `%s`", a, b)
   457  	}
   458  }
   459  
   460  func assertEqualString(t *testing.T, a, b string) {
   461  	if a != b {
   462  		t.Errorf("Strings not equal, expected `%s` and got `%s`", a, b)
   463  	}
   464  }
   465  
   466  func assertEqualStringSlices(t *testing.T, a, b []string) {
   467  	if len(a) != len(b) {
   468  		t.Errorf("String slices not equal, expected %v and got %v", a, b)
   469  		return
   470  	}
   471  	for i := range a {
   472  		if a[i] != b[i] {
   473  			t.Errorf("String slices not equal, expected %v and got %v", a, b)
   474  			return
   475  		}
   476  	}
   477  }
   478  
   479  func assertEqualByteSlices(t *testing.T, a, b []byte) {
   480  	if len(a) != len(b) {
   481  		t.Errorf("Byte slices not equal, expected %v and got %v", a, b)
   482  		return
   483  	}
   484  	for i := range a {
   485  		if a[i] != b[i] {
   486  			t.Errorf("Byte slices not equal, expected %v and got %v", a, b)
   487  			return
   488  		}
   489  	}
   490  }