diff --git a/htlcswitch/link.go b/htlcswitch/link.go index 4467940be..80362161d 100644 --- a/htlcswitch/link.go +++ b/htlcswitch/link.go @@ -3468,11 +3468,6 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg, // or are able to settle it (and it adheres to our fee related // constraints). - // Fetch the onion blob that was included within this processed - // payment descriptor. - var onionBlob [lnwire.OnionPacketSize]byte - copy(onionBlob[:], pd.OnionBlob[:]) - // Before adding the new htlc to the state machine, parse the // onion object in order to obtain the routing information with // DecodeHopIterator function which process the Sphinx packet. @@ -3581,7 +3576,7 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg, l.cfg.DisallowRouteBlinding { failure := lnwire.NewInvalidBlinding( - onionBlob[:], + fn.Some(pd.OnionBlob), ) l.sendHTLCError( pd, NewLinkError(failure), obfuscator, false, @@ -4027,7 +4022,9 @@ func (l *channelLink) sendIncomingHTLCFailureMsg(htlcIndex uint64, // The specification does not require that we set the onion // blob. - failureMsg := lnwire.NewInvalidBlinding(nil) + failureMsg := lnwire.NewInvalidBlinding( + fn.None[[lnwire.OnionPacketSize]byte](), + ) reason, err := e.EncryptFirstHop(failureMsg) if err != nil { return err diff --git a/lnwire/onion_error.go b/lnwire/onion_error.go index 66db6a9f5..f8a8bf069 100644 --- a/lnwire/onion_error.go +++ b/lnwire/onion_error.go @@ -10,6 +10,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/go-errors/errors" + "github.com/lightningnetwork/lnd/fn" "github.com/lightningnetwork/lnd/tlv" ) @@ -1271,14 +1272,19 @@ func (f *FailInvalidBlinding) Encode(w *bytes.Buffer, _ uint32) error { } // NewInvalidBlinding creates new instance of FailInvalidBlinding. -func NewInvalidBlinding(onion []byte) *FailInvalidBlinding { +func NewInvalidBlinding( + onion fn.Option[[OnionPacketSize]byte]) *FailInvalidBlinding { // The spec allows empty onion hashes for invalid blinding, so we only // include our onion hash if it's provided. - if onion == nil { + if onion.IsNone() { return &FailInvalidBlinding{} } - return &FailInvalidBlinding{OnionSHA256: sha256.Sum256(onion)} + shaSum := fn.MapOptionZ(onion, func(o [OnionPacketSize]byte) [32]byte { + return sha256.Sum256(o[:]) + }) + + return &FailInvalidBlinding{OnionSHA256: shaSum} } // DecodeFailure decodes, validates, and parses the lnwire onion failure, for diff --git a/lnwire/onion_error_test.go b/lnwire/onion_error_test.go index a06c572dc..bc14d5d42 100644 --- a/lnwire/onion_error_test.go +++ b/lnwire/onion_error_test.go @@ -9,11 +9,12 @@ import ( "testing" "github.com/davecgh/go-spew/spew" + "github.com/lightningnetwork/lnd/fn" "github.com/stretchr/testify/require" ) var ( - testOnionHash = []byte{} + testOnionHash = [OnionPacketSize]byte{} testAmount = MilliSatoshi(1) testCtlvExpiry = uint32(2) testFlags = uint16(2) @@ -43,9 +44,9 @@ var onionFailures = []FailureMessage{ &FailMPPTimeout{}, NewFailIncorrectDetails(99, 100), - NewInvalidOnionVersion(testOnionHash), - NewInvalidOnionHmac(testOnionHash), - NewInvalidOnionKey(testOnionHash), + NewInvalidOnionVersion(testOnionHash[:]), + NewInvalidOnionHmac(testOnionHash[:]), + NewInvalidOnionKey(testOnionHash[:]), NewTemporaryChannelFailure(&testChannelUpdate), NewTemporaryChannelFailure(nil), NewAmountBelowMinimum(testAmount, testChannelUpdate), @@ -56,7 +57,7 @@ var onionFailures = []FailureMessage{ NewFinalIncorrectCltvExpiry(testCtlvExpiry), NewFinalIncorrectHtlcAmount(testAmount), NewInvalidOnionPayload(testType, testOffset), - NewInvalidBlinding(testOnionHash), + NewInvalidBlinding(fn.Some(testOnionHash)), } // TestEncodeDecodeCode tests the ability of onion errors to be properly encoded