commitment_test.go raw
1 package gnarlring
2
3 import "testing"
4
5 func TestChildCommitment(t *testing.T) {
6 pk, _ := NTRUKeyGen()
7 cc := NewChildCommitment(5, pk, nil) // nil rng uses crypto/rand via Default
8
9 if cc.Index != 5 {
10 t.Fatalf("index = %d, want 5", cc.Index)
11 }
12 if !Equal(cc.PubKey, pk.H) {
13 t.Fatal("PubKey mismatch")
14 }
15 if IsZero(cc.W) {
16 t.Fatal("W is zero — unlikely for fresh z")
17 }
18 }
19
20 func TestAggregatedCommitment(t *testing.T) {
21 pk, _ := NTRUKeyGen()
22 ac := NewAggregatedCommitment()
23
24 cc := NewChildCommitment(0, pk, nil)
25 if !ac.Add(cc) {
26 t.Fatal("Add failed")
27 }
28 if ac.Count != 1 {
29 t.Fatalf("Count = %d, want 1", ac.Count)
30 }
31 if ac.Add(cc) {
32 t.Fatal("Add should reject duplicate")
33 }
34
35 ac.Remove(0)
36 if ac.Count != 0 {
37 t.Fatalf("Count after remove = %d, want 0", ac.Count)
38 }
39 }
40
41 func TestAggregatedTarget(t *testing.T) {
42 pk, _ := NTRUKeyGen()
43 ac := NewAggregatedCommitment()
44
45 for i := 0; i < N; i++ {
46 cc := NewChildCommitment(i, pk, nil)
47 ac.Add(cc)
48 }
49
50 target1 := ac.Target([]byte("hello"), 0)
51 target2 := ac.Target([]byte("hello"), 0)
52 if !Equal(target1, target2) {
53 t.Fatal("target not deterministic")
54 }
55
56 // Different message → different target.
57 target3 := ac.Target([]byte("world"), 0)
58 if Equal(target1, target3) {
59 t.Fatal("different messages give same target")
60 }
61
62 // Different epoch → different target.
63 target4 := ac.Target([]byte("hello"), 1)
64 if Equal(target1, target4) {
65 t.Fatal("different epochs give same target")
66 }
67 }
68
69 func TestWCompressed(t *testing.T) {
70 pk, _ := NTRUKeyGen()
71 ac := NewAggregatedCommitment()
72
73 for i := 0; i < N; i++ {
74 cc := NewChildCommitment(i, pk, nil)
75 ac.Add(cc)
76 }
77
78 wc1 := ac.WCompressed(0)
79 wc2 := ac.WCompressed(0)
80 if len(wc1) != 27 {
81 t.Fatalf("WCompressed len = %d, want 27", len(wc1))
82 }
83 if string(wc1) != string(wc2) {
84 t.Fatal("WCompressed not deterministic")
85 }
86 }
87