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  }