htlcswitch/test: more realistic mock encryption

This mock is used in the switch test TestUpdateFailMalformedHTLCErrorConversion.
But because the mock isn't very realistic, it doesn't detect problems
in the handling of malformed failures in the link.
This commit is contained in:
Joost Jager
2022-10-14 11:03:31 +02:00
parent eca82d986c
commit e9440a24a2
2 changed files with 25 additions and 9 deletions

View File

@@ -419,12 +419,16 @@ func (o *mockObfuscator) Reextract(
return nil
}
var fakeHmac = []byte("hmachmachmachmachmachmachmachmac")
func (o *mockObfuscator) EncryptFirstHop(failure lnwire.FailureMessage) (
lnwire.OpaqueReason, error) {
o.failure = failure
var b bytes.Buffer
b.Write(fakeHmac)
if err := lnwire.EncodeFailure(&b, failure, 0); err != nil {
return nil, err
}
@@ -436,7 +440,12 @@ func (o *mockObfuscator) IntermediateEncrypt(reason lnwire.OpaqueReason) lnwire.
}
func (o *mockObfuscator) EncryptMalformedError(reason lnwire.OpaqueReason) lnwire.OpaqueReason {
return reason
var b bytes.Buffer
b.Write(fakeHmac)
b.Write(reason)
return b.Bytes()
}
// mockDeobfuscator mock implementation of the failure deobfuscator which
@@ -447,7 +456,13 @@ func newMockDeobfuscator() ErrorDecrypter {
return &mockDeobfuscator{}
}
func (o *mockDeobfuscator) DecryptError(reason lnwire.OpaqueReason) (*ForwardingError, error) {
func (o *mockDeobfuscator) DecryptError(reason lnwire.OpaqueReason) (
*ForwardingError, error) {
if !bytes.Equal(reason[:32], fakeHmac) {
return nil, errors.New("fake decryption error")
}
reason = reason[32:]
r := bytes.NewReader(reason)
failure, err := lnwire.DecodeFailure(r, 0)

View File

@@ -1,7 +1,6 @@
package htlcswitch
import (
"bytes"
"crypto/rand"
"crypto/sha256"
"fmt"
@@ -23,7 +22,6 @@ import (
"github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/ticker"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -4088,10 +4086,10 @@ func TestSwitchHoldForward(t *testing.T) {
expectedFailure := &lnwire.FailInvalidOnionKey{
OnionSHA256: shaOnionBlob,
}
var b bytes.Buffer
require.NoError(t, lnwire.EncodeFailure(&b, expectedFailure, 0))
assert.Equal(t, lnwire.OpaqueReason(b.Bytes()), failPacket.Reason)
fwdErr, err := newMockDeobfuscator().DecryptError(failPacket.Reason)
require.NoError(t, err)
require.Equal(t, expectedFailure, fwdErr.WireMessage())
assertNumCircuits(t, c.s, 0, 0)
@@ -5515,10 +5513,13 @@ func testSwitchAliasInterceptFail(t *testing.T, zeroConf bool) {
failHtlc, ok := failPacket.htlc.(*lnwire.UpdateFailHTLC)
require.True(t, ok)
r := bytes.NewReader(failHtlc.Reason)
failure, err := lnwire.DecodeFailure(r, 0)
fwdErr, err := newMockDeobfuscator().DecryptError(
failHtlc.Reason,
)
require.NoError(t, err)
failure := fwdErr.WireMessage()
failureMsg, ok := failure.(*lnwire.FailTemporaryChannelFailure)
require.True(t, ok)