]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: handle application tag in Marshal
authorHiroshi Ioka <hirochachacha@gmail.com>
Wed, 24 May 2017 22:48:08 +0000 (07:48 +0900)
committerAdam Langley <agl@golang.org>
Tue, 15 Aug 2017 18:45:39 +0000 (18:45 +0000)
Fixes #20488

Change-Id: Iae963b612aea3d9e814b08f655e2eb019ece256e
Reviewed-on: https://go-review.googlesource.com/44110
Reviewed-by: Adam Langley <agl@golang.org>
Run-TryBot: Adam Langley <agl@golang.org>

src/encoding/asn1/marshal.go
src/encoding/asn1/marshal_test.go

index fdadb3996efcf8afbf9f6c11beec3b20f7abb47c..bbd3ee7308c5b2929e31fdd5350e14c24dac8174 100644 (file)
@@ -560,7 +560,6 @@ func makeField(v reflect.Value, params fieldParameters) (e encoder, err error) {
        if !ok {
                return nil, StructuralError{fmt.Sprintf("unknown Go type: %v", v.Type())}
        }
-       class := ClassUniversal
 
        if params.timeType != 0 && tag != TagUTCTime {
                return nil, StructuralError{"explicit time type given to non-time member"}
@@ -610,27 +609,33 @@ func makeField(v reflect.Value, params fieldParameters) (e encoder, err error) {
 
        bodyLen := t.body.Len()
 
-       if params.explicit {
-               t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{class, tag, bodyLen, isCompound}))
+       class := ClassUniversal
+       if params.tag != nil {
+               if params.application {
+                       class = ClassApplication
+               } else {
+                       class = ClassContextSpecific
+               }
 
-               tt := new(taggedEncoder)
+               if params.explicit {
+                       t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{ClassUniversal, tag, bodyLen, isCompound}))
 
-               tt.body = t
+                       tt := new(taggedEncoder)
 
-               tt.tag = bytesEncoder(appendTagAndLength(tt.scratch[:0], tagAndLength{
-                       class:      ClassContextSpecific,
-                       tag:        *params.tag,
-                       length:     bodyLen + t.tag.Len(),
-                       isCompound: true,
-               }))
+                       tt.body = t
 
-               return tt, nil
-       }
+                       tt.tag = bytesEncoder(appendTagAndLength(tt.scratch[:0], tagAndLength{
+                               class:      class,
+                               tag:        *params.tag,
+                               length:     bodyLen + t.tag.Len(),
+                               isCompound: true,
+                       }))
+
+                       return tt, nil
+               }
 
-       if params.tag != nil {
                // implicit tag.
                tag = *params.tag
-               class = ClassContextSpecific
        }
 
        t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{class, tag, bodyLen, isCompound}))
index 10db1aa575afea00dee83128de81e9077e40d376..87d358d64c8a7cd3082255df553321f56978d1a3 100644 (file)
@@ -71,6 +71,11 @@ type defaultTest struct {
        A int `asn1:"optional,default:1"`
 }
 
+type applicationTest struct {
+       A int `asn1:"application,tag:0"`
+       B int `asn1:"application,tag:1,explicit"`
+}
+
 type testSET []int
 
 var PST = time.FixedZone("PST", -8*60*60)
@@ -152,6 +157,7 @@ var marshalTests = []marshalTest{
        {defaultTest{0}, "3003020100"},
        {defaultTest{1}, "3000"},
        {defaultTest{2}, "3003020102"},
+       {applicationTest{1, 2}, "30084001016103020102"},
 }
 
 func TestMarshal(t *testing.T) {