github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/signer/storage/aes_gcm_storage_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:42</date>
    10  //</624450111077879808>
    11  
    12  //
    13  package storage
    14  
    15  import (
    16  	"bytes"
    17  	"encoding/json"
    18  	"fmt"
    19  	"io/ioutil"
    20  	"testing"
    21  
    22  	"github.com/ethereum/go-ethereum/common"
    23  	"github.com/ethereum/go-ethereum/log"
    24  	"github.com/mattn/go-colorable"
    25  )
    26  
    27  func TestEncryption(t *testing.T) {
    28  //键:=[]字节(“aes256key-32字符1234567890”)
    29  //明文:=[]字节(值)
    30  	key := []byte("AES256Key-32Characters1234567890")
    31  	plaintext := []byte("exampleplaintext")
    32  
    33  	c, iv, err := encrypt(key, plaintext, nil)
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	fmt.Printf("Ciphertext %x, nonce %x\n", c, iv)
    38  
    39  	p, err := decrypt(key, iv, c, nil)
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	fmt.Printf("Plaintext %v\n", string(p))
    44  	if !bytes.Equal(plaintext, p) {
    45  		t.Errorf("Failed: expected plaintext recovery, got %v expected %v", string(plaintext), string(p))
    46  	}
    47  }
    48  
    49  func TestFileStorage(t *testing.T) {
    50  
    51  	a := map[string]storedCredential{
    52  		"secret": {
    53  			Iv:         common.Hex2Bytes("cdb30036279601aeee60f16b"),
    54  			CipherText: common.Hex2Bytes("f311ac49859d7260c2c464c28ffac122daf6be801d3cfd3edcbde7e00c9ff74f"),
    55  		},
    56  		"secret2": {
    57  			Iv:         common.Hex2Bytes("afb8a7579bf971db9f8ceeed"),
    58  			CipherText: common.Hex2Bytes("2df87baf86b5073ef1f03e3cc738de75b511400f5465bb0ddeacf47ae4dc267d"),
    59  		},
    60  	}
    61  	d, err := ioutil.TempDir("", "eth-encrypted-storage-test")
    62  	if err != nil {
    63  		t.Fatal(err)
    64  	}
    65  	stored := &AESEncryptedStorage{
    66  		filename: fmt.Sprintf("%v/vault.json", d),
    67  		key:      []byte("AES256Key-32Characters1234567890"),
    68  	}
    69  	stored.writeEncryptedStorage(a)
    70  	read := &AESEncryptedStorage{
    71  		filename: fmt.Sprintf("%v/vault.json", d),
    72  		key:      []byte("AES256Key-32Characters1234567890"),
    73  	}
    74  	creds, err := read.readEncryptedStorage()
    75  	if err != nil {
    76  		t.Fatal(err)
    77  	}
    78  	for k, v := range a {
    79  		if v2, exist := creds[k]; !exist {
    80  			t.Errorf("Missing entry %v", k)
    81  		} else {
    82  			if !bytes.Equal(v.CipherText, v2.CipherText) {
    83  				t.Errorf("Wrong ciphertext, expected %x got %x", v.CipherText, v2.CipherText)
    84  			}
    85  			if !bytes.Equal(v.Iv, v2.Iv) {
    86  				t.Errorf("Wrong iv")
    87  			}
    88  		}
    89  	}
    90  }
    91  func TestEnd2End(t *testing.T) {
    92  	log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(3), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))
    93  
    94  	d, err := ioutil.TempDir("", "eth-encrypted-storage-test")
    95  	if err != nil {
    96  		t.Fatal(err)
    97  	}
    98  
    99  	s1 := &AESEncryptedStorage{
   100  		filename: fmt.Sprintf("%v/vault.json", d),
   101  		key:      []byte("AES256Key-32Characters1234567890"),
   102  	}
   103  	s2 := &AESEncryptedStorage{
   104  		filename: fmt.Sprintf("%v/vault.json", d),
   105  		key:      []byte("AES256Key-32Characters1234567890"),
   106  	}
   107  
   108  	s1.Put("bazonk", "foobar")
   109  	if v := s2.Get("bazonk"); v != "foobar" {
   110  		t.Errorf("Expected bazonk->foobar, got '%v'", v)
   111  	}
   112  }
   113  
   114  func TestSwappedKeys(t *testing.T) {
   115  //不能交换键/值,因此
   116  //k1:v1,k2:v2可以换成k1:v2,k2:v1
   117  	log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(3), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))
   118  
   119  	d, err := ioutil.TempDir("", "eth-encrypted-storage-test")
   120  	if err != nil {
   121  		t.Fatal(err)
   122  	}
   123  
   124  	s1 := &AESEncryptedStorage{
   125  		filename: fmt.Sprintf("%v/vault.json", d),
   126  		key:      []byte("AES256Key-32Characters1234567890"),
   127  	}
   128  	s1.Put("k1", "v1")
   129  	s1.Put("k2", "v2")
   130  //现在制作一份修改过的副本
   131  
   132  	creds := make(map[string]storedCredential)
   133  	raw, err := ioutil.ReadFile(s1.filename)
   134  	if err != nil {
   135  		t.Fatal(err)
   136  	}
   137  	if err = json.Unmarshal(raw, &creds); err != nil {
   138  		t.Fatal(err)
   139  	}
   140  	swap := func() {
   141  //把它变成k1:v2,k2:v2
   142  		v1, v2 := creds["k1"], creds["k2"]
   143  		creds["k2"], creds["k1"] = v1, v2
   144  		raw, err = json.Marshal(creds)
   145  		if err != nil {
   146  			t.Fatal(err)
   147  		}
   148  		if err = ioutil.WriteFile(s1.filename, raw, 0600); err != nil {
   149  			t.Fatal(err)
   150  		}
   151  	}
   152  	swap()
   153  	if v := s1.Get("k1"); v != "" {
   154  		t.Errorf("swapped value should return empty")
   155  	}
   156  	swap()
   157  	if v := s1.Get("k1"); v != "v1" {
   158  		t.Errorf("double-swapped value should work fine")
   159  	}
   160  }
   161