]> Cypherpunks repositories - gostls13.git/commitdiff
asn1: Implement correct marshalling of length octets
authorLuit van Drongelen <luitvd@gmail.com>
Mon, 11 Apr 2011 14:28:34 +0000 (10:28 -0400)
committerAdam Langley <agl@golang.org>
Mon, 11 Apr 2011 14:28:34 +0000 (10:28 -0400)
Fixes #1683

R=agl1
CC=golang-dev, rsc
https://golang.org/cl/4367049

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

index dfcc15eb20a847f69161129c5223ed014e1910b4..64cb0f2bbc0ebfe48dad7db855eca12e45e78700 100644 (file)
@@ -125,6 +125,28 @@ func int64Length(i int64) (numBytes int) {
        return
 }
 
+func marshalLength(out *forkableWriter, i int) (err os.Error) {
+       n := lengthLength(i)
+
+       for ; n > 0; n-- {
+               err = out.WriteByte(byte(i >> uint((n-1)*8)))
+               if err != nil {
+                       return
+               }
+       }
+
+       return nil
+}
+
+func lengthLength(i int) (numBytes int) {
+       numBytes = 1
+       for i > 255 {
+               numBytes++
+               i >>= 8
+       }
+       return
+}
+
 func marshalTagAndLength(out *forkableWriter, t tagAndLength) (err os.Error) {
        b := uint8(t.class) << 6
        if t.isCompound {
@@ -149,12 +171,12 @@ func marshalTagAndLength(out *forkableWriter, t tagAndLength) (err os.Error) {
        }
 
        if t.length >= 128 {
-               l := int64Length(int64(t.length))
+               l := lengthLength(t.length)
                err = out.WriteByte(0x80 | byte(l))
                if err != nil {
                        return
                }
-               err = marshalInt64(out, int64(t.length))
+               err = marshalLength(out, t.length)
                if err != nil {
                        return
                }
index 85eafc9e4d21cf48f6a26ff9654f7beb54fbfc26..cd165d203528ec07732e8734dd70cca0133fa1a1 100644 (file)
@@ -77,6 +77,30 @@ var marshalTests = []marshalTest{
        {ObjectIdentifier([]int{1, 2, 3, 4}), "06032a0304"},
        {ObjectIdentifier([]int{1, 2, 840, 133549, 1, 1, 5}), "06092a864888932d010105"},
        {"test", "130474657374"},
+       {
+               "" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // This is 127 times 'x'
+               "137f" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "78787878787878787878787878787878787878787878787878787878787878",
+       },
+       {
+               "" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
+                       "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // This is 128 times 'x'
+               "138180" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "7878787878787878787878787878787878787878787878787878787878787878" +
+                       "7878787878787878787878787878787878787878787878787878787878787878",
+       },
        {ia5StringTest{"test"}, "3006160474657374"},
        {printableStringTest{"test"}, "3006130474657374"},
        {printableStringTest{"test*"}, "30071305746573742a"},