github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/accounts/keystore/plain_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:31</date> 10 //</624450064697266176> 11 12 13 package keystore 14 15 import ( 16 "crypto/rand" 17 "encoding/hex" 18 "fmt" 19 "io/ioutil" 20 "os" 21 "path/filepath" 22 "reflect" 23 "strings" 24 "testing" 25 26 "github.com/ethereum/go-ethereum/common" 27 "github.com/ethereum/go-ethereum/crypto" 28 ) 29 30 func tmpKeyStoreIface(t *testing.T, encrypted bool) (dir string, ks keyStore) { 31 d, err := ioutil.TempDir("", "geth-keystore-test") 32 if err != nil { 33 t.Fatal(err) 34 } 35 if encrypted { 36 ks = &keyStorePassphrase{d, veryLightScryptN, veryLightScryptP, true} 37 } else { 38 ks = &keyStorePlain{d} 39 } 40 return d, ks 41 } 42 43 func TestKeyStorePlain(t *testing.T) { 44 dir, ks := tmpKeyStoreIface(t, false) 45 defer os.RemoveAll(dir) 46 47 pass := "" //未使用,但API要求 48 k1, account, err := storeNewKey(ks, rand.Reader, pass) 49 if err != nil { 50 t.Fatal(err) 51 } 52 k2, err := ks.GetKey(k1.Address, account.URL.Path, pass) 53 if err != nil { 54 t.Fatal(err) 55 } 56 if !reflect.DeepEqual(k1.Address, k2.Address) { 57 t.Fatal(err) 58 } 59 if !reflect.DeepEqual(k1.PrivateKey, k2.PrivateKey) { 60 t.Fatal(err) 61 } 62 } 63 64 func TestKeyStorePassphrase(t *testing.T) { 65 dir, ks := tmpKeyStoreIface(t, true) 66 defer os.RemoveAll(dir) 67 68 pass := "foo" 69 k1, account, err := storeNewKey(ks, rand.Reader, pass) 70 if err != nil { 71 t.Fatal(err) 72 } 73 k2, err := ks.GetKey(k1.Address, account.URL.Path, pass) 74 if err != nil { 75 t.Fatal(err) 76 } 77 if !reflect.DeepEqual(k1.Address, k2.Address) { 78 t.Fatal(err) 79 } 80 if !reflect.DeepEqual(k1.PrivateKey, k2.PrivateKey) { 81 t.Fatal(err) 82 } 83 } 84 85 func TestKeyStorePassphraseDecryptionFail(t *testing.T) { 86 dir, ks := tmpKeyStoreIface(t, true) 87 defer os.RemoveAll(dir) 88 89 pass := "foo" 90 k1, account, err := storeNewKey(ks, rand.Reader, pass) 91 if err != nil { 92 t.Fatal(err) 93 } 94 if _, err = ks.GetKey(k1.Address, account.URL.Path, "bar"); err != ErrDecrypt { 95 t.Fatalf("wrong error for invalid passphrase\ngot %q\nwant %q", err, ErrDecrypt) 96 } 97 } 98 99 func TestImportPreSaleKey(t *testing.T) { 100 dir, ks := tmpKeyStoreIface(t, true) 101 defer os.RemoveAll(dir) 102 103 //生成的预售密钥文件的文件内容: 104 //python pyethsaletool.py genwallet 105 //密码为“foo” 106 fileContent := "{\"encseed\": \"26d87f5f2bf9835f9a47eefae571bc09f9107bb13d54ff12a4ec095d01f83897494cf34f7bed2ed34126ecba9db7b62de56c9d7cd136520a0427bfb11b8954ba7ac39b90d4650d3448e31185affcd74226a68f1e94b1108e6e0a4a91cdd83eba\", \"ethaddr\": \"d4584b5f6229b7be90727b0fc8c6b91bb427821f\", \"email\": \"gustav.simonsson@gmail.com\", \"btcaddr\": \"1EVknXyFC68kKNLkh6YnKzW41svSRoaAcx\"}" 107 pass := "foo" 108 account, _, err := importPreSaleKey(ks, []byte(fileContent), pass) 109 if err != nil { 110 t.Fatal(err) 111 } 112 if account.Address != common.HexToAddress("d4584b5f6229b7be90727b0fc8c6b91bb427821f") { 113 t.Errorf("imported account has wrong address %x", account.Address) 114 } 115 if !strings.HasPrefix(account.URL.Path, dir) { 116 t.Errorf("imported account file not in keystore directory: %q", account.URL) 117 } 118 } 119 120 //在以太坊JSON测试中测试和使用密钥存储测试; 121 //测试数据密钥存储测试/basic_tests.json 122 type KeyStoreTestV3 struct { 123 Json encryptedKeyJSONV3 124 Password string 125 Priv string 126 } 127 128 type KeyStoreTestV1 struct { 129 Json encryptedKeyJSONV1 130 Password string 131 Priv string 132 } 133 134 func TestV3_PBKDF2_1(t *testing.T) { 135 t.Parallel() 136 tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t) 137 testDecryptV3(tests["wikipage_test_vector_pbkdf2"], t) 138 } 139 140 var testsSubmodule = filepath.Join("..", "..", "tests", "testdata", "KeyStoreTests") 141 142 func skipIfSubmoduleMissing(t *testing.T) { 143 if !common.FileExist(testsSubmodule) { 144 t.Skipf("can't find JSON tests from submodule at %s", testsSubmodule) 145 } 146 } 147 148 func TestV3_PBKDF2_2(t *testing.T) { 149 skipIfSubmoduleMissing(t) 150 t.Parallel() 151 tests := loadKeyStoreTestV3(filepath.Join(testsSubmodule, "basic_tests.json"), t) 152 testDecryptV3(tests["test1"], t) 153 } 154 155 func TestV3_PBKDF2_3(t *testing.T) { 156 skipIfSubmoduleMissing(t) 157 t.Parallel() 158 tests := loadKeyStoreTestV3(filepath.Join(testsSubmodule, "basic_tests.json"), t) 159 testDecryptV3(tests["python_generated_test_with_odd_iv"], t) 160 } 161 162 func TestV3_PBKDF2_4(t *testing.T) { 163 skipIfSubmoduleMissing(t) 164 t.Parallel() 165 tests := loadKeyStoreTestV3(filepath.Join(testsSubmodule, "basic_tests.json"), t) 166 testDecryptV3(tests["evilnonce"], t) 167 } 168 169 func TestV3_Scrypt_1(t *testing.T) { 170 t.Parallel() 171 tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t) 172 testDecryptV3(tests["wikipage_test_vector_scrypt"], t) 173 } 174 175 func TestV3_Scrypt_2(t *testing.T) { 176 skipIfSubmoduleMissing(t) 177 t.Parallel() 178 tests := loadKeyStoreTestV3(filepath.Join(testsSubmodule, "basic_tests.json"), t) 179 testDecryptV3(tests["test2"], t) 180 } 181 182 func TestV1_1(t *testing.T) { 183 t.Parallel() 184 tests := loadKeyStoreTestV1("testdata/v1_test_vector.json", t) 185 testDecryptV1(tests["test1"], t) 186 } 187 188 func TestV1_2(t *testing.T) { 189 t.Parallel() 190 ks := &keyStorePassphrase{"testdata/v1", LightScryptN, LightScryptP, true} 191 addr := common.HexToAddress("cb61d5a9c4896fb9658090b597ef0e7be6f7b67e") 192 file := "testdata/v1/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e" 193 k, err := ks.GetKey(addr, file, "g") 194 if err != nil { 195 t.Fatal(err) 196 } 197 privHex := hex.EncodeToString(crypto.FromECDSA(k.PrivateKey)) 198 expectedHex := "d1b1178d3529626a1a93e073f65028370d14c7eb0936eb42abef05db6f37ad7d" 199 if privHex != expectedHex { 200 t.Fatal(fmt.Errorf("Unexpected privkey: %v, expected %v", privHex, expectedHex)) 201 } 202 } 203 204 func testDecryptV3(test KeyStoreTestV3, t *testing.T) { 205 privBytes, _, err := decryptKeyV3(&test.Json, test.Password) 206 if err != nil { 207 t.Fatal(err) 208 } 209 privHex := hex.EncodeToString(privBytes) 210 if test.Priv != privHex { 211 t.Fatal(fmt.Errorf("Decrypted bytes not equal to test, expected %v have %v", test.Priv, privHex)) 212 } 213 } 214 215 func testDecryptV1(test KeyStoreTestV1, t *testing.T) { 216 privBytes, _, err := decryptKeyV1(&test.Json, test.Password) 217 if err != nil { 218 t.Fatal(err) 219 } 220 privHex := hex.EncodeToString(privBytes) 221 if test.Priv != privHex { 222 t.Fatal(fmt.Errorf("Decrypted bytes not equal to test, expected %v have %v", test.Priv, privHex)) 223 } 224 } 225 226 func loadKeyStoreTestV3(file string, t *testing.T) map[string]KeyStoreTestV3 { 227 tests := make(map[string]KeyStoreTestV3) 228 err := common.LoadJSON(file, &tests) 229 if err != nil { 230 t.Fatal(err) 231 } 232 return tests 233 } 234 235 func loadKeyStoreTestV1(file string, t *testing.T) map[string]KeyStoreTestV1 { 236 tests := make(map[string]KeyStoreTestV1) 237 err := common.LoadJSON(file, &tests) 238 if err != nil { 239 t.Fatal(err) 240 } 241 return tests 242 } 243 244 func TestKeyForDirectICAP(t *testing.T) { 245 t.Parallel() 246 key := NewKeyForDirectICAP(rand.Reader) 247 if !strings.HasPrefix(key.Address.Hex(), "0x00") { 248 t.Errorf("Expected first address byte to be zero, have: %s", key.Address.Hex()) 249 } 250 } 251 252 func TestV3_31_Byte_Key(t *testing.T) { 253 t.Parallel() 254 tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t) 255 testDecryptV3(tests["31_byte_key"], t) 256 } 257 258 func TestV3_30_Byte_Key(t *testing.T) { 259 t.Parallel() 260 tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t) 261 testDecryptV3(tests["30_byte_key"], t) 262 } 263