Merge pull request #9 from nspcc-dev/create_metod_for_loading_private_keys

Add method to load PrivateKey
This commit is contained in:
Alex Vanin 2019-11-21 17:37:21 +03:00 committed by GitHub
commit 2e7d56853b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 124 additions and 0 deletions

View file

@ -60,3 +60,16 @@ wif, err := crypto.WIFEncode(sk)
// if something went wrong, returns error: // if something went wrong, returns error:
skFromWIF, err := crypto.WIFDecode(wif) skFromWIF, err := crypto.WIFDecode(wif)
``` ```
### LoadPrivateKey
```
// Load private key from wif format
sk, err := crypto.LoadPrivateKey(wif_string)
// Load private key from hex string
sk, err := crypto.LoadPrivateKey(hex_string)
// Load private key from file
sk, err := crypto.LoadPrivateKey(file_path)
```

25
load.go Normal file
View file

@ -0,0 +1,25 @@
package crypto
import (
"crypto/ecdsa"
"encoding/hex"
"io/ioutil"
"github.com/pkg/errors"
)
// LoadPrivateKey allows to load private key from various formats:
// - wif string
// - hex string
// - file path (D-bytes or SEC 1 / ASN.1 DER form)
func LoadPrivateKey(val string) (*ecdsa.PrivateKey, error) {
if data, err := ioutil.ReadFile(val); err == nil {
return UnmarshalPrivateKey(data)
} else if data, err = hex.DecodeString(val); err == nil {
return UnmarshalPrivateKey(data)
} else if key, err := WIFDecode(val); err == nil {
return key, nil
}
return nil, errors.Errorf("unknown key format (%q), expect: hex-string, wif or file-path", val)
}

86
load_test.go Normal file
View file

@ -0,0 +1,86 @@
package crypto
import (
"crypto/x509"
"encoding/hex"
"io/ioutil"
"os"
"testing"
"github.com/nspcc-dev/neofs-crypto/test"
"github.com/stretchr/testify/require"
)
func Test_LoadPrivateKey_FromWIF(t *testing.T) {
for i := 0; i < 10; i++ {
expected := test.DecodeKey(i)
wif, err := WIFEncode(expected)
require.NoError(t, err)
actual, err := LoadPrivateKey(wif)
require.NoError(t, err)
require.Equal(t, expected, actual)
}
}
func Test_LoadPrivateKey_FromHexString(t *testing.T) {
for i := 0; i < 10; i++ {
expected := test.DecodeKey(i)
hs := hex.EncodeToString(expected.D.Bytes())
actual, err := LoadPrivateKey(hs)
require.NoError(t, err)
require.Equal(t, expected, actual)
}
}
func Test_LoadPrivateKey_FromFile(t *testing.T) {
for i := 0; i < 10; i++ {
expected := test.DecodeKey(i)
file, err := ioutil.TempFile("", "_marshaled.key")
require.NoError(t, err)
defer func() {
require.NoError(t, file.Close())
require.NoError(t, os.Remove(file.Name()))
}()
data, err := x509.MarshalECPrivateKey(expected)
require.NoError(t, err)
_, err = file.Write(data)
require.NoError(t, err)
actual, err := LoadPrivateKey(file.Name())
require.NoError(t, err)
require.Equal(t, expected, actual)
}
}
func Test_LoadPrivateKey_FromCompressedFormatFile(t *testing.T) {
for i := 0; i < 10; i++ {
expected := test.DecodeKey(i)
file, err := ioutil.TempFile("", "_compressed.key")
require.NoError(t, err)
defer func() {
require.NoError(t, file.Close())
require.NoError(t, os.Remove(file.Name()))
}()
_, err = file.Write(expected.D.Bytes())
require.NoError(t, err)
actual, err := LoadPrivateKey(file.Name())
require.NoError(t, err)
require.Equal(t, expected, actual)
}
}