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