|
|
@@ -10,10 +10,8 @@ import (
|
|
|
"crypto/elliptic"
|
|
|
"crypto/rand"
|
|
|
"encoding/hex"
|
|
|
+ "io"
|
|
|
"testing"
|
|
|
-
|
|
|
- "github.com/ethereum/go-ethereum/common/math"
|
|
|
- "github.com/ethereum/go-ethereum/crypto/randentropy"
|
|
|
)
|
|
|
|
|
|
const TestCount = 1000
|
|
|
@@ -24,11 +22,24 @@ func generateKeyPair() (pubkey, privkey []byte) {
|
|
|
panic(err)
|
|
|
}
|
|
|
pubkey = elliptic.Marshal(S256(), key.X, key.Y)
|
|
|
- return pubkey, math.PaddedBigBytes(key.D, 32)
|
|
|
+
|
|
|
+ privkey = make([]byte, 32)
|
|
|
+ blob := key.D.Bytes()
|
|
|
+ copy(privkey[32-len(blob):], blob)
|
|
|
+
|
|
|
+ return pubkey, privkey
|
|
|
+}
|
|
|
+
|
|
|
+func csprngEntropy(n int) []byte {
|
|
|
+ buf := make([]byte, n)
|
|
|
+ if _, err := io.ReadFull(rand.Reader, buf); err != nil {
|
|
|
+ panic("reading from crypto/rand failed: " + err.Error())
|
|
|
+ }
|
|
|
+ return buf
|
|
|
}
|
|
|
|
|
|
func randSig() []byte {
|
|
|
- sig := randentropy.GetEntropyCSPRNG(65)
|
|
|
+ sig := csprngEntropy(65)
|
|
|
sig[32] &= 0x70
|
|
|
sig[64] %= 4
|
|
|
return sig
|
|
|
@@ -51,7 +62,7 @@ func compactSigCheck(t *testing.T, sig []byte) {
|
|
|
|
|
|
func TestSignatureValidity(t *testing.T) {
|
|
|
pubkey, seckey := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
sig, err := Sign(msg, seckey)
|
|
|
if err != nil {
|
|
|
t.Errorf("signature error: %s", err)
|
|
|
@@ -74,7 +85,7 @@ func TestSignatureValidity(t *testing.T) {
|
|
|
|
|
|
func TestInvalidRecoveryID(t *testing.T) {
|
|
|
_, seckey := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
sig, _ := Sign(msg, seckey)
|
|
|
sig[64] = 99
|
|
|
_, err := RecoverPubkey(msg, sig)
|
|
|
@@ -85,7 +96,7 @@ func TestInvalidRecoveryID(t *testing.T) {
|
|
|
|
|
|
func TestSignAndRecover(t *testing.T) {
|
|
|
pubkey1, seckey := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
sig, err := Sign(msg, seckey)
|
|
|
if err != nil {
|
|
|
t.Errorf("signature error: %s", err)
|
|
|
@@ -136,7 +147,7 @@ func TestRandomMessagesWithRandomKeys(t *testing.T) {
|
|
|
func signAndRecoverWithRandomMessages(t *testing.T, keys func() ([]byte, []byte)) {
|
|
|
for i := 0; i < TestCount; i++ {
|
|
|
pubkey1, seckey := keys()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
sig, err := Sign(msg, seckey)
|
|
|
if err != nil {
|
|
|
t.Fatalf("signature error: %s", err)
|
|
|
@@ -164,7 +175,7 @@ func signAndRecoverWithRandomMessages(t *testing.T, keys func() ([]byte, []byte)
|
|
|
|
|
|
func TestRecoveryOfRandomSignature(t *testing.T) {
|
|
|
pubkey1, _ := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
|
|
|
for i := 0; i < TestCount; i++ {
|
|
|
// recovery can sometimes work, but if so should always give wrong pubkey
|
|
|
@@ -177,11 +188,11 @@ func TestRecoveryOfRandomSignature(t *testing.T) {
|
|
|
|
|
|
func TestRandomMessagesAgainstValidSig(t *testing.T) {
|
|
|
pubkey1, seckey := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
sig, _ := Sign(msg, seckey)
|
|
|
|
|
|
for i := 0; i < TestCount; i++ {
|
|
|
- msg = randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg = csprngEntropy(32)
|
|
|
pubkey2, _ := RecoverPubkey(msg, sig)
|
|
|
// recovery can sometimes work, but if so should always give wrong pubkey
|
|
|
if bytes.Equal(pubkey1, pubkey2) {
|
|
|
@@ -207,7 +218,7 @@ func TestRecoverSanity(t *testing.T) {
|
|
|
|
|
|
func BenchmarkSign(b *testing.B) {
|
|
|
_, seckey := generateKeyPair()
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
b.ResetTimer()
|
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
@@ -216,7 +227,7 @@ func BenchmarkSign(b *testing.B) {
|
|
|
}
|
|
|
|
|
|
func BenchmarkRecover(b *testing.B) {
|
|
|
- msg := randentropy.GetEntropyCSPRNG(32)
|
|
|
+ msg := csprngEntropy(32)
|
|
|
_, seckey := generateKeyPair()
|
|
|
sig, _ := Sign(msg, seckey)
|
|
|
b.ResetTimer()
|