Files
netbird/client/internal/pqkem/message_test.go
T
riccardom aa9141c451 [client] pqkem: make weak tests fail on the regressions they name
The recovery test could time out its own bootstraps under CI load, the
non-capable test passed with the cancellation removed, and the decoder
rejection test only exercised the encoder. The timing spike ran on every
go test; it is a benchmark now.
2026-10-20 17:53:02 +02:00

87 lines
2.6 KiB
Go

package pqkem
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestMessageRoundTrip(t *testing.T) {
init, err := NewInitiator()
require.NoError(t, err)
answer, _, err := Respond(init.Offer(), Binding{LocalID: wgB, RemoteID: wgA})
require.NoError(t, err)
id := ExchangeID{1, 2, 3, 4}
ack := ExchangeID{9, 9, 9}
offBytes, err := (&OfferMsg{ExchangeID: id, AckID: ack, KEMOffer: init.Offer()}).Encode()
require.NoError(t, err)
typ, decoded, err := Decode(offBytes)
require.NoError(t, err)
require.Equal(t, MsgOffer, typ)
require.Equal(t, id, decoded.(*OfferMsg).ExchangeID)
require.Equal(t, ack, decoded.(*OfferMsg).AckID)
require.Equal(t, init.Offer(), decoded.(*OfferMsg).KEMOffer)
ansBytes, err := (&AnswerMsg{ExchangeID: id, KEMAnswer: answer}).Encode()
require.NoError(t, err)
typ, decoded, err = Decode(ansBytes)
require.NoError(t, err)
require.Equal(t, MsgAnswer, typ)
require.Equal(t, answer, decoded.(*AnswerMsg).KEMAnswer)
// The error marker is a non-empty, payload-less message carrying the exchange id, so
// the initiator can tell a responder failure from an empty "no KEM" answer.
errBytes := (&ErrorMsg{ExchangeID: id}).Encode()
require.NotEmpty(t, errBytes)
typ, decoded, err = Decode(errBytes)
require.NoError(t, err)
require.Equal(t, MsgError, typ)
require.Equal(t, id, decoded.(*ErrorMsg).ExchangeID)
}
func TestDecodeRejects(t *testing.T) {
// too short
_, _, err := Decode([]byte{1, 1})
require.Error(t, err)
// wrong version
bad := make([]byte, headerSize+ExchangeIDSize+OfferSize)
bad[0] = byte(MsgOffer)
bad[1] = ProtocolVersion + 1
_, _, err = Decode(bad)
require.Error(t, err)
// unknown type
bad2 := make([]byte, headerSize)
bad2[0] = 99
bad2[1] = ProtocolVersion
_, _, err = Decode(bad2)
require.Error(t, err)
// the encoder refuses an offer with the wrong payload size
_, err = (&OfferMsg{KEMOffer: []byte{1, 2, 3}}).Encode()
require.Error(t, err)
// the decoder refuses a framed offer, answer or error marker whose payload has the
// wrong size
short := make([]byte, headerSize+ExchangeIDSize+OfferSize-1)
short[0] = byte(MsgOffer)
short[1] = ProtocolVersion
_, _, err = Decode(short)
require.Error(t, err, "a truncated offer must be rejected")
long := make([]byte, headerSize+AnswerSize+1)
long[0] = byte(MsgAnswer)
long[1] = ProtocolVersion
_, _, err = Decode(long)
require.Error(t, err, "an oversized answer must be rejected")
marker := make([]byte, headerSize+1)
marker[0] = byte(MsgError)
marker[1] = ProtocolVersion
_, _, err = Decode(marker)
require.Error(t, err, "an error marker with a payload must be rejected")
}