]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: tags should be encoded in minimal form.
authorDavid Benjamin <davidben@google.com>
Tue, 5 Jan 2016 00:11:02 +0000 (16:11 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 25 Mar 2016 22:07:54 +0000 (22:07 +0000)
High tag number form may not be used for tag numbers that fit in low tag number
form.

Change-Id: I93edde0e1f86087047e0b3f2e55d6180b01e78bf
Reviewed-on: https://go-review.googlesource.com/18224
Reviewed-by: Adam Langley <agl@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>

src/encoding/asn1/asn1.go
src/encoding/asn1/asn1_test.go

index 8bafefd52bb463dde5ae5e9c85216d8916a9ee0d..bd2c96d887150b170394af0e5e64ffc7c9134a74 100644 (file)
@@ -461,6 +461,11 @@ func parseTagAndLength(bytes []byte, initOffset int) (ret tagAndLength, offset i
                if err != nil {
                        return
                }
+               // Tags should be encoded in minimal form.
+               if ret.tag < 0x1f {
+                       err = SyntaxError{"non-minimal tag"}
+                       return
+               }
        }
        if offset >= len(bytes) {
                err = SyntaxError{"truncated tag or length"}
index e0e833123b155ff838ad01438c3285cd61730fdc..f8623fa9a216df6fe3c00a7b36174e12a8ab782e 100644 (file)
@@ -364,7 +364,7 @@ var tagAndLengthData = []tagAndLengthTest{
        {[]byte{0xa0, 0x01}, true, tagAndLength{2, 0, 1, true}},
        {[]byte{0x02, 0x00}, true, tagAndLength{0, 2, 0, false}},
        {[]byte{0xfe, 0x00}, true, tagAndLength{3, 30, 0, true}},
-       {[]byte{0x1f, 0x01, 0x00}, true, tagAndLength{0, 1, 0, false}},
+       {[]byte{0x1f, 0x1f, 0x00}, true, tagAndLength{0, 31, 0, false}},
        {[]byte{0x1f, 0x81, 0x00, 0x00}, true, tagAndLength{0, 128, 0, false}},
        {[]byte{0x1f, 0x81, 0x80, 0x01, 0x00}, true, tagAndLength{0, 0x4001, 0, false}},
        {[]byte{0x00, 0x81, 0x80}, true, tagAndLength{0, 0, 128, false}},
@@ -382,6 +382,8 @@ var tagAndLengthData = []tagAndLengthTest{
        {[]byte{0xa0, 0x81, 0x7f}, false, tagAndLength{}},
        // Tag numbers which would overflow int32 are rejected. (The value below is 2^31.)
        {[]byte{0x1f, 0x88, 0x80, 0x80, 0x80, 0x00, 0x00}, false, tagAndLength{}},
+       // Long tag number form may not be used for tags that fit in short form.
+       {[]byte{0x1f, 0x1e, 0x00}, false, tagAndLength{}},
 }
 
 func TestParseTagAndLength(t *testing.T) {