diff --git a/chain/types/keystore.go b/chain/types/keystore.go new file mode 100644 index 000000000..9fecf8a66 --- /dev/null +++ b/chain/types/keystore.go @@ -0,0 +1,19 @@ +package types + +// KeyInfo is used for storying keys in KeyStore +type KeyInfo struct { + Type string + PrivateKey []byte +} + +// KeyStore is used for storying secret keys +type KeyStore interface { + // List lists all the keys stored in the KeyStore + List() ([]string, error) + // Get gets a key out of keystore and returns KeyInfo coresponding to named key + Get(string) (KeyInfo, error) + // Put saves a key info under given name + Put(string, KeyInfo) error + // Delete removes a key from keystore + Delete(string) error +} diff --git a/node/repo/fsrepo.go b/node/repo/fsrepo.go index 21f51166e..fa1dd2951 100644 --- a/node/repo/fsrepo.go +++ b/node/repo/fsrepo.go @@ -21,6 +21,7 @@ import ( "github.com/pkg/errors" "golang.org/x/xerrors" + "github.com/filecoin-project/go-lotus/chain/types" "github.com/filecoin-project/go-lotus/node/config" ) @@ -244,7 +245,7 @@ func (fsr *fsLockedRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error { return ioutil.WriteFile(fsr.join(fsAPI), []byte(ma.String()), 0644) } -func (fsr *fsLockedRepo) KeyStore() (KeyStore, error) { +func (fsr *fsLockedRepo) KeyStore() (types.KeyStore, error) { if err := fsr.stillValid(); err != nil { return nil, err } @@ -283,10 +284,10 @@ func (fsr *fsLockedRepo) List() ([]string, error) { return keys, nil } -// Get gets a key out of keystore and returns KeyInfo coresponding to named key -func (fsr *fsLockedRepo) Get(name string) (KeyInfo, error) { +// Get gets a key out of keystore and returns types.KeyInfo coresponding to named key +func (fsr *fsLockedRepo) Get(name string) (types.KeyInfo, error) { if err := fsr.stillValid(); err != nil { - return KeyInfo{}, err + return types.KeyInfo{}, err } encName := base32.RawStdEncoding.EncodeToString([]byte(name)) @@ -294,37 +295,37 @@ func (fsr *fsLockedRepo) Get(name string) (KeyInfo, error) { fstat, err := os.Stat(keyPath) if os.IsNotExist(err) { - return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, ErrKeyNotFound) + return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, ErrKeyNotFound) } else if err != nil { - return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) + return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) } if fstat.Mode()&0077 != 0 { - return KeyInfo{}, xerrors.Errorf(kstrPermissionMsg, name, err) + return types.KeyInfo{}, xerrors.Errorf(kstrPermissionMsg, name, err) } file, err := os.Open(keyPath) if err != nil { - return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) + return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) } defer file.Close() //nolint: errcheck // read only op data, err := ioutil.ReadAll(file) if err != nil { - return KeyInfo{}, xerrors.Errorf("reading key '%s': %w", name, err) + return types.KeyInfo{}, xerrors.Errorf("reading key '%s': %w", name, err) } - var res KeyInfo + var res types.KeyInfo err = json.Unmarshal(data, &res) if err != nil { - return KeyInfo{}, xerrors.Errorf("decoding key '%s': %w", name, err) + return types.KeyInfo{}, xerrors.Errorf("decoding key '%s': %w", name, err) } return res, nil } // Put saves key info under given name -func (fsr *fsLockedRepo) Put(name string, info KeyInfo) error { +func (fsr *fsLockedRepo) Put(name string, info types.KeyInfo) error { if err := fsr.stillValid(); err != nil { return err } diff --git a/node/repo/interface.go b/node/repo/interface.go index 0c99df1d2..47e55e10f 100644 --- a/node/repo/interface.go +++ b/node/repo/interface.go @@ -7,6 +7,7 @@ import ( "github.com/libp2p/go-libp2p-core/crypto" "github.com/multiformats/go-multiaddr" + "github.com/filecoin-project/go-lotus/chain/types" "github.com/filecoin-project/go-lotus/node/config" ) @@ -27,22 +28,6 @@ type Repo interface { Lock() (LockedRepo, error) } -type KeyInfo struct { - Type string - PrivateKey []byte -} - -type KeyStore interface { - // List lists all the keys stored in the KeyStore - List() ([]string, error) - // Get gets a key out of keystore and returns KeyInfo coresponding to named key - Get(string) (KeyInfo, error) - // Put saves a key info under given name - Put(string, KeyInfo) error - // Delete removes a key from keystore - Delete(string) error -} - type LockedRepo interface { // Close closes repo and removes lock. Close() error @@ -61,7 +46,7 @@ type LockedRepo interface { SetAPIEndpoint(multiaddr.Multiaddr) error // KeyStore returns store of private keys for Filecoin transactions - KeyStore() (KeyStore, error) + KeyStore() (types.KeyStore, error) // Path returns absolute path of the repo (or empty string if in-memory) Path() string diff --git a/node/repo/memrepo.go b/node/repo/memrepo.go index 35361e90a..5028074f2 100644 --- a/node/repo/memrepo.go +++ b/node/repo/memrepo.go @@ -11,6 +11,7 @@ import ( "github.com/multiformats/go-multiaddr" "golang.org/x/xerrors" + "github.com/filecoin-project/go-lotus/chain/types" "github.com/filecoin-project/go-lotus/node/config" ) @@ -26,7 +27,7 @@ type MemRepo struct { datastore datastore.Datastore configF func() *config.Root libp2pKey crypto.PrivKey - keystore map[string]KeyInfo + keystore map[string]types.KeyInfo } type lockedMemRepo struct { @@ -47,7 +48,7 @@ type MemRepoOptions struct { Ds datastore.Datastore ConfigF func() *config.Root Libp2pKey crypto.PrivKey - KeyStore map[string]KeyInfo + KeyStore map[string]types.KeyInfo } func genLibp2pKey() (crypto.PrivKey, error) { @@ -79,7 +80,7 @@ func NewMemory(opts *MemRepoOptions) *MemRepo { opts.Libp2pKey = pk } if opts.KeyStore == nil { - opts.KeyStore = make(map[string]KeyInfo) + opts.KeyStore = make(map[string]types.KeyInfo) } return &MemRepo{ @@ -176,7 +177,7 @@ func (lmem *lockedMemRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error { return nil } -func (lmem *lockedMemRepo) KeyStore() (KeyStore, error) { +func (lmem *lockedMemRepo) KeyStore() (types.KeyStore, error) { if err := lmem.checkToken(); err != nil { return nil, err } @@ -200,23 +201,23 @@ func (lmem *lockedMemRepo) List() ([]string, error) { return res, nil } -// Get gets a key out of keystore and returns KeyInfo coresponding to named key -func (lmem *lockedMemRepo) Get(name string) (KeyInfo, error) { +// Get gets a key out of keystore and returns types.KeyInfo coresponding to named key +func (lmem *lockedMemRepo) Get(name string) (types.KeyInfo, error) { if err := lmem.checkToken(); err != nil { - return KeyInfo{}, err + return types.KeyInfo{}, err } lmem.RLock() defer lmem.RUnlock() key, ok := lmem.mem.keystore[name] if !ok { - return KeyInfo{}, xerrors.Errorf("getting key '%s': %w", name, ErrKeyNotFound) + return types.KeyInfo{}, xerrors.Errorf("getting key '%s': %w", name, ErrKeyNotFound) } return key, nil } // Put saves key info under given name -func (lmem *lockedMemRepo) Put(name string, key KeyInfo) error { +func (lmem *lockedMemRepo) Put(name string, key types.KeyInfo) error { if err := lmem.checkToken(); err != nil { return err } diff --git a/node/repo/repo_test.go b/node/repo/repo_test.go index de0fcf889..d12c5e953 100644 --- a/node/repo/repo_test.go +++ b/node/repo/repo_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "golang.org/x/xerrors" + "github.com/filecoin-project/go-lotus/chain/types" "github.com/filecoin-project/go-lotus/node/config" ) @@ -64,8 +65,8 @@ func basicTest(t *testing.T, repo Repo) { } assert.Nil(t, apima, "with closed repo, apima should be set back to nil") - k1 := KeyInfo{Type: "foo"} - k2 := KeyInfo{Type: "bar"} + k1 := types.KeyInfo{Type: "foo"} + k2 := types.KeyInfo{Type: "bar"} lrepo, err = repo.Lock() assert.NoError(t, err, "should be able to relock")