forked from TrueCloudLab/frostfs-sdk-go
79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
|
package neofs
|
||
|
|
||
|
import (
|
||
|
"crypto/ecdsa"
|
||
|
"crypto/elliptic"
|
||
|
"crypto/rand"
|
||
|
"math/big"
|
||
|
|
||
|
"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 {
|
||
|
Owner() *owner.ID
|
||
|
PublicKey() *ecdsa.PublicKey
|
||
|
PrivateKey() *ecdsa.PrivateKey
|
||
|
}
|
||
|
|
||
|
credentials struct {
|
||
|
key *ecdsa.PrivateKey
|
||
|
ownerID *owner.ID
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// NewCredentials creates an instance of Credentials through string
|
||
|
// representation of secret. It allows passing WIF, path, hex-encoded and others.
|
||
|
func NewCredentials(secret string) (Credentials, error) {
|
||
|
key, err := crypto.LoadPrivateKey(secret)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return setFromPrivateKey(key)
|
||
|
}
|
||
|
|
||
|
// NewEphemeralCredentials creates new private key and Credentials based on that
|
||
|
// key.
|
||
|
func NewEphemeralCredentials() (Credentials, error) {
|
||
|
c := elliptic.P256()
|
||
|
priv, x, y, err := elliptic.GenerateKey(c, rand.Reader)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
key := &ecdsa.PrivateKey{
|
||
|
PublicKey: ecdsa.PublicKey{
|
||
|
Curve: c,
|
||
|
X: x,
|
||
|
Y: y,
|
||
|
},
|
||
|
D: new(big.Int).SetBytes(priv),
|
||
|
}
|
||
|
return setFromPrivateKey(key)
|
||
|
}
|
||
|
|
||
|
// PrivateKey returns ecdsa.PrivateKey.
|
||
|
func (c *credentials) PrivateKey() *ecdsa.PrivateKey {
|
||
|
return c.key
|
||
|
}
|
||
|
|
||
|
// PublicKey returns ecdsa.PublicKey.
|
||
|
func (c *credentials) PublicKey() *ecdsa.PublicKey {
|
||
|
return &c.key.PublicKey
|
||
|
}
|
||
|
|
||
|
// Owner returns owner.ID.
|
||
|
func (c *credentials) Owner() *owner.ID {
|
||
|
return c.ownerID
|
||
|
}
|
||
|
|
||
|
func setFromPrivateKey(key *ecdsa.PrivateKey) (*credentials, error) {
|
||
|
wallet, err := owner.NEO3WalletFromPublicKey(&key.PublicKey)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
ownerID := owner.NewIDFromNeo3Wallet(wallet)
|
||
|
return &credentials{key: key, ownerID: ownerID}, nil
|
||
|
}
|