forked from TrueCloudLab/frostfs-s3-gw
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
|
package neofs
|
||
|
|
||
|
import (
|
||
|
"crypto/ecdsa"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-api-go/pkg/owner"
|
||
|
crypto "github.com/nspcc-dev/neofs-crypto"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
// Credentials contains methods that needed to work with NeoFS.
|
||
|
Credentials interface {
|
||
|
WIF() string
|
||
|
Owner() *owner.ID
|
||
|
PublicKey() *ecdsa.PublicKey
|
||
|
PrivateKey() *ecdsa.PrivateKey
|
||
|
}
|
||
|
|
||
|
cred struct {
|
||
|
key *ecdsa.PrivateKey
|
||
|
owner *owner.ID
|
||
|
wif string
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// New creates an instance of Credentials through string representation of secret.
|
||
|
// It allows passing WIF, path, hex-encoded and others.
|
||
|
func New(secret string) (Credentials, error) {
|
||
|
key, err := crypto.LoadPrivateKey(secret)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return setFromPrivateKey(key)
|
||
|
}
|
||
|
|
||
|
// PrivateKey returns ecdsa.PrivateKey.
|
||
|
func (c *cred) PrivateKey() *ecdsa.PrivateKey {
|
||
|
return c.key
|
||
|
}
|
||
|
|
||
|
// PublicKey returns ecdsa.PublicKey.
|
||
|
func (c *cred) PublicKey() *ecdsa.PublicKey {
|
||
|
return &c.key.PublicKey
|
||
|
}
|
||
|
|
||
|
// Owner returns owner.ID.
|
||
|
func (c *cred) Owner() *owner.ID {
|
||
|
return c.owner
|
||
|
}
|
||
|
|
||
|
// WIF returns string representation of WIF.
|
||
|
func (c *cred) WIF() string {
|
||
|
return c.wif
|
||
|
}
|
||
|
|
||
|
func setFromPrivateKey(key *ecdsa.PrivateKey) (*cred, error) {
|
||
|
wallet, err := owner.NEO3WalletFromPublicKey(&key.PublicKey)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
ownerID := owner.NewIDFromNeo3Wallet(wallet)
|
||
|
|
||
|
wif, err := crypto.WIFEncode(key)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &cred{key: key, owner: ownerID, wif: wif}, nil
|
||
|
}
|