Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions layers/bfd.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,10 @@ func (d *BFD) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
data, d.RequiredMinEchoRxInterval = data[4:], BFDTimeInterval(binary.BigEndian.Uint32(data[:4]))

if d.AuthPresent && (len(data) > 2) {
authLen := uint8(data[1])
if len(data) != int(authLen) {
return errors.New("BFD Authentication Header length does not match")
}
d.AuthHeader = &BFDAuthHeader{}
data, d.AuthHeader.AuthType = data[1:], BFDAuthType(data[0])
data, _ = data[1:], uint8(data[0]) // Consume length
Expand All @@ -382,11 +386,13 @@ func (d *BFD) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
switch d.AuthHeader.AuthType {
case BFDAuthTypePassword:
d.AuthHeader.Data = BFDAuthData(data)
case BFDAuthTypeKeyedMD5, BFDAuthTypeMeticulousKeyedMD5:
// Skipped reserved byte
data, d.AuthHeader.SequenceNumber = data[5:], BFDAuthSequenceNumber(binary.BigEndian.Uint32(data[1:5]))
d.AuthHeader.Data = BFDAuthData(data)
case BFDAuthTypeKeyedSHA1, BFDAuthTypeMeticulousKeyedSHA1:
case BFDAuthTypeKeyedMD5, BFDAuthTypeMeticulousKeyedMD5,
BFDAuthTypeKeyedSHA1, BFDAuthTypeMeticulousKeyedSHA1:

if len(data) < 5 { // 1 byte reserved + 4 byte sequence number
df.SetTruncated()
return errors.New("BFD Authentication Header too short")
}
// Skipped reserved byte
data, d.AuthHeader.SequenceNumber = data[5:], BFDAuthSequenceNumber(binary.BigEndian.Uint32(data[1:5]))
d.AuthHeader.Data = BFDAuthData(data)
Expand Down
22 changes: 21 additions & 1 deletion layers/bfd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
package layers

import (
"github.com/google/gopacket"
"reflect"
"strings"
"testing"

"github.com/google/gopacket"
)

//******************************************************************************
Expand Down Expand Up @@ -287,3 +289,21 @@ func TestBFDAuthTypeMeticulousKeyedSHA1(t *testing.T) {

checkBFD("TestBFDAuthTypeMeticulousKeyedSHA1", t, testPacketBFD, pExpectedBFD)
}

func TestBFDAuthTypeKeyedMD5Truncated(t *testing.T) {

// testPacketBFDTrunc is the packet from TestBFDAuthTypeKeyedMD5 with the
// Auth Header truncated to 7 bytes (i.e. cut off the last byte of the
// Sequence Number field) and length fields adapted; stripped lower layers.
var testPacketBFDTrunc = []byte{
0x20, 0x44, 0x05, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0x42, 0x40, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00,
0x02, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00,
}
p := gopacket.NewPacket(testPacketBFDTrunc, LayerTypeBFD, gopacket.Default)
if errLayer := p.ErrorLayer(); errLayer == nil {
t.Error("No error layer on invalid BFD Authentication Header")
} else if err := errLayer.Error(); !strings.Contains(err.Error(), "BFD Authentication Header too short") {
t.Errorf("unexpected error message: %v", err)
}
}