github.com/karalabe/go-ethereum@v0.8.5/crypto/key_store.go (about) 1 package crypto 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path" 8 "strings" 9 10 "github.com/ethereum/go-ethereum/ethutil" 11 ) 12 13 type KeyStore interface { 14 Load(string) (*KeyRing, error) 15 Save(string, *KeyRing) error 16 } 17 18 type DBKeyStore struct { 19 db ethutil.Database 20 } 21 22 const dbKeyPrefix = "KeyRing" 23 24 func (k *DBKeyStore) dbKey(session string) []byte { 25 return []byte(fmt.Sprintf("%s%s", dbKeyPrefix, session)) 26 } 27 28 func (k *DBKeyStore) Save(session string, keyRing *KeyRing) error { 29 k.db.Put(k.dbKey(session), keyRing.RlpEncode()) 30 return nil 31 } 32 33 func (k *DBKeyStore) Load(session string) (*KeyRing, error) { 34 data, err := k.db.Get(k.dbKey(session)) 35 if err != nil { 36 return nil, nil 37 } 38 var keyRing *KeyRing 39 keyRing, err = NewKeyRingFromBytes(data) 40 if err != nil { 41 return nil, err 42 } 43 // if empty keyRing is found we return nil, no error 44 if keyRing.Len() == 0 { 45 return nil, nil 46 } 47 return keyRing, nil 48 } 49 50 type FileKeyStore struct { 51 basedir string 52 } 53 54 func (k *FileKeyStore) Save(session string, keyRing *KeyRing) error { 55 var content []byte 56 var err error 57 var privateKeys []string 58 var publicKeys []string 59 var mnemonics []string 60 var addresses []string 61 keyRing.Each(func(keyPair *KeyPair) { 62 privateKeys = append(privateKeys, ethutil.Bytes2Hex(keyPair.PrivateKey)) 63 publicKeys = append(publicKeys, ethutil.Bytes2Hex(keyPair.PublicKey)) 64 addresses = append(addresses, ethutil.Bytes2Hex(keyPair.Address())) 65 mnemonics = append(mnemonics, keyPair.Mnemonic()) 66 }) 67 68 basename := session 69 if session == "" { 70 basename = "default" 71 } 72 73 path := path.Join(k.basedir, basename) 74 content = []byte(strings.Join(privateKeys, "\n")) 75 err = ioutil.WriteFile(path+".prv", content, 0600) 76 if err != nil { 77 return err 78 } 79 80 content = []byte(strings.Join(publicKeys, "\n")) 81 err = ioutil.WriteFile(path+".pub", content, 0644) 82 if err != nil { 83 return err 84 } 85 86 content = []byte(strings.Join(addresses, "\n")) 87 err = ioutil.WriteFile(path+".addr", content, 0644) 88 if err != nil { 89 return err 90 } 91 92 content = []byte(strings.Join(mnemonics, "\n")) 93 err = ioutil.WriteFile(path+".mne", content, 0600) 94 if err != nil { 95 return err 96 } 97 98 return nil 99 } 100 101 func (k *FileKeyStore) Load(session string) (*KeyRing, error) { 102 basename := session 103 if session == "" { 104 basename = "default" 105 } 106 secfile := path.Join(k.basedir, basename+".prv") 107 _, err := os.Stat(secfile) 108 // if file is not found then we return nil, no error 109 if err != nil { 110 return nil, nil 111 } 112 return NewKeyRingFromFile(secfile) 113 }