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