htlcswitch/link: extract error encrypter from hop iterator
This commit is contained in:
parent
f075905d6c
commit
27df8d8ad1
@ -3,12 +3,11 @@ package htlcswitch
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
|
||||||
"github.com/go-errors/errors"
|
"github.com/go-errors/errors"
|
||||||
@ -130,11 +129,19 @@ type ChannelLinkConfig struct {
|
|||||||
// DecodeHopIterator function is responsible for decoding HTLC Sphinx
|
// DecodeHopIterator function is responsible for decoding HTLC Sphinx
|
||||||
// onion blob, and creating hop iterator which will give us next
|
// onion blob, and creating hop iterator which will give us next
|
||||||
// destination of HTLC.
|
// destination of HTLC.
|
||||||
DecodeHopIterator func(r io.Reader, rHash []byte) (HopIterator, lnwire.FailCode)
|
DecodeHopIterator func(r io.Reader, rHash []byte,
|
||||||
|
cltv uint32) (HopIterator, lnwire.FailCode)
|
||||||
|
|
||||||
|
// DecodeHopIterators facilitates batched decoding of HTLC Sphinx onion
|
||||||
|
// blobs, which are then used to inform how to forward an HTLC.
|
||||||
|
// NOTE: This function assumes the same set of readers and preimages are
|
||||||
|
// always presented for the same identifier.
|
||||||
|
DecodeHopIterators func([]byte, []DecodeHopIteratorRequest) (
|
||||||
|
[]DecodeHopIteratorResponse, error)
|
||||||
|
|
||||||
// DecodeOnionObfuscator function is responsible for decoding HTLC
|
// DecodeOnionObfuscator function is responsible for decoding HTLC
|
||||||
// Sphinx onion blob, and creating onion failure obfuscator.
|
// Sphinx onion blob, and creating onion failure obfuscator.
|
||||||
DecodeOnionObfuscator func(r io.Reader) (ErrorEncrypter, lnwire.FailCode)
|
DecodeOnionObfuscator ErrorEncrypterExtracter
|
||||||
|
|
||||||
// GetLastChannelUpdate retrieves the latest routing policy for this
|
// GetLastChannelUpdate retrieves the latest routing policy for this
|
||||||
// particular channel. This will be used to provide payment senders our
|
// particular channel. This will be used to provide payment senders our
|
||||||
@ -1448,26 +1455,6 @@ func (l *channelLink) processLockedInHtlcs(
|
|||||||
var onionBlob [lnwire.OnionPacketSize]byte
|
var onionBlob [lnwire.OnionPacketSize]byte
|
||||||
copy(onionBlob[:], pd.OnionBlob)
|
copy(onionBlob[:], pd.OnionBlob)
|
||||||
|
|
||||||
// Retrieve onion obfuscator from onion blob in order
|
|
||||||
// to produce initial obfuscation of the onion
|
|
||||||
// failureCode.
|
|
||||||
onionReader := bytes.NewReader(onionBlob[:])
|
|
||||||
obfuscator, failureCode := l.cfg.DecodeOnionObfuscator(
|
|
||||||
onionReader,
|
|
||||||
)
|
|
||||||
if failureCode != lnwire.CodeNone {
|
|
||||||
// If we're unable to process the onion blob
|
|
||||||
// than we should send the malformed htlc error
|
|
||||||
// to payment sender.
|
|
||||||
l.sendMalformedHTLCError(pd.HtlcIndex, failureCode,
|
|
||||||
onionBlob[:])
|
|
||||||
needUpdate = true
|
|
||||||
|
|
||||||
log.Errorf("unable to decode onion "+
|
|
||||||
"obfuscator: %v", failureCode)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Before adding the new htlc to the state machine,
|
// Before adding the new htlc to the state machine,
|
||||||
// parse the onion object in order to obtain the
|
// parse the onion object in order to obtain the
|
||||||
// routing information with DecodeHopIterator function
|
// routing information with DecodeHopIterator function
|
||||||
@ -1479,9 +1466,9 @@ func (l *channelLink) processLockedInHtlcs(
|
|||||||
// attacks. In the case of a replay, an attacker is
|
// attacks. In the case of a replay, an attacker is
|
||||||
// *forced* to use the same payment hash twice, thereby
|
// *forced* to use the same payment hash twice, thereby
|
||||||
// losing their money entirely.
|
// losing their money entirely.
|
||||||
onionReader = bytes.NewReader(onionBlob[:])
|
onionReader := bytes.NewReader(onionBlob[:])
|
||||||
chanIterator, failureCode := l.cfg.DecodeHopIterator(
|
chanIterator, failureCode := l.cfg.DecodeHopIterator(
|
||||||
onionReader, pd.RHash[:],
|
onionReader, pd.RHash[:], pd.Timeout,
|
||||||
)
|
)
|
||||||
if failureCode != lnwire.CodeNone {
|
if failureCode != lnwire.CodeNone {
|
||||||
// If we're unable to process the onion blob
|
// If we're unable to process the onion blob
|
||||||
@ -1496,6 +1483,25 @@ func (l *channelLink) processLockedInHtlcs(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve onion obfuscator from onion blob in order
|
||||||
|
// to produce initial obfuscation of the onion
|
||||||
|
// failureCode.
|
||||||
|
obfuscator, failureCode := chanIterator.ExtractErrorEncrypter(
|
||||||
|
l.cfg.DecodeOnionObfuscator,
|
||||||
|
)
|
||||||
|
if failureCode != lnwire.CodeNone {
|
||||||
|
// If we're unable to process the onion blob
|
||||||
|
// than we should send the malformed htlc error
|
||||||
|
// to payment sender.
|
||||||
|
l.sendMalformedHTLCError(pd.HtlcIndex, failureCode,
|
||||||
|
onionBlob[:])
|
||||||
|
needUpdate = true
|
||||||
|
|
||||||
|
log.Errorf("unable to decode onion "+
|
||||||
|
"obfuscator: %v", failureCode)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
heightNow := l.bestHeight
|
heightNow := l.bestHeight
|
||||||
|
|
||||||
fwdInfo := chanIterator.ForwardingInstructions()
|
fwdInfo := chanIterator.ForwardingInstructions()
|
||||||
|
Loading…
Reference in New Issue
Block a user