]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: add MarshalWithParams
authorHiroshi Ioka <hirochachacha@gmail.com>
Wed, 24 May 2017 23:57:03 +0000 (08:57 +0900)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 16 Nov 2017 00:37:47 +0000 (00:37 +0000)
Fixes #18873

Change-Id: Idb9750f739f91ebca34efcbc177254d412b4d90d
Reviewed-on: https://go-review.googlesource.com/44111
Reviewed-by: Adam Langley <agl@golang.org>
Run-TryBot: Adam Langley <agl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

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

index 0f4e869d30acf5fb4b45f4c103443613a79645b7..3f46e03d35fdec9880cd3eb0233e9c58be834c78 100644 (file)
@@ -658,7 +658,13 @@ func makeField(v reflect.Value, params fieldParameters) (e encoder, err error) {
 //     utc:         causes time.Time to be marshaled as ASN.1, UTCTime values
 //     generalized: causes time.Time to be marshaled as ASN.1, GeneralizedTime values
 func Marshal(val interface{}) ([]byte, error) {
-       e, err := makeField(reflect.ValueOf(val), fieldParameters{})
+       return MarshalWithParams(val, "")
+}
+
+// MarshalWithParams allows field parameters to be specified for the
+// top-level element. The form of the params is the same as the field tags.
+func MarshalWithParams(val interface{}, params string) ([]byte, error) {
+       e, err := makeField(reflect.ValueOf(val), parseFieldParameters(params))
        if err != nil {
                return nil, err
        }
index 389bb6ea948e31395cdf30f33f0ebb56d60254bd..75adc303b0732e17bcf26df50bc237e2917ac5c4 100644 (file)
@@ -180,6 +180,31 @@ func TestMarshal(t *testing.T) {
        }
 }
 
+type marshalWithParamsTest struct {
+       in     interface{}
+       params string
+       out    string // hex encoded
+}
+
+var marshalWithParamsTests = []marshalWithParamsTest{
+       {intStruct{10}, "set", "310302010a"},
+       {intStruct{10}, "application", "600302010a"},
+}
+
+func TestMarshalWithParams(t *testing.T) {
+       for i, test := range marshalWithParamsTests {
+               data, err := MarshalWithParams(test.in, test.params)
+               if err != nil {
+                       t.Errorf("#%d failed: %s", i, err)
+               }
+               out, _ := hex.DecodeString(test.out)
+               if !bytes.Equal(out, data) {
+                       t.Errorf("#%d got: %x want %x\n\t%q\n\t%q", i, data, out, data, out)
+
+               }
+       }
+}
+
 type marshalErrTest struct {
        in  interface{}
        err string