service.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package service
  2. import (
  3. "crypto/ecdsa"
  4. "encoding/hex"
  5. "errors"
  6. logging "github.com/ipfs/go-log/v2"
  7. "key-manager/crypto"
  8. "key-manager/dao"
  9. "key-manager/hd"
  10. "sync"
  11. )
  12. var log = logging.Logger("key-manager")
  13. type KeyManager struct {
  14. UnimplementedKeyManagerServer
  15. lk sync.Mutex
  16. dao *dao.Dao
  17. password string
  18. whitelists map[string]struct{} // key = address
  19. mnemonics map[string]string // key = name
  20. signers map[string]*ecdsa.PrivateKey // key = address
  21. }
  22. func NewKeyManager(dao *dao.Dao, password string) (*KeyManager, error) {
  23. var km = &KeyManager{
  24. UnimplementedKeyManagerServer: UnimplementedKeyManagerServer{},
  25. lk: sync.Mutex{},
  26. dao: dao,
  27. password: password,
  28. whitelists: map[string]struct{}{},
  29. mnemonics: map[string]string{},
  30. signers: map[string]*ecdsa.PrivateKey{},
  31. }
  32. whitelists, err := dao.GetAllWhitelists()
  33. if err != nil {
  34. return nil, err
  35. }
  36. for _, whitelist := range whitelists {
  37. km.whitelists[whitelist.WhiteAddress] = struct{}{}
  38. log.Warnf("whitelist address: %s - %s", whitelist.Name, whitelist.WhiteAddress)
  39. }
  40. encryptedMnemonics, err := dao.GetAllMnemonics()
  41. if err != nil {
  42. return nil, err
  43. }
  44. passwordKey := crypto.GenerateEncryptKey([]byte(password))
  45. for _, encryptedMnemonic := range encryptedMnemonics {
  46. mnemonic, err := decryptMnemonic(encryptedMnemonic.Mnemonic, passwordKey)
  47. if err != nil {
  48. log.Errorw("decryptMnemonic failed", "name", encryptedMnemonic.Name, "encryptedMnemonic", encryptedMnemonic.Mnemonic)
  49. return nil, err
  50. }
  51. if ok := hd.CheckMnemonic(mnemonic); !ok {
  52. return nil, errors.New("invalid mnemonic")
  53. }
  54. km.mnemonics[encryptedMnemonic.Name] = mnemonic
  55. log.Infow("load mnemonic", "name", encryptedMnemonic.Name)
  56. }
  57. return km, nil
  58. }
  59. func encryptMnemonic(mnemonic string, key []byte) (string, error) {
  60. encryptedMnemonic, err := crypto.Encrypt([]byte(mnemonic), key)
  61. if err != nil {
  62. return "", err
  63. }
  64. return hex.EncodeToString(encryptedMnemonic), err
  65. }
  66. func decryptMnemonic(encryptedData string, key []byte) (string, error) {
  67. encryptedMnemonic, err := hex.DecodeString(encryptedData)
  68. if err != nil {
  69. return "", err
  70. }
  71. mnemonic, err := crypto.Decrypt(encryptedMnemonic, key)
  72. if err != nil {
  73. return "", err
  74. }
  75. return string(mnemonic), nil
  76. }
  77. func checkNetwork(network string) error {
  78. switch network {
  79. case eth, tron:
  80. return nil
  81. default:
  82. return errors.New("network must be eth or tron")
  83. }
  84. }