crypto,secp256k1: test SignUnsafe counter behavior

This commit is contained in:
garima-uttam 2026-03-16 13:40:26 +05:30
parent fac8fc3c6c
commit cd895cf007
2 changed files with 89 additions and 0 deletions

View file

@ -130,6 +130,45 @@ func TestSignDeterministic(t *testing.T) {
}
}
func TestSignUnsafeCounter(t *testing.T) {
pubkey, seckey := generateKeyPair()
msg := make([]byte, 32)
copy(msg, "hi there")
sig, err := Sign(msg, seckey)
if err != nil {
t.Fatal(err)
}
sigUnsafe0, err := SignUnsafe(msg, seckey, 0)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(sig, sigUnsafe0) {
t.Fatal("counter=0 should match Sign")
}
sigUnsafe1a, err := SignUnsafe(msg, seckey, 1)
if err != nil {
t.Fatal(err)
}
sigUnsafe1b, err := SignUnsafe(msg, seckey, 1)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(sigUnsafe1a, sigUnsafe1b) {
t.Fatal("counter=1 signatures not equal")
}
if bytes.Equal(sig, sigUnsafe1a) {
t.Fatal("counter=1 should not match counter=0 signature")
}
pubkeyRecovered, err := RecoverPubkey(msg, sigUnsafe1a)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(pubkey, pubkeyRecovered) {
t.Fatal("recovered pubkey mismatch")
}
}
func TestRandomMessagesWithSameKey(t *testing.T) {
pubkey, seckey := generateKeyPair()
keys := func() ([]byte, []byte) {

View file

@ -0,0 +1,50 @@
package crypto
import (
"bytes"
"crypto/ecdsa"
"crypto/rand"
"testing"
)
func TestSignUnsafeCounter(t *testing.T) {
key, err := ecdsa.GenerateKey(S256(), rand.Reader)
if err != nil {
t.Fatal(err)
}
hash := make([]byte, 32)
copy(hash, "hi there")
sig, err := Sign(hash, key)
if err != nil {
t.Fatal(err)
}
sigUnsafe0, err := SignUnsafe(hash, key, 0)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(sig, sigUnsafe0) {
t.Fatal("counter=0 should match Sign")
}
sigUnsafe1a, err := SignUnsafe(hash, key, 1)
if err != nil {
t.Fatal(err)
}
sigUnsafe1b, err := SignUnsafe(hash, key, 1)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(sigUnsafe1a, sigUnsafe1b) {
t.Fatal("counter=1 signatures not equal")
}
if bytes.Equal(sig, sigUnsafe1a) {
t.Fatal("counter=1 should not match counter=0 signature")
}
pub, err := SigToPub(hash, sigUnsafe1a)
if err != nil {
t.Fatal(err)
}
if pub.X.Cmp(key.PublicKey.X) != 0 || pub.Y.Cmp(key.PublicKey.Y) != 0 {
t.Fatal("recovered pubkey mismatch")
}
}