keystore_plain_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package keystore
  17. import (
  18. "crypto/rand"
  19. "encoding/hex"
  20. "fmt"
  21. "io/ioutil"
  22. "os"
  23. "reflect"
  24. "strings"
  25. "testing"
  26. "github.com/ethereum/go-ethereum/common"
  27. "github.com/ethereum/go-ethereum/crypto"
  28. )
  29. func tmpKeyStoreIface(t *testing.T, encrypted bool) (dir string, ks keyStore) {
  30. d, err := ioutil.TempDir("", "geth-keystore-test")
  31. if err != nil {
  32. t.Fatal(err)
  33. }
  34. if encrypted {
  35. ks = &keyStorePassphrase{d, veryLightScryptN, veryLightScryptP}
  36. } else {
  37. ks = &keyStorePlain{d}
  38. }
  39. return d, ks
  40. }
  41. func TestKeyStorePlain(t *testing.T) {
  42. dir, ks := tmpKeyStoreIface(t, false)
  43. defer os.RemoveAll(dir)
  44. pass := "" // not used but required by API
  45. k1, account, err := storeNewKey(ks, rand.Reader, pass)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. k2, err := ks.GetKey(k1.Address, account.URL, pass)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. if !reflect.DeepEqual(k1.Address, k2.Address) {
  54. t.Fatal(err)
  55. }
  56. if !reflect.DeepEqual(k1.PrivateKey, k2.PrivateKey) {
  57. t.Fatal(err)
  58. }
  59. }
  60. func TestKeyStorePassphrase(t *testing.T) {
  61. dir, ks := tmpKeyStoreIface(t, true)
  62. defer os.RemoveAll(dir)
  63. pass := "foo"
  64. k1, account, err := storeNewKey(ks, rand.Reader, pass)
  65. if err != nil {
  66. t.Fatal(err)
  67. }
  68. k2, err := ks.GetKey(k1.Address, account.URL, pass)
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. if !reflect.DeepEqual(k1.Address, k2.Address) {
  73. t.Fatal(err)
  74. }
  75. if !reflect.DeepEqual(k1.PrivateKey, k2.PrivateKey) {
  76. t.Fatal(err)
  77. }
  78. }
  79. func TestKeyStorePassphraseDecryptionFail(t *testing.T) {
  80. dir, ks := tmpKeyStoreIface(t, true)
  81. defer os.RemoveAll(dir)
  82. pass := "foo"
  83. k1, account, err := storeNewKey(ks, rand.Reader, pass)
  84. if err != nil {
  85. t.Fatal(err)
  86. }
  87. if _, err = ks.GetKey(k1.Address, account.URL, "bar"); err != ErrDecrypt {
  88. t.Fatalf("wrong error for invalid passphrase\ngot %q\nwant %q", err, ErrDecrypt)
  89. }
  90. }
  91. func TestImportPreSaleKey(t *testing.T) {
  92. dir, ks := tmpKeyStoreIface(t, true)
  93. defer os.RemoveAll(dir)
  94. // file content of a presale key file generated with:
  95. // python pyethsaletool.py genwallet
  96. // with password "foo"
  97. fileContent := "{\"encseed\": \"26d87f5f2bf9835f9a47eefae571bc09f9107bb13d54ff12a4ec095d01f83897494cf34f7bed2ed34126ecba9db7b62de56c9d7cd136520a0427bfb11b8954ba7ac39b90d4650d3448e31185affcd74226a68f1e94b1108e6e0a4a91cdd83eba\", \"ethaddr\": \"d4584b5f6229b7be90727b0fc8c6b91bb427821f\", \"email\": \"gustav.simonsson@gmail.com\", \"btcaddr\": \"1EVknXyFC68kKNLkh6YnKzW41svSRoaAcx\"}"
  98. pass := "foo"
  99. account, _, err := importPreSaleKey(ks, []byte(fileContent), pass)
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. if account.Address != common.HexToAddress("d4584b5f6229b7be90727b0fc8c6b91bb427821f") {
  104. t.Errorf("imported account has wrong address %x", account.Address)
  105. }
  106. if !strings.HasPrefix(account.URL, dir) {
  107. t.Errorf("imported account file not in keystore directory: %q", account.URL)
  108. }
  109. }
  110. // Test and utils for the key store tests in the Ethereum JSON tests;
  111. // testdataKeyStoreTests/basic_tests.json
  112. type KeyStoreTestV3 struct {
  113. Json encryptedKeyJSONV3
  114. Password string
  115. Priv string
  116. }
  117. type KeyStoreTestV1 struct {
  118. Json encryptedKeyJSONV1
  119. Password string
  120. Priv string
  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. func TestV3_PBKDF2_2(t *testing.T) {
  128. t.Parallel()
  129. tests := loadKeyStoreTestV3("../../tests/files/KeyStoreTests/basic_tests.json", t)
  130. testDecryptV3(tests["test1"], t)
  131. }
  132. func TestV3_PBKDF2_3(t *testing.T) {
  133. t.Parallel()
  134. tests := loadKeyStoreTestV3("../../tests/files/KeyStoreTests/basic_tests.json", t)
  135. testDecryptV3(tests["python_generated_test_with_odd_iv"], t)
  136. }
  137. func TestV3_PBKDF2_4(t *testing.T) {
  138. t.Parallel()
  139. tests := loadKeyStoreTestV3("../../tests/files/KeyStoreTests/basic_tests.json", t)
  140. testDecryptV3(tests["evilnonce"], t)
  141. }
  142. func TestV3_Scrypt_1(t *testing.T) {
  143. t.Parallel()
  144. tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t)
  145. testDecryptV3(tests["wikipage_test_vector_scrypt"], t)
  146. }
  147. func TestV3_Scrypt_2(t *testing.T) {
  148. t.Parallel()
  149. tests := loadKeyStoreTestV3("../../tests/files/KeyStoreTests/basic_tests.json", t)
  150. testDecryptV3(tests["test2"], t)
  151. }
  152. func TestV1_1(t *testing.T) {
  153. t.Parallel()
  154. tests := loadKeyStoreTestV1("testdata/v1_test_vector.json", t)
  155. testDecryptV1(tests["test1"], t)
  156. }
  157. func TestV1_2(t *testing.T) {
  158. t.Parallel()
  159. ks := &keyStorePassphrase{"testdata/v1", LightScryptN, LightScryptP}
  160. addr := common.HexToAddress("cb61d5a9c4896fb9658090b597ef0e7be6f7b67e")
  161. file := "testdata/v1/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e"
  162. k, err := ks.GetKey(addr, file, "g")
  163. if err != nil {
  164. t.Fatal(err)
  165. }
  166. privHex := hex.EncodeToString(crypto.FromECDSA(k.PrivateKey))
  167. expectedHex := "d1b1178d3529626a1a93e073f65028370d14c7eb0936eb42abef05db6f37ad7d"
  168. if privHex != expectedHex {
  169. t.Fatal(fmt.Errorf("Unexpected privkey: %v, expected %v", privHex, expectedHex))
  170. }
  171. }
  172. func testDecryptV3(test KeyStoreTestV3, t *testing.T) {
  173. privBytes, _, err := decryptKeyV3(&test.Json, test.Password)
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. privHex := hex.EncodeToString(privBytes)
  178. if test.Priv != privHex {
  179. t.Fatal(fmt.Errorf("Decrypted bytes not equal to test, expected %v have %v", test.Priv, privHex))
  180. }
  181. }
  182. func testDecryptV1(test KeyStoreTestV1, t *testing.T) {
  183. privBytes, _, err := decryptKeyV1(&test.Json, test.Password)
  184. if err != nil {
  185. t.Fatal(err)
  186. }
  187. privHex := hex.EncodeToString(privBytes)
  188. if test.Priv != privHex {
  189. t.Fatal(fmt.Errorf("Decrypted bytes not equal to test, expected %v have %v", test.Priv, privHex))
  190. }
  191. }
  192. func loadKeyStoreTestV3(file string, t *testing.T) map[string]KeyStoreTestV3 {
  193. tests := make(map[string]KeyStoreTestV3)
  194. err := common.LoadJSON(file, &tests)
  195. if err != nil {
  196. t.Fatal(err)
  197. }
  198. return tests
  199. }
  200. func loadKeyStoreTestV1(file string, t *testing.T) map[string]KeyStoreTestV1 {
  201. tests := make(map[string]KeyStoreTestV1)
  202. err := common.LoadJSON(file, &tests)
  203. if err != nil {
  204. t.Fatal(err)
  205. }
  206. return tests
  207. }
  208. func TestKeyForDirectICAP(t *testing.T) {
  209. t.Parallel()
  210. key := NewKeyForDirectICAP(rand.Reader)
  211. if !strings.HasPrefix(key.Address.Hex(), "0x00") {
  212. t.Errorf("Expected first address byte to be zero, have: %s", key.Address.Hex())
  213. }
  214. }
  215. func TestV3_31_Byte_Key(t *testing.T) {
  216. t.Parallel()
  217. tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t)
  218. testDecryptV3(tests["31_byte_key"], t)
  219. }
  220. func TestV3_30_Byte_Key(t *testing.T) {
  221. t.Parallel()
  222. tests := loadKeyStoreTestV3("testdata/v3_test_vector.json", t)
  223. testDecryptV3(tests["30_byte_key"], t)
  224. }