mirror of
https://github.com/golang/go
synced 2024-11-19 16:44:43 -07:00
encoding/asn1: handle application tag in Marshal
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>
This commit is contained in:
parent
4a5f85babb
commit
d47c9bce81
@ -560,7 +560,6 @@ func makeField(v reflect.Value, params fieldParameters) (e encoder, err error) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return nil, StructuralError{fmt.Sprintf("unknown Go type: %v", v.Type())}
|
return nil, StructuralError{fmt.Sprintf("unknown Go type: %v", v.Type())}
|
||||||
}
|
}
|
||||||
class := ClassUniversal
|
|
||||||
|
|
||||||
if params.timeType != 0 && tag != TagUTCTime {
|
if params.timeType != 0 && tag != TagUTCTime {
|
||||||
return nil, StructuralError{"explicit time type given to non-time member"}
|
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()
|
bodyLen := t.body.Len()
|
||||||
|
|
||||||
if params.explicit {
|
class := ClassUniversal
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
if params.tag != nil {
|
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.
|
// implicit tag.
|
||||||
tag = *params.tag
|
tag = *params.tag
|
||||||
class = ClassContextSpecific
|
|
||||||
}
|
}
|
||||||
|
|
||||||
t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{class, tag, bodyLen, isCompound}))
|
t.tag = bytesEncoder(appendTagAndLength(t.scratch[:0], tagAndLength{class, tag, bodyLen, isCompound}))
|
||||||
|
@ -71,6 +71,11 @@ type defaultTest struct {
|
|||||||
A int `asn1:"optional,default:1"`
|
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
|
type testSET []int
|
||||||
|
|
||||||
var PST = time.FixedZone("PST", -8*60*60)
|
var PST = time.FixedZone("PST", -8*60*60)
|
||||||
@ -152,6 +157,7 @@ var marshalTests = []marshalTest{
|
|||||||
{defaultTest{0}, "3003020100"},
|
{defaultTest{0}, "3003020100"},
|
||||||
{defaultTest{1}, "3000"},
|
{defaultTest{1}, "3000"},
|
||||||
{defaultTest{2}, "3003020102"},
|
{defaultTest{2}, "3003020102"},
|
||||||
|
{applicationTest{1, 2}, "30084001016103020102"},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshal(t *testing.T) {
|
func TestMarshal(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user