diff --git a/watchtower/wtwire/fuzz_test.go b/watchtower/wtwire/fuzz_test.go index 5a03b84e3e..385e5a58bf 100644 --- a/watchtower/wtwire/fuzz_test.go +++ b/watchtower/wtwire/fuzz_test.go @@ -18,25 +18,28 @@ func prefixWithMsgType(data []byte, prefix MessageType) []byte { return data } -// harness performs the actual fuzz testing of the appropriate wire message. -// This function will check that the passed-in message passes wire length -// checks, is a valid message once deserialized, and passes a sequence of -// serialization and deserialization checks. Returns an int that determines -// whether the input is unique or not. -func harness(t *testing.T, data []byte, emptyMsg Message) { +// wireMsgHarness performs the actual fuzz testing of the appropriate wire +// message. This function will check that the passed-in message passes wire +// length checks, is a valid message once deserialized, and passes a sequence of +// serialization and deserialization checks. emptyMsg must be an empty Message +// of the type to be fuzzed, as it is used to determine the appropriate prefix +// bytes and max payload length for decoding. +func wireMsgHarness(t *testing.T, data []byte, emptyMsg Message) { t.Helper() - // Create a reader with the byte array. - r := bytes.NewReader(data) - - // Make sure byte array length (excluding 2 bytes for message type) is - // less than max payload size for the wire message. - payloadLen := uint32(len(data)) - 2 + // Make sure byte array length is less than max payload size for the + // wire message. + payloadLen := uint32(len(data)) if payloadLen > emptyMsg.MaxPayloadLength(0) { // Ignore this input - max payload constraint violated. return } + data = prefixWithMsgType(data, emptyMsg.MsgType()) + + // Create a reader with the byte array. + r := bytes.NewReader(data) + msg, err := ReadMessage(r, 0) if err != nil { return @@ -57,120 +60,48 @@ func harness(t *testing.T, data []byte, emptyMsg Message) { func FuzzCreateSessionReply(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgCreateSessionReply. - data = prefixWithMsgType(data, MsgCreateSessionReply) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := CreateSessionReply{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &CreateSessionReply{}) }) } func FuzzCreateSession(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgCreateSession. - data = prefixWithMsgType(data, MsgCreateSession) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := CreateSession{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &CreateSession{}) }) } func FuzzDeleteSessionReply(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgDeleteSessionReply. - data = prefixWithMsgType(data, MsgDeleteSessionReply) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := DeleteSessionReply{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &DeleteSessionReply{}) }) } func FuzzDeleteSession(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgDeleteSession. - data = prefixWithMsgType(data, MsgDeleteSession) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := DeleteSession{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &DeleteSession{}) }) } func FuzzError(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgError. - data = prefixWithMsgType(data, MsgError) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := Error{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &Error{}) }) } func FuzzInit(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgInit. - data = prefixWithMsgType(data, MsgInit) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := Init{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &Init{}) }) } func FuzzStateUpdateReply(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgStateUpdateReply. - data = prefixWithMsgType(data, MsgStateUpdateReply) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := StateUpdateReply{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &StateUpdateReply{}) }) } func FuzzStateUpdate(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - // Prefix with MsgStateUpdate. - data = prefixWithMsgType(data, MsgStateUpdate) - - // Create an empty message so that the FuzzHarness func can - // check if the max payload constraint is violated. - emptyMsg := StateUpdate{} - - // Pass the message into our general fuzz harness for wire - // messages! - harness(t, data, &emptyMsg) + wireMsgHarness(t, data, &StateUpdate{}) }) }