]> Cypherpunks repositories - gostls13.git/commitdiff
asn1: fix marshalling of empty optional RawValues
authorMikkel Krautz <mikkel@krautz.dk>
Wed, 1 Jun 2011 16:54:16 +0000 (12:54 -0400)
committerAdam Langley <agl@golang.org>
Wed, 1 Jun 2011 16:54:16 +0000 (12:54 -0400)
This fixes creation of X509 certificates with
RSA keys. (Broken by e5ecc416f2fd)

R=agl
CC=golang-dev
https://golang.org/cl/4553052

src/pkg/asn1/marshal.go
src/pkg/asn1/marshal_test.go

index 771ac28243183c137ba0369106da82550e3941eb..7212c91ef98b944cfdad0c2a21590de63a120924 100644 (file)
@@ -458,11 +458,12 @@ func marshalField(out *forkableWriter, v reflect.Value, params fieldParameters)
                return marshalField(out, v.Elem(), params)
        }
 
+       if params.optional && reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) {
+               return
+       }
+
        if v.Type() == rawValueType {
                rv := v.Interface().(RawValue)
-               if rv.Class == 0 && rv.Tag == 0 && len(rv.Bytes) == 0 && params.optional {
-                       return
-               }
                err = marshalTagAndLength(out, tagAndLength{rv.Class, rv.Tag, len(rv.Bytes), rv.IsCompound})
                if err != nil {
                        return
@@ -471,10 +472,6 @@ func marshalField(out *forkableWriter, v reflect.Value, params fieldParameters)
                return
        }
 
-       if params.optional && reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) {
-               return
-       }
-
        tag, isCompound, ok := getUniversalType(v.Type())
        if !ok {
                err = StructuralError{fmt.Sprintf("unknown Go type: %v", v.Type())}
index cd165d203528ec07732e8734dd70cca0133fa1a1..a9517634d88cb1850ca0079bdcc398522e77f916 100644 (file)
@@ -45,6 +45,10 @@ type printableStringTest struct {
        A string "printable"
 }
 
+type optionalRawValueTest struct {
+       A RawValue "optional"
+}
+
 type testSET []int
 
 func setPST(t *time.Time) *time.Time {
@@ -102,6 +106,7 @@ var marshalTests = []marshalTest{
                        "7878787878787878787878787878787878787878787878787878787878787878",
        },
        {ia5StringTest{"test"}, "3006160474657374"},
+       {optionalRawValueTest{}, "3000"},
        {printableStringTest{"test"}, "3006130474657374"},
        {printableStringTest{"test*"}, "30071305746573742a"},
        {rawContentsStruct{nil, 64}, "3003020140"},