github.com/turingchain2020/turingchain@v1.1.21/wallet/bipwallet/go-bip39/bip39_test.go (about)

     1  // Copyright Turing Corp. 2018 All Rights Reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package bip39
     6  
     7  import (
     8  	"crypto/rand"
     9  	"encoding/hex"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  type Vector struct {
    16  	entropy  string
    17  	mnemonic string
    18  	seed     string
    19  }
    20  
    21  func TestBip39(t *testing.T) {
    22  	for _, vector := range testVectors() {
    23  		entropy, err := hex.DecodeString(vector.entropy)
    24  		assert.NoError(t, err)
    25  
    26  		mnemonic, err := NewMnemonic(entropy, 0)
    27  		assert.NoError(t, err)
    28  		assert.Equal(t, vector.mnemonic, mnemonic)
    29  
    30  		// expectedSeed, err := hex.DecodeString(vector.seed)
    31  		seed := NewSeed(mnemonic, "TREZOR")
    32  		assert.Equal(t, vector.seed, hex.EncodeToString(seed))
    33  	}
    34  }
    35  
    36  func TestIsMnemonicValid(t *testing.T) {
    37  	for _, vector := range badMnemonicSentences() {
    38  		assert.Equal(t, IsMnemonicValid(vector.mnemonic), false)
    39  	}
    40  
    41  	for _, vector := range testVectors() {
    42  		assert.Equal(t, IsMnemonicValid(vector.mnemonic), true)
    43  	}
    44  }
    45  
    46  func TestMnemonicToByteArray(t *testing.T) {
    47  
    48  }
    49  
    50  func TestMnemonicToByteArrayForDifferentArrayLangths(t *testing.T) {
    51  	max := 1000
    52  	for i := 0; i < max; i++ {
    53  		//16, 20, 24, 28, 32
    54  		length := 16 + (i%5)*4
    55  		seed := make([]byte, length)
    56  		if n, err := rand.Read(seed); err != nil {
    57  			t.Errorf("%v", err)
    58  		} else if n != length {
    59  			t.Errorf("Wrong number of bytes read: %d", n)
    60  		}
    61  
    62  		mnemonic, err := NewMnemonic(seed, 0)
    63  		if err != nil {
    64  			t.Errorf("%v", err)
    65  		}
    66  
    67  		_, err = MnemonicToByteArray(mnemonic)
    68  		if err != nil {
    69  			t.Errorf("Failed for %x - %v", seed, mnemonic)
    70  		}
    71  	}
    72  }
    73  
    74  func TestMnemonicToByteArrayForZeroLeadingSeeds(t *testing.T) {
    75  	ms := []string{
    76  		"00000000000000000000000000000000",
    77  		"00a84c51041d49acca66e6160c1fa999",
    78  		"00ca45df1673c76537a2020bfed1dafd",
    79  		"0019d5871c7b81fd83d474ef1c1e1dae",
    80  		"00dcb021afb35ffcdd1d032d2056fc86",
    81  		"0062be7bd09a27288b6cf0eb565ec739",
    82  		"00dc705b5efa0adf25b9734226ba60d4",
    83  		"0017747418d54c6003fa64fade83374b",
    84  		"000d44d3ee7c3dfa45e608c65384431b",
    85  		"008241c1ef976b0323061affe5bf24b9",
    86  		"00a6aec77e4d16bea80b50a34991aaba",
    87  		"0011527b8c6ddecb9d0c20beccdeb58d",
    88  		"001c938c503c8f5a2bba2248ff621546",
    89  		"0002f90aaf7a8327698f0031b6317c36",
    90  		"00bff43071ed7e07f77b14f615993bac",
    91  		"00da143e00ef17fc63b6fb22dcc2c326",
    92  		"00ffc6764fb32a354cab1a3ddefb015d",
    93  		"0062ef47e0985e8953f24760b7598cdd",
    94  		"003bf9765064f71d304908d906c065f5",
    95  		"00993851503471439d154b3613947474",
    96  		"007ad0ffe9eae753a483a76af06dfa67",
    97  		"00091824db9ec19e663bee51d64c83cc",
    98  		"00f48ac621f7e3cb39b2012ac3121543",
    99  		"0072917415cdca24dfa66c4a92c885b4",
   100  		"0027ced2b279ea8a91d29364487cdbf4",
   101  		"00b9c0d37fb10ba272e55842ad812583",
   102  		"004b3d0d2b9285946c687a5350479c8c",
   103  		"00c7c12a37d3a7f8c1532b17c89b724c",
   104  		"00f400c5545f06ae17ad00f3041e4e26",
   105  		"001e290be10df4d209f247ac5878662b",
   106  		"00bf0f74568e582a7dd1ee64f792ec8b",
   107  		"00d2e43ecde6b72b847db1539ed89e23",
   108  		"00cecba6678505bb7bfec8ed307251f6",
   109  		"000aeed1a9edcbb4bc88f610d3ce84eb",
   110  		"00d06206aadfc25c2b21805d283f15ae",
   111  		"00a31789a2ab2d54f8fadd5331010287",
   112  		"003493c5f520e8d5c0483e895a121dc9",
   113  		"004706112800b76001ece2e268bc830e",
   114  		"00ab31e28bb5305be56e38337dbfa486",
   115  		"006872fe85df6b0fa945248e6f9379d1",
   116  		"00717e5e375da6934e3cfdf57edaf3bd",
   117  		"007f1b46e7b9c4c76e77c434b9bccd6b",
   118  		"00dc93735aa35def3b9a2ff676560205",
   119  		"002cd5dcd881a49c7b87714c6a570a76",
   120  		"0013b5af9e13fac87e0c505686cfb6bf",
   121  		"007ab1ec9526b0bc04b64ae65fd42631",
   122  		"00abb4e11d8385c1cca905a6a65e9144",
   123  		"00574fc62a0501ad8afada2e246708c3",
   124  		"005207e0a815bb2da6b4c35ec1f2bf52",
   125  		"00f3460f136fb9700080099cbd62bc18",
   126  		"007a591f204c03ca7b93981237112526",
   127  		"00cfe0befd428f8e5f83a5bfc801472e",
   128  		"00987551ac7a879bf0c09b8bc474d9af",
   129  		"00cadd3ce3d78e49fbc933a85682df3f",
   130  		"00bfbf2e346c855ccc360d03281455a1",
   131  		"004cdf55d429d028f715544ce22d4f31",
   132  		"0075c84a7d15e0ac85e1e41025eed23b",
   133  		"00807dddd61f71725d336cab844d2cb5",
   134  		"00422f21b77fe20e367467ed98c18410",
   135  		"00b44d0ac622907119c626c850a462fd",
   136  		"00363f5e7f22fc49f3cd662a28956563",
   137  		"000fe5837e68397bbf58db9f221bdc4e",
   138  		"0056af33835c888ef0c22599686445d3",
   139  		"00790a8647fd3dfb38b7e2b6f578f2c6",
   140  		"00da8d9009675cb7beec930e263014fb",
   141  		"00d4b384540a5bb54aa760edaa4fb2fe",
   142  		"00be9b1479ed680fdd5d91a41eb926d0",
   143  		"009182347502af97077c40a6e74b4b5c",
   144  		"00f5c90ee1c67fa77fd821f8e9fab4f1",
   145  		"005568f9a2dd6b0c0cc2f5ba3d9cac38",
   146  		"008b481f8678577d9cf6aa3f6cd6056b",
   147  		"00c4323ece5e4fe3b6cd4c5c932931af",
   148  		"009791f7550c3798c5a214cb2d0ea773",
   149  		"008a7baab22481f0ad8167dd9f90d55c",
   150  		"00f0e601519aafdc8ff94975e64c946d",
   151  		"0083b61e0daa9219df59d697c270cd31",
   152  	}
   153  
   154  	for _, m := range ms {
   155  		seed, _ := hex.DecodeString(m)
   156  
   157  		mnemonic, err := NewMnemonic(seed, 0)
   158  		if err != nil {
   159  			t.Errorf("%v", err)
   160  		}
   161  
   162  		_, err = MnemonicToByteArray(mnemonic)
   163  		if err != nil {
   164  			t.Errorf("Failed for %x - %v", seed, mnemonic)
   165  		}
   166  	}
   167  }
   168  
   169  func badMnemonicSentences() []Vector {
   170  	return []Vector{
   171  		{
   172  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon",
   173  		},
   174  		{
   175  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow yellow",
   176  		},
   177  		{
   178  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice caged above",
   179  		},
   180  		{
   181  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo, wrong",
   182  		},
   183  		{
   184  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon",
   185  		},
   186  		{
   187  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will will will",
   188  		},
   189  		{
   190  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always.",
   191  		},
   192  		{
   193  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo why",
   194  		},
   195  		{
   196  			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",
   197  		},
   198  		{
   199  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thanks year wave worth useful legal winner thank year wave sausage worth title",
   200  		},
   201  		{
   202  			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",
   203  		},
   204  		{
   205  			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",
   206  		},
   207  		{
   208  			mnemonic: "jello better achieve collect unaware mountain thought cargo oxygen act hood bridge",
   209  		},
   210  		{
   211  			mnemonic: "renew, stay, biology, evidence, goat, welcome, casual, join, adapt, armor, shuffle, fault, little, machine, walk, stumble, urge, swap",
   212  		},
   213  		{
   214  			mnemonic: "dignity pass list indicate nasty",
   215  		},
   216  	}
   217  }
   218  
   219  func testVectors() []Vector {
   220  	return []Vector{
   221  		{
   222  			entropy:  "00000000000000000000000000000000",
   223  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
   224  			seed:     "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04",
   225  		},
   226  		{
   227  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   228  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow",
   229  			seed:     "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607",
   230  		},
   231  		{
   232  			entropy:  "80808080808080808080808080808080",
   233  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage above",
   234  			seed:     "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8",
   235  		},
   236  		{
   237  			entropy:  "ffffffffffffffffffffffffffffffff",
   238  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
   239  			seed:     "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069",
   240  		},
   241  		{
   242  			entropy:  "000000000000000000000000000000000000000000000000",
   243  			mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
   244  			seed:     "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa",
   245  		},
   246  		{
   247  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   248  			mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
   249  			seed:     "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd",
   250  		},
   251  		{
   252  			entropy:  "808080808080808080808080808080808080808080808080",
   253  			mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
   254  			seed:     "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65",
   255  		},
   256  		{
   257  			entropy:  "ffffffffffffffffffffffffffffffffffffffffffffffff",
   258  			mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
   259  			seed:     "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528",
   260  		},
   261  		{
   262  			entropy:  "0000000000000000000000000000000000000000000000000000000000000000",
   263  			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",
   264  			seed:     "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8",
   265  		},
   266  		{
   267  			entropy:  "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
   268  			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",
   269  			seed:     "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87",
   270  		},
   271  		{
   272  			entropy:  "8080808080808080808080808080808080808080808080808080808080808080",
   273  			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",
   274  			seed:     "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f",
   275  		},
   276  		{
   277  			entropy:  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
   278  			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",
   279  			seed:     "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad",
   280  		},
   281  		{
   282  			entropy:  "77c2b00716cec7213839159e404db50d",
   283  			mnemonic: "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge",
   284  			seed:     "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff",
   285  		},
   286  		{
   287  			entropy:  "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b",
   288  			mnemonic: "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
   289  			seed:     "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5",
   290  		},
   291  		{
   292  			entropy:  "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982",
   293  			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",
   294  			seed:     "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67",
   295  		},
   296  		{
   297  			entropy:  "0460ef47585604c5660618db2e6a7e7f",
   298  			mnemonic: "afford alter spike radar gate glance object seek swamp infant panel yellow",
   299  			seed:     "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4",
   300  		},
   301  		{
   302  			entropy:  "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f",
   303  			mnemonic: "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
   304  			seed:     "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba",
   305  		},
   306  		{
   307  			entropy:  "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416",
   308  			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",
   309  			seed:     "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449",
   310  		},
   311  		{
   312  			entropy:  "eaebabb2383351fd31d703840b32e9e2",
   313  			mnemonic: "turtle front uncle idea crush write shrug there lottery flower risk shell",
   314  			seed:     "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c",
   315  		},
   316  		{
   317  			entropy:  "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78",
   318  			mnemonic: "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
   319  			seed:     "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79",
   320  		},
   321  		{
   322  			entropy:  "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef",
   323  			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",
   324  			seed:     "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c",
   325  		},
   326  		{
   327  			entropy:  "18ab19a9f54a9274f03e5209a2ac8a91",
   328  			mnemonic: "board flee heavy tunnel powder denial science ski answer betray cargo cat",
   329  			seed:     "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8",
   330  		},
   331  		{
   332  			entropy:  "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4",
   333  			mnemonic: "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
   334  			seed:     "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9",
   335  		},
   336  		{
   337  			entropy:  "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419",
   338  			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",
   339  			seed:     "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd",
   340  		},
   341  	}
   342  }