diff --git a/ber.go b/ber.go index 95755fe..2ffb663 100644 --- a/ber.go +++ b/ber.go @@ -2,6 +2,7 @@ package ber import ( "bytes" + "errors" "fmt" "io" "reflect" @@ -201,7 +202,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { datalen := uint64(buf[1]) if Debug { - fmt.Printf("Read: datalen = %d len(buf) = %d ", datalen, len(buf)) + fmt.Printf("Read: datalen = %d, len(buf) = %d, buf = ", datalen, len(buf)) for _, b := range buf { fmt.Printf("%02X ", b) @@ -225,7 +226,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { datalen = DecodeInteger(buf[2 : 2+a]) if Debug { - fmt.Printf("Read: a = %d idx = %d datalen = %d len(buf) = %d", a, idx, datalen, len(buf)) + fmt.Printf("Read: a = %d, idx = %d, datalen = %d, len(buf) = %d, buf = ", a, idx, datalen, len(buf)) for _, b := range buf { fmt.Printf("%02X ", b) @@ -243,19 +244,23 @@ func ReadPacket(reader io.Reader) (*Packet, error) { } if Debug { - fmt.Printf("Read: len( buf ) = %d idx=%d datalen=%d idx+datalen=%d\n", len(buf), idx, datalen, idx+datalen) + fmt.Printf("Read: len(buf) = %d, idx = %d, datalen = %d, idx+datalen = %d, buf = ", len(buf), idx, datalen, idx+datalen) for _, b := range buf { fmt.Printf("%02X ", b) } + + fmt.Printf("\n") } p := DecodePacket(buf) - + if p == nil { + return nil, errors.New("Failed to decode a BER packet") + } return p, nil } -func DecodeString(data []byte) (string) { +func DecodeString(data []byte) string { return string(data) } @@ -310,7 +315,9 @@ func decodePacket(data []byte) (*Packet, []byte) { if Debug { fmt.Printf("decodePacket: enter %d\n", len(data)) } - + if len(data) < 2 { + return nil, data + } p := new(Packet) p.ClassType = data[0] & ClassBitmask @@ -322,9 +329,15 @@ func decodePacket(data []byte) (*Packet, []byte) { if datalen&128 != 0 { datalen -= 128 + if uint64(len(data)) < 2+datalen { + return nil, data + } datapos += datalen datalen = DecodeInteger(data[2 : 2+datalen]) } + if Debug { + fmt.Printf("decodePacket: datalen %d, datapos %d\n", datalen, datapos) + } p.Data = new(bytes.Buffer) @@ -332,6 +345,10 @@ func decodePacket(data []byte) (*Packet, []byte) { p.Value = nil + if uint64(len(data)) < datapos+datalen { + return nil, data + } + value_data := data[datapos : datapos+datalen] if p.TagType == TypeConstructed { @@ -339,6 +356,9 @@ func decodePacket(data []byte) (*Packet, []byte) { var child *Packet child, value_data = decodePacket(value_data) + if child == nil { + return nil, data + } p.AppendChild(child) } } else if p.ClassType == ClassUniversal { diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1f6e72b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/nmcclain/asn1-ber + +go 1.14