aboutsummaryrefslogtreecommitdiffstats
path: root/ethcrypto/keyring.go
diff options
context:
space:
mode:
authorzelig <viktor.tron@gmail.com>2014-06-29 23:02:23 +0800
committerzelig <viktor.tron@gmail.com>2014-06-29 23:02:23 +0800
commit772e7e8c8df066a64726b23bde84b6025c5af318 (patch)
tree8ee0e9b19d6ce2747481a8890473db99c66b87cb /ethcrypto/keyring.go
parente1ea41ee9cbe387221874fa6732b11d262a4ff12 (diff)
downloaddexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar.gz
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar.bz2
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar.lz
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar.xz
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.tar.zst
dexon-772e7e8c8df066a64726b23bde84b6025c5af318.zip
Key Manager
- keypair, keyring: -- consistent naming of methods -- error propagation -- no panic - keyManager: persist, import, export, initialize and (re)set keyring - no global public "singleton" keyring, instead interface via keyManager - keys test - KeyStore interface, DB and File store implementations
Diffstat (limited to 'ethcrypto/keyring.go')
-rw-r--r--ethcrypto/keyring.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/ethcrypto/keyring.go b/ethcrypto/keyring.go
new file mode 100644
index 000000000..277fa2134
--- /dev/null
+++ b/ethcrypto/keyring.go
@@ -0,0 +1,118 @@
+package ethcrypto
+
+import (
+ "fmt"
+ "github.com/ethereum/eth-go/ethutil"
+ "io/ioutil"
+ "strings"
+)
+
+type KeyRing struct {
+ keys []*KeyPair
+}
+
+func NewKeyRing() *KeyRing {
+ return &KeyRing{}
+}
+
+func (k *KeyRing) AddKeyPair(keyPair *KeyPair) {
+ k.keys = append(k.keys, keyPair)
+}
+
+func (k *KeyRing) GetKeyPair(i int) *KeyPair {
+ if len(k.keys) > i {
+ return k.keys[i]
+ }
+
+ return nil
+}
+
+func (k *KeyRing) Empty() bool {
+ return k.Len() == 0
+}
+
+func (k *KeyRing) Len() int {
+ return len(k.keys)
+}
+
+func (k *KeyRing) Each(f func(*KeyPair)) {
+ for _, keyPair := range k.keys {
+ f(keyPair)
+ }
+}
+
+func NewGeneratedKeyRing(len int) *KeyRing {
+ keyRing := NewKeyRing()
+ for i := 0; i < len; i++ {
+ keyRing.AddKeyPair(GenerateNewKeyPair())
+ }
+ return keyRing
+}
+
+func NewKeyRingFromFile(secfile string) (*KeyRing, error) {
+ var content []byte
+ var err error
+ content, err = ioutil.ReadFile(secfile)
+ if err != nil {
+ return nil, err
+ }
+ keyRing, err := NewKeyRingFromString(string(content))
+ if err != nil {
+ return nil, err
+ }
+ return keyRing, nil
+}
+
+func NewKeyRingFromString(content string) (*KeyRing, error) {
+ secretStrings := strings.Split(content, "\n")
+ var secrets [][]byte
+ for _, secretString := range secretStrings {
+ secret := secretString
+ words := strings.Split(secretString, " ")
+ if len(words) == 24 {
+ secret = MnemonicDecode(words)
+ } else if len(words) != 1 {
+ return nil, fmt.Errorf("Unrecognised key format")
+ }
+ secrets = append(secrets, ethutil.Hex2Bytes(secret))
+ }
+ return NewKeyRingFromSecrets(secrets)
+}
+
+func NewKeyRingFromSecrets(secs [][]byte) (*KeyRing, error) {
+ keyRing := NewKeyRing()
+ for _, sec := range secs {
+ keyPair, err := NewKeyPairFromSec(sec)
+ if err != nil {
+ return nil, err
+ }
+ keyRing.AddKeyPair(keyPair)
+ }
+ return keyRing, nil
+}
+
+func NewKeyRingFromBytes(data []byte) (*KeyRing, error) {
+ var secrets [][]byte
+ it := ethutil.NewValueFromBytes(data).NewIterator()
+ for it.Next() {
+ secret := it.Value().Bytes()
+ secrets = append(secrets, secret)
+ }
+ keyRing, err := NewKeyRingFromSecrets(secrets)
+ if err != nil {
+ return nil, err
+ }
+ return keyRing, nil
+}
+
+func (k *KeyRing) RlpEncode() []byte {
+ return k.RlpValue().Encode()
+}
+
+func (k *KeyRing) RlpValue() *ethutil.Value {
+ v := ethutil.EmptyValue()
+ k.Each(func(keyPair *KeyPair) {
+ v.Append(keyPair.RlpValue())
+ })
+ return v
+}