insurge_wire_test.go raw
1 package gnarlring
2
3 import (
4 "crypto/rand"
5 "testing"
6
7 "git.smesh.lol/gnarl-hamadryad/crypto"
8 )
9
10 func TestInsurgeWireRoundTrip(t *testing.T) {
11 // Derive a shared secret for the wire channel.
12 var secret crypto.Hamadryad
13 rand.Read(secret[:])
14
15 var identity crypto.GnarlMid
16 rand.Read(identity[:])
17
18 var nonce [crypto.GnarlNonceLen]byte
19 rand.Read(nonce[:])
20
21 // Test commitment frame.
22 pk, _ := NTRUKeyGen()
23 cc := NewChildCommitment(7, pk, nil)
24 pkt := SealCommitment(secret, identity, nonce, cc)
25 cc2, err := OpenCommitment(secret, pkt)
26 if err != nil {
27 t.Fatal(err)
28 }
29 if cc2.Index != cc.Index || !Equal(cc2.W, cc.W) {
30 t.Fatal("commitment round-trip failed")
31 }
32
33 // Test epoch frame.
34 pkCoord, skCoord := NTRUKeyGen()
35 es := StartEpoch(1, pkCoord)
36 for i := 0; i < N; i++ {
37 es.AddCommitment(NewChildCommitment(i, skCoord.PK, nil))
38 }
39 es.Finalize(skCoord, []byte("wire-test"))
40
41 pkt2 := SealEpoch(secret, identity, nonce, es)
42 es2, err := OpenEpoch(secret, pkt2)
43 if err != nil {
44 t.Fatal(err)
45 }
46 if es2.Counter != es.Counter {
47 t.Fatal("epoch round-trip counter mismatch")
48 }
49 }
50
51 func TestInsurgeWireWrongType(t *testing.T) {
52 var secret crypto.Hamadryad
53 rand.Read(secret[:])
54 var identity crypto.GnarlMid
55 rand.Read(identity[:])
56 var nonce [crypto.GnarlNonceLen]byte
57
58 pk, _ := NTRUKeyGen()
59 cc := NewChildCommitment(0, pk, nil)
60
61 pkt := SealCommitment(secret, identity, nonce, cc)
62 // Try to open as wrong type.
63 _, err := OpenEpoch(secret, pkt)
64 if err == nil {
65 t.Fatal("should reject commitment frame when opening as epoch")
66 }
67 }
68
69 func TestInsurgeWireTampered(t *testing.T) {
70 var secret crypto.Hamadryad
71 rand.Read(secret[:])
72 var identity crypto.GnarlMid
73 rand.Read(identity[:])
74 var nonce [crypto.GnarlNonceLen]byte
75 rand.Read(nonce[:])
76
77 pk, _ := NTRUKeyGen()
78 cc := NewChildCommitment(0, pk, nil)
79 pkt := SealCommitment(secret, identity, nonce, cc)
80
81 // Tamper with the ciphertext.
82 pkt.Ciphertext[0] ^= 0xFF
83 _, err := OpenCommitment(secret, pkt)
84 if err == nil {
85 t.Fatal("should reject tampered commitment frame")
86 }
87 }
88
89 func TestInsurgeWireEpochCheckFrame(t *testing.T) {
90 var secret crypto.Hamadryad
91 rand.Read(secret[:])
92 var identity crypto.GnarlMid
93 rand.Read(identity[:])
94 var nonce [crypto.GnarlNonceLen]byte
95
96 pkCoord, skCoord := NTRUKeyGen()
97 es := StartEpoch(42, pkCoord)
98 for i := 0; i < N; i++ {
99 es.AddCommitment(NewChildCommitment(i, skCoord.PK, nil))
100 }
101 es.Finalize(skCoord, []byte("check-test"))
102
103 pkt := SealEpochCheck(secret, identity, nonce, es)
104 cf, err := OpenEpochCheck(secret, pkt)
105 if err != nil {
106 t.Fatal(err)
107 }
108 if cf.Counter != es.Counter {
109 t.Fatal("check frame round-trip counter mismatch")
110 }
111 }
112