Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b5121be2f |
+3
-2
@@ -470,7 +470,8 @@ func (s *String) ReadASN1GeneralizedTime(out *time.Time) bool {
|
|||||||
// It reports whether the read was successful.
|
// It reports whether the read was successful.
|
||||||
func (s *String) ReadASN1BitString(out *encoding_asn1.BitString) bool {
|
func (s *String) ReadASN1BitString(out *encoding_asn1.BitString) bool {
|
||||||
var bytes String
|
var bytes String
|
||||||
if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 {
|
if !s.ReadASN1(&bytes, asn1.BIT_STRING) || len(bytes) == 0 ||
|
||||||
|
len(bytes)*8/8 != len(bytes) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,7 +741,7 @@ func (s *String) readASN1(out *String, outTag *asn1.Tag, skipHeader bool) bool {
|
|||||||
length = headerLen + len32
|
length = headerLen + len32
|
||||||
}
|
}
|
||||||
|
|
||||||
if uint32(int(length)) != length || !s.ReadBytes((*[]byte)(out), int(length)) {
|
if int(length) < 0 || !s.ReadBytes((*[]byte)(out), int(length)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if skipHeader && !out.Skip(int(headerLen)) {
|
if skipHeader && !out.Skip(int(headerLen)) {
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ var readASN1TestData = []readASN1Test{
|
|||||||
{"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil},
|
{"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil},
|
||||||
{"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil},
|
{"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil},
|
||||||
{"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil},
|
{"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil},
|
||||||
|
{"2**31 - 1 length", []byte{0x30, 0x84, 0x7f, 0xff, 0xff, 0xff}, 0x30, false, nil},
|
||||||
|
{"2**32 - 1 length", []byte{0x30, 0x84, 0xff, 0xff, 0xff, 0xff}, 0x30, false, nil},
|
||||||
|
{"2**63 - 1 length", []byte{0x30, 0x88, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 0x30, false, nil},
|
||||||
|
{"2**64 - 1 length", []byte{0x30, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 0x30, false, nil},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadASN1(t *testing.T) {
|
func TestReadASN1(t *testing.T) {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ type String []byte
|
|||||||
// read advances a String by n bytes and returns them. If less than n bytes
|
// read advances a String by n bytes and returns them. If less than n bytes
|
||||||
// remain, it returns nil.
|
// remain, it returns nil.
|
||||||
func (s *String) read(n int) []byte {
|
func (s *String) read(n int) []byte {
|
||||||
if len(*s) < n {
|
if len(*s) < n || n < 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
v := (*s)[:n]
|
v := (*s)[:n]
|
||||||
@@ -105,11 +105,6 @@ func (s *String) readLengthPrefixed(lenLen int, outChild *String) bool {
|
|||||||
length = length << 8
|
length = length << 8
|
||||||
length = length | uint32(b)
|
length = length | uint32(b)
|
||||||
}
|
}
|
||||||
if int(length) < 0 {
|
|
||||||
// This currently cannot overflow because we read uint24 at most, but check
|
|
||||||
// anyway in case that changes in the future.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
v := s.read(int(length))
|
v := s.read(int(length))
|
||||||
if v == nil {
|
if v == nil {
|
||||||
return false
|
return false
|
||||||
|
|||||||
Reference in New Issue
Block a user