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