Refactored into namespaced packages.
This commit is contained in:
34
keys/keys.go
Normal file
34
keys/keys.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package keys
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"git.wisehodl.dev/jay/go-roots/errors"
|
||||
"github.com/decred/dcrd/dcrec/secp256k1/v4"
|
||||
)
|
||||
|
||||
// GeneratePrivateKey generates a new, random secp256k1 private key and returns
|
||||
// it as a 64-character, lowercase hexadecimal string.
|
||||
func GeneratePrivateKey() (string, error) {
|
||||
sk, err := secp256k1.GeneratePrivateKey()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
skBytes := sk.Serialize()
|
||||
return hex.EncodeToString(skBytes), nil
|
||||
}
|
||||
|
||||
// GetPublicKey derives the public key from a private key hex string
|
||||
// and returns the x-coordinate as 64 lowercase hex characters.
|
||||
func GetPublicKey(privateKeyHex string) (string, error) {
|
||||
if len(privateKeyHex) != 64 {
|
||||
return "", errors.MalformedPrivKey
|
||||
}
|
||||
skBytes, err := hex.DecodeString(privateKeyHex)
|
||||
if err != nil {
|
||||
return "", errors.MalformedPrivKey
|
||||
}
|
||||
|
||||
pk := secp256k1.PrivKeyFromBytes(skBytes).PubKey()
|
||||
pkBytes := pk.SerializeCompressed()[1:]
|
||||
return hex.EncodeToString(pkBytes), nil
|
||||
}
|
||||
39
keys/keys_test.go
Normal file
39
keys/keys_test.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package keys
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"regexp"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const testSK = "f43a0435f69529f310bbd1d6263d2fbf0977f54bfe2310cc37ae5904b83bb167"
|
||||
const testPK = "cfa87f35acbde29ba1ab3ee42de527b2cad33ac487e80cf2d6405ea0042c8fef"
|
||||
|
||||
var Hex64Pattern = regexp.MustCompile("^[a-f0-9]{64}$")
|
||||
|
||||
func TestGeneratePrivateKey(t *testing.T) {
|
||||
sk, err := GeneratePrivateKey()
|
||||
|
||||
assert.NoError(t, err)
|
||||
if !Hex64Pattern.MatchString(sk) {
|
||||
t.Errorf("invalid private key format: %s", sk)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGenerateUniquePrivateKeys(t *testing.T) {
|
||||
sk1, _ := GeneratePrivateKey()
|
||||
sk2, _ := GeneratePrivateKey()
|
||||
assert.NotEqual(t, sk1, sk2)
|
||||
}
|
||||
|
||||
func TestGetPublicKey(t *testing.T) {
|
||||
pk, err := GetPublicKey(testSK)
|
||||
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, testPK, pk)
|
||||
}
|
||||
|
||||
func TestGetPublicKeyInvalidPrivateKey(t *testing.T) {
|
||||
_, err := GetPublicKey("abc123")
|
||||
assert.ErrorContains(t, err, "private key must be 64 lowercase hex characters")
|
||||
}
|
||||
Reference in New Issue
Block a user