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  }