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