aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/key_store_plain.go
diff options
context:
space:
mode:
authorGustav Simonsson <gustav.simonsson@gmail.com>2015-01-07 23:06:26 +0800
committerGustav Simonsson <gustav.simonsson@gmail.com>2015-01-16 02:40:10 +0800
commita1c2749380523178f87ae3fdfb02bc6641362924 (patch)
tree4e8a22b27b6f219f311531a52a87589be1e40520 /crypto/key_store_plain.go
parent945798f913d5cabd79635f45045b680b02396bf9 (diff)
downloadgo-tangerine-a1c2749380523178f87ae3fdfb02bc6641362924.tar.gz
go-tangerine-a1c2749380523178f87ae3fdfb02bc6641362924.tar.zst
go-tangerine-a1c2749380523178f87ae3fdfb02bc6641362924.zip
Address pull request comments
* Simplify scrypt constants with const block * Add key store constructors and make their types private * Simplify key store and file namings to be less Java Enterpriseā„¢ * Change test error logging to use t.Error(err) * Reduce number of naked returns (just like my ex-gf) * Simplify file reading path code
Diffstat (limited to 'crypto/key_store_plain.go')
-rw-r--r--crypto/key_store_plain.go114
1 files changed, 114 insertions, 0 deletions
diff --git a/crypto/key_store_plain.go b/crypto/key_store_plain.go
new file mode 100644
index 000000000..00d9767b6
--- /dev/null
+++ b/crypto/key_store_plain.go
@@ -0,0 +1,114 @@
+/*
+ This file is part of go-ethereum
+
+ go-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ go-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @authors
+ * Gustav Simonsson <gustav.simonsson@gmail.com>
+ * @date 2015
+ *
+ */
+
+package crypto
+
+import (
+ "code.google.com/p/go-uuid/uuid"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/user"
+ "path"
+)
+
+// TODO: rename to KeyStore when replacing existing KeyStore
+type KeyStore2 interface {
+ GenerateNewKey(string) (*Key, error) // create and store new key, optionally using auth string
+ GetKey(*uuid.UUID, string) (*Key, error) // key from id and auth string
+ StoreKey(*Key, string) error // store key optionally using auth string
+ DeleteKey(*uuid.UUID, string) error // delete key by id and auth string
+}
+
+type keyStorePlain struct {
+ keysDirPath string
+}
+
+// TODO: copied from cmd/ethereum/flags.go
+func DefaultDataDir() string {
+ usr, _ := user.Current()
+ return path.Join(usr.HomeDir, ".ethereum")
+}
+
+func NewKeyStorePlain(path string) KeyStore2 {
+ ks := new(keyStorePlain)
+ ks.keysDirPath = path
+ return ks
+}
+
+func (ks keyStorePlain) GenerateNewKey(auth string) (key *Key, err error) {
+ return GenerateNewKeyDefault(ks, auth)
+}
+
+func GenerateNewKeyDefault(ks KeyStore2, auth string) (key *Key, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ err = fmt.Errorf("GenerateNewKey error: %v", r)
+ }
+ }()
+ key = NewKey()
+ err = ks.StoreKey(key, auth)
+ return key, err
+}
+
+func (ks keyStorePlain) GetKey(keyId *uuid.UUID, auth string) (key *Key, err error) {
+ fileContent, err := GetKeyFile(ks.keysDirPath, keyId)
+ if err != nil {
+ return nil, err
+ }
+
+ key = new(Key)
+ err = json.Unmarshal(fileContent, key)
+ return key, err
+}
+
+func (ks keyStorePlain) StoreKey(key *Key, auth string) (err error) {
+ keyJSON, err := json.Marshal(key)
+ if err != nil {
+ return err
+ }
+ err = WriteKeyFile(key.Id.String(), ks.keysDirPath, keyJSON)
+ return err
+}
+
+func (ks keyStorePlain) DeleteKey(keyId *uuid.UUID, auth string) (err error) {
+ keyDirPath := path.Join(ks.keysDirPath, keyId.String())
+ err = os.RemoveAll(keyDirPath)
+ return err
+}
+
+func GetKeyFile(keysDirPath string, keyId *uuid.UUID) (fileContent []byte, err error) {
+ id := keyId.String()
+ return ioutil.ReadFile(path.Join(keysDirPath, id, id))
+}
+
+func WriteKeyFile(id string, keysDirPath string, content []byte) (err error) {
+ keyDirPath := path.Join(keysDirPath, id)
+ keyFilePath := path.Join(keyDirPath, id)
+ err = os.MkdirAll(keyDirPath, 0700) // read, write and dir search for user
+ if err != nil {
+ return err
+ }
+ return ioutil.WriteFile(keyFilePath, content, 0600) // read, write for user
+}