keyring.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package crypto
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "strings"
  6. "github.com/ethereum/go-ethereum/ethutil"
  7. )
  8. type KeyRing struct {
  9. keys []*KeyPair
  10. }
  11. func NewKeyRing() *KeyRing {
  12. return &KeyRing{}
  13. }
  14. func (k *KeyRing) AddKeyPair(keyPair *KeyPair) {
  15. k.keys = append(k.keys, keyPair)
  16. }
  17. func (k *KeyRing) GetKeyPair(i int) *KeyPair {
  18. if len(k.keys) > i {
  19. return k.keys[i]
  20. }
  21. return nil
  22. }
  23. func (k *KeyRing) Empty() bool {
  24. return k.Len() == 0
  25. }
  26. func (k *KeyRing) Len() int {
  27. return len(k.keys)
  28. }
  29. func (k *KeyRing) Each(f func(*KeyPair)) {
  30. for _, keyPair := range k.keys {
  31. f(keyPair)
  32. }
  33. }
  34. func NewGeneratedKeyRing(len int) *KeyRing {
  35. keyRing := NewKeyRing()
  36. for i := 0; i < len; i++ {
  37. keyRing.AddKeyPair(GenerateNewKeyPair())
  38. }
  39. return keyRing
  40. }
  41. func NewKeyRingFromFile(secfile string) (*KeyRing, error) {
  42. var content []byte
  43. var err error
  44. content, err = ioutil.ReadFile(secfile)
  45. if err != nil {
  46. return nil, err
  47. }
  48. keyRing, err := NewKeyRingFromString(string(content))
  49. if err != nil {
  50. return nil, err
  51. }
  52. return keyRing, nil
  53. }
  54. func NewKeyRingFromString(content string) (*KeyRing, error) {
  55. secretStrings := strings.Split(content, "\n")
  56. var secrets [][]byte
  57. for _, secretString := range secretStrings {
  58. secret := secretString
  59. words := strings.Split(secretString, " ")
  60. if len(words) == 24 {
  61. secret = MnemonicDecode(words)
  62. } else if len(words) != 1 {
  63. return nil, fmt.Errorf("Unrecognised key format")
  64. }
  65. if len(secret) != 0 {
  66. secrets = append(secrets, ethutil.Hex2Bytes(secret))
  67. }
  68. }
  69. return NewKeyRingFromSecrets(secrets)
  70. }
  71. func NewKeyRingFromSecrets(secs [][]byte) (*KeyRing, error) {
  72. keyRing := NewKeyRing()
  73. for _, sec := range secs {
  74. keyPair, err := NewKeyPairFromSec(sec)
  75. if err != nil {
  76. return nil, err
  77. }
  78. keyRing.AddKeyPair(keyPair)
  79. }
  80. return keyRing, nil
  81. }
  82. func NewKeyRingFromBytes(data []byte) (*KeyRing, error) {
  83. var secrets [][]byte
  84. it := ethutil.NewValueFromBytes(data).NewIterator()
  85. for it.Next() {
  86. secret := it.Value().Bytes()
  87. secrets = append(secrets, secret)
  88. }
  89. keyRing, err := NewKeyRingFromSecrets(secrets)
  90. if err != nil {
  91. return nil, err
  92. }
  93. return keyRing, nil
  94. }
  95. func (k *KeyRing) RlpEncode() []byte {
  96. return k.RlpValue().Encode()
  97. }
  98. func (k *KeyRing) RlpValue() *ethutil.Value {
  99. v := ethutil.EmptyValue()
  100. k.Each(func(keyPair *KeyPair) {
  101. v.Append(keyPair.RlpValue())
  102. })
  103. return v
  104. }