diff --git a/src/encoding/asn1/marshal.go b/src/encoding/asn1/marshal.go index fdadb3996e..bbd3ee7308 100644 --- a/src/encoding/asn1/marshal.go +++ b/src/encoding/asn1/marshal.go @@ -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})) - - tt := new(taggedEncoder) - - tt.body = t - - tt.tag = bytesEncoder(appendTagAndLength(tt.scratch[:0], tagAndLength{ - class: ClassContextSpecific, - tag: *params.tag, - length: bodyLen + t.tag.Len(), - isCompound: true, - })) - - return tt, nil - } - + class := ClassUniversal if params.tag != nil { + if params.application { + class = ClassApplication + } else { + class = ClassContextSpecific + } + + if params.explicit { + t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{ClassUniversal, tag, bodyLen, isCompound})) + + tt := new(taggedEncoder) + + tt.body = t + + tt.tag = bytesEncoder(appendTagAndLength(tt.scratch[:0], tagAndLength{ + class: class, + tag: *params.tag, + length: bodyLen + t.tag.Len(), + isCompound: true, + })) + + return tt, nil + } + // implicit tag. tag = *params.tag - class = ClassContextSpecific } t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{class, tag, bodyLen, isCompound})) diff --git a/src/encoding/asn1/marshal_test.go b/src/encoding/asn1/marshal_test.go index 10db1aa575..87d358d64c 100644 --- a/src/encoding/asn1/marshal_test.go +++ b/src/encoding/asn1/marshal_test.go @@ -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) {