8d79168129
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package key
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
|
)
|
|
|
|
// Get returns private key from the followind sources:
|
|
// 1. WIF
|
|
// 2. Raw binary key
|
|
// 3. Wallet file
|
|
// 4. NEP-2 encrypted WIF.
|
|
// Ideally we want to touch file-system on the last step.
|
|
// However, asking for NEP-2 password seems to be confusing if we provide a wallet.
|
|
func Get(keyDesc string, address string) (*ecdsa.PrivateKey, error) {
|
|
priv, err := keys.NewPrivateKeyFromWIF(keyDesc)
|
|
if err == nil {
|
|
return &priv.PrivateKey, nil
|
|
}
|
|
|
|
p, err := getKeyFromFile(keyDesc)
|
|
if err == nil {
|
|
return p, nil
|
|
}
|
|
|
|
w, err := wallet.NewWalletFromFile(keyDesc)
|
|
if err == nil {
|
|
return FromWallet(w, address)
|
|
}
|
|
|
|
if len(keyDesc) == nep2Base58Length {
|
|
return FromNEP2(keyDesc)
|
|
}
|
|
|
|
return nil, ErrInvalidKey
|
|
}
|
|
|
|
func getKeyFromFile(keyPath string) (*ecdsa.PrivateKey, error) {
|
|
data, err := os.ReadFile(keyPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %v", ErrInvalidKey, err)
|
|
}
|
|
|
|
priv, err := keys.NewPrivateKeyFromBytes(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %v", ErrInvalidKey, err)
|
|
}
|
|
|
|
return &priv.PrivateKey, nil
|
|
}
|