diff --git a/htlcswitch/hop/fuzz_test.go b/htlcswitch/hop/fuzz_test.go index de6d9d182..82a92eb22 100644 --- a/htlcswitch/hop/fuzz_test.go +++ b/htlcswitch/hop/fuzz_test.go @@ -2,9 +2,11 @@ package hop import ( "bytes" + "errors" "testing" sphinx "github.com/lightningnetwork/lightning-onion" + "github.com/lightningnetwork/lnd/routing/route" "github.com/stretchr/testify/require" ) @@ -78,3 +80,47 @@ func FuzzOnionPacket(f *testing.F) { require.Equal(t, pkt1, pkt2) }) } + +func hopFromPayload(p *Payload) (*route.Hop, uint64) { + return &route.Hop{ + AmtToForward: p.FwdInfo.AmountToForward, + OutgoingTimeLock: p.FwdInfo.OutgoingCTLV, + MPP: p.MPP, + AMP: p.AMP, + Metadata: p.metadata, + CustomRecords: p.customRecords, + }, p.FwdInfo.NextHop.ToUint64() +} + +func FuzzPayload(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + if len(data) > sphinx.MaxPayloadSize { + return + } + + r := bytes.NewReader(data) + + payload1, err := NewPayloadFromReader(r) + if err != nil { + return + } + + var b bytes.Buffer + hop, nextChanID := hopFromPayload(payload1) + err = hop.PackHopPayload(&b, nextChanID) + if errors.Is(err, route.ErrAMPMissingMPP) { + // PackHopPayload refuses to encode an AMP record + // without an MPP record. However, NewPayloadFromReader + // does allow decoding an AMP record without an MPP + // record, since validation is done at a later stage. Do + // not report a bug for this case. + return + } + require.NoError(t, err) + + payload2, err := NewPayloadFromReader(&b) + require.NoError(t, err) + + require.Equal(t, payload1, payload2) + }) +}