]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: fix unmarshaling of implicitly tagged UTF-8 strings.
authorAdam Langley <agl@golang.org>
Tue, 30 Sep 2014 18:49:15 +0000 (11:49 -0700)
committerAdam Langley <agl@golang.org>
Tue, 30 Sep 2014 18:49:15 +0000 (11:49 -0700)
Fixes #8541.

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/153770043

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

index b06aec3e408335283dc84df93bf1cac32ef33583..3aeb3dcc4bcde4255088a8e6b484ec019bb68fcb 100644 (file)
@@ -640,15 +640,19 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
        // when it sees a string, so if we see a different string type on the
        // wire, we change the universal type to match.
        if universalTag == tagPrintableString {
-               switch t.tag {
-               case tagIA5String, tagGeneralString, tagT61String, tagUTF8String:
-                       universalTag = t.tag
+               if params.tag == nil {
+                       switch t.tag {
+                       case tagIA5String, tagGeneralString, tagT61String, tagUTF8String:
+                               universalTag = t.tag
+                       }
+               } else if params.stringType != 0 {
+                       universalTag = params.stringType
                }
        }
 
        // Special case for time: UTCTime and GeneralizedTime both map to the
        // Go type time.Time.
-       if universalTag == tagUTCTime && t.tag == tagGeneralizedTime {
+       if universalTag == tagUTCTime && params.tag == nil && t.tag == tagGeneralizedTime {
                universalTag = tagGeneralizedTime
        }
 
index b553f78e0a6fe659b0f77a541694895976e8c7cd..b94d59d36939d02fc8ceb9403630d765800c8e1f 100644 (file)
@@ -392,6 +392,10 @@ type TestContextSpecificTags2 struct {
        B int
 }
 
+type TestContextSpecificTags3 struct {
+       S string `asn1:"tag:1,utf8"`
+}
+
 type TestElementsAfterString struct {
        S    string
        A, B int
@@ -420,6 +424,7 @@ var unmarshalTestData = []struct {
        {[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}},
        {[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}},
        {[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}},
+       {[]byte{0x30, 0x03, 0x81, 0x01, '@'}, &TestContextSpecificTags3{"@"}},
        {[]byte{0x01, 0x01, 0x00}, newBool(false)},
        {[]byte{0x01, 0x01, 0xff}, newBool(true)},
        {[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}},