package gnarlring import ( "crypto/rand" "testing" "git.smesh.lol/gnarl-hamadryad/crypto" ) func TestInsurgeWireRoundTrip(t *testing.T) { // Derive a shared secret for the wire channel. var secret crypto.Hamadryad rand.Read(secret[:]) var identity crypto.GnarlMid rand.Read(identity[:]) var nonce [crypto.GnarlNonceLen]byte rand.Read(nonce[:]) // Test commitment frame. pk, _ := NTRUKeyGen() cc := NewChildCommitment(7, pk, nil) pkt := SealCommitment(secret, identity, nonce, cc) cc2, err := OpenCommitment(secret, pkt) if err != nil { t.Fatal(err) } if cc2.Index != cc.Index || !Equal(cc2.W, cc.W) { t.Fatal("commitment round-trip failed") } // Test epoch frame. pkCoord, skCoord := NTRUKeyGen() es := StartEpoch(1, pkCoord) for i := 0; i < N; i++ { es.AddCommitment(NewChildCommitment(i, skCoord.PK, nil)) } es.Finalize(skCoord, []byte("wire-test")) pkt2 := SealEpoch(secret, identity, nonce, es) es2, err := OpenEpoch(secret, pkt2) if err != nil { t.Fatal(err) } if es2.Counter != es.Counter { t.Fatal("epoch round-trip counter mismatch") } } func TestInsurgeWireWrongType(t *testing.T) { var secret crypto.Hamadryad rand.Read(secret[:]) var identity crypto.GnarlMid rand.Read(identity[:]) var nonce [crypto.GnarlNonceLen]byte pk, _ := NTRUKeyGen() cc := NewChildCommitment(0, pk, nil) pkt := SealCommitment(secret, identity, nonce, cc) // Try to open as wrong type. _, err := OpenEpoch(secret, pkt) if err == nil { t.Fatal("should reject commitment frame when opening as epoch") } } func TestInsurgeWireTampered(t *testing.T) { var secret crypto.Hamadryad rand.Read(secret[:]) var identity crypto.GnarlMid rand.Read(identity[:]) var nonce [crypto.GnarlNonceLen]byte rand.Read(nonce[:]) pk, _ := NTRUKeyGen() cc := NewChildCommitment(0, pk, nil) pkt := SealCommitment(secret, identity, nonce, cc) // Tamper with the ciphertext. pkt.Ciphertext[0] ^= 0xFF _, err := OpenCommitment(secret, pkt) if err == nil { t.Fatal("should reject tampered commitment frame") } } func TestInsurgeWireEpochCheckFrame(t *testing.T) { var secret crypto.Hamadryad rand.Read(secret[:]) var identity crypto.GnarlMid rand.Read(identity[:]) var nonce [crypto.GnarlNonceLen]byte pkCoord, skCoord := NTRUKeyGen() es := StartEpoch(42, pkCoord) for i := 0; i < N; i++ { es.AddCommitment(NewChildCommitment(i, skCoord.PK, nil)) } es.Finalize(skCoord, []byte("check-test")) pkt := SealEpochCheck(secret, identity, nonce, es) cf, err := OpenEpochCheck(secret, pkt) if err != nil { t.Fatal(err) } if cf.Counter != es.Counter { t.Fatal("check frame round-trip counter mismatch") } }