Skip to content

Commit

Permalink
Merge pull request #1 from bi-zone/fix-parser-panics
Browse files Browse the repository at this point in the history
Fix parser out of bounds access panics
  • Loading branch information
yalegko authored May 30, 2024
2 parents 33d0574 + b7da01d commit 111494d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 17 deletions.
25 changes: 11 additions & 14 deletions ber.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,12 @@ func lengthLength(i int) (numBytes int) {
// added to 0x80. The length is encoded in big endian encoding follow after
//
// Examples:
// length | byte 1 | bytes n
// 0 | 0x00 | -
// 120 | 0x78 | -
// 200 | 0x81 | 0xC8
// 500 | 0x82 | 0x01 0xF4
//
// length | byte 1 | bytes n
// 0 | 0x00 | -
// 120 | 0x78 | -
// 200 | 0x81 | 0xC8
// 500 | 0x82 | 0x01 0xF4
func encodeLength(out *bytes.Buffer, length int) (err error) {
if length >= 128 {
l := lengthLength(length)
Expand All @@ -134,9 +134,6 @@ func encodeLength(out *bytes.Buffer, length int) (err error) {

func readObject(ber []byte, offset int) (asn1Object, int, error) {
berLen := len(ber)
if offset >= berLen {
return nil, 0, errors.New("ber2der: offset is after end of ber data")
}
tagStart := offset
b := ber[offset]
offset++
Expand All @@ -149,14 +146,14 @@ func readObject(ber []byte, offset int) (asn1Object, int, error) {
for ber[offset] >= 0x80 {
tag = tag*128 + ber[offset] - 0x80
offset++
if offset > berLen {
if offset >= berLen {
return nil, 0, errors.New("ber2der: cannot move offset forward, end of ber data reached")
}
}
// jvehent 20170227: this doesn't appear to be used anywhere...
//tag = tag*128 + ber[offset] - 0x80
offset++
if offset > berLen {
if offset >= berLen {
return nil, 0, errors.New("ber2der: cannot move offset forward, end of ber data reached")
}
}
Expand All @@ -172,7 +169,7 @@ func readObject(ber []byte, offset int) (asn1Object, int, error) {
var length int
l := ber[offset]
offset++
if offset > berLen {
if offset >= berLen {
return nil, 0, errors.New("ber2der: cannot move offset forward, end of ber data reached")
}
indefinite := false
Expand All @@ -188,11 +185,11 @@ func readObject(ber []byte, offset int) (asn1Object, int, error) {
return nil, 0, errors.New("ber2der: BER tag length has leading zero")
}
debugprint("--> (compute length) indicator byte: %x\n", l)
debugprint("--> (compute length) length bytes: % X\n", ber[offset:offset+numberOfBytes])
//debugprint("--> (compute length) length bytes: % X\n", ber[offset:offset+numberOfBytes]) // may panic if unoptimized
for i := 0; i < numberOfBytes; i++ {
length = length*256 + (int)(ber[offset])
offset++
if offset > berLen {
if offset >= berLen {
return nil, 0, errors.New("ber2der: cannot move offset forward, end of ber data reached")
}
}
Expand Down Expand Up @@ -259,7 +256,7 @@ func readObject(ber []byte, offset int) (asn1Object, int, error) {
}

func isIndefiniteTermination(ber []byte, offset int) (bool, error) {
if len(ber) - offset < 2 {
if len(ber)-offset < 2 {
return false, errors.New("ber2der: Invalid BER format")
}

Expand Down
9 changes: 6 additions & 3 deletions ber_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,15 @@ func TestBer2Der_Negatives(t *testing.T) {
Input []byte
ErrorContains string
}{
{[]byte{0x30, 0x85}, "tag length too long"},
{[]byte{0x1f, 0x0}, "end of ber data reached"},
{[]byte{0x30, 0x85, 0x1}, "tag length too long"},
{[]byte{0x30, 0x84, 0x80, 0x0, 0x0, 0x0}, "length is negative"},
{[]byte{0x30, 0x82, 0x0, 0x1}, "length has leading zero"},
{[]byte{0x30, 0x81, 0x01}, "end of ber data reached"},
{[]byte{0x30, 0x80, 0x1, 0x2, 0x1, 0x2}, "Invalid BER format"},
{[]byte{0x30, 0x80, 0x1, 0x2}, "BER tag length is more than available data"},
{[]byte{0x30, 0x03, 0x01, 0x02}, "length is more than available data"},
{[]byte{0x30, 0x80, 0x1, 0x2, 0x1}, "BER tag length is more than available data"},
{[]byte{0x1f, 0x80}, "end of ber data reached"},
{[]byte{0x30, 0x80}, "end of ber data reached"},
{[]byte{0x30}, "end of ber data reached"},
}

Expand Down

0 comments on commit 111494d

Please sign in to comment.