schnorr_test.mx raw

   1  package schnorr
   2  
   3  import (
   4  	"crypto/sha256"
   5  	"testing"
   6  
   7  	"smesh.lol/pkg/nostr/ec/secp256k1"
   8  )
   9  
  10  func TestSignVerify(t *testing.T) {
  11  	// Generate a key pair.
  12  	sk, err := secp256k1.GenerateSecretKey()
  13  	if err != nil {
  14  		t.Fatal(err)
  15  	}
  16  	pk := sk.PubKey()
  17  
  18  	// Create a message hash (events use SHA256 of serialized JSON).
  19  	msg := sha256.Sum256([]byte("test message for schnorr signing"))
  20  
  21  	// Sign the hash.
  22  	sig, err := Sign(sk, msg[:])
  23  	if err != nil {
  24  		t.Fatal(err)
  25  	}
  26  
  27  	// Verify the signature.
  28  	if !sig.Verify(msg[:], pk) {
  29  		t.Fatal("signature verification failed")
  30  	}
  31  
  32  	// Serialize and parse round-trip.
  33  	sigBytes := sig.Serialize()
  34  	if len(sigBytes) != SignatureSize {
  35  		t.Fatalf("expected %d signature bytes, got %d", SignatureSize, len(sigBytes))
  36  	}
  37  	sig2, err := ParseSignature(sigBytes)
  38  	if err != nil {
  39  		t.Fatal(err)
  40  	}
  41  	if !sig2.Verify(msg[:], pk) {
  42  		t.Fatal("parsed signature verification failed")
  43  	}
  44  
  45  	// Wrong message should fail.
  46  	bad := sha256.Sum256([]byte("wrong message"))
  47  	if sig.Verify(bad[:], pk) {
  48  		t.Fatal("verification should have failed for wrong message")
  49  	}
  50  }
  51  
  52  func TestPubKeyRoundTrip(t *testing.T) {
  53  	sk, err := secp256k1.GenerateSecretKey()
  54  	if err != nil {
  55  		t.Fatal(err)
  56  	}
  57  	pk := sk.PubKey()
  58  
  59  	// Serialize as 32-byte x-only.
  60  	pkBytes := SerializePubKey(pk)
  61  	if len(pkBytes) != PubKeyBytesLen {
  62  		t.Fatalf("expected %d pubkey bytes, got %d", PubKeyBytesLen, len(pkBytes))
  63  	}
  64  
  65  	// Parse back.
  66  	pk2, err := ParsePubKey(pkBytes)
  67  	if err != nil {
  68  		t.Fatal(err)
  69  	}
  70  
  71  	// Re-serialize should match.
  72  	pkBytes2 := SerializePubKey(pk2)
  73  	for i := range pkBytes {
  74  		if pkBytes[i] != pkBytes2[i] {
  75  			t.Fatal("pubkey round-trip mismatch")
  76  		}
  77  	}
  78  }
  79