mirror of
https://github.com/golang/go
synced 2024-11-22 02:54:39 -07:00
asn1: Implement correct marshalling of length octets
Fixes #1683 R=agl1 CC=golang-dev, rsc https://golang.org/cl/4367049
This commit is contained in:
parent
69a9bf4195
commit
fe3dcfee27
@ -125,6 +125,28 @@ func int64Length(i int64) (numBytes int) {
|
|||||||
return
|
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) {
|
func marshalTagAndLength(out *forkableWriter, t tagAndLength) (err os.Error) {
|
||||||
b := uint8(t.class) << 6
|
b := uint8(t.class) << 6
|
||||||
if t.isCompound {
|
if t.isCompound {
|
||||||
@ -149,12 +171,12 @@ func marshalTagAndLength(out *forkableWriter, t tagAndLength) (err os.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if t.length >= 128 {
|
if t.length >= 128 {
|
||||||
l := int64Length(int64(t.length))
|
l := lengthLength(t.length)
|
||||||
err = out.WriteByte(0x80 | byte(l))
|
err = out.WriteByte(0x80 | byte(l))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = marshalInt64(out, int64(t.length))
|
err = marshalLength(out, t.length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,30 @@ var marshalTests = []marshalTest{
|
|||||||
{ObjectIdentifier([]int{1, 2, 3, 4}), "06032a0304"},
|
{ObjectIdentifier([]int{1, 2, 3, 4}), "06032a0304"},
|
||||||
{ObjectIdentifier([]int{1, 2, 840, 133549, 1, 1, 5}), "06092a864888932d010105"},
|
{ObjectIdentifier([]int{1, 2, 840, 133549, 1, 1, 5}), "06092a864888932d010105"},
|
||||||
{"test", "130474657374"},
|
{"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"},
|
{ia5StringTest{"test"}, "3006160474657374"},
|
||||||
{printableStringTest{"test"}, "3006130474657374"},
|
{printableStringTest{"test"}, "3006130474657374"},
|
||||||
{printableStringTest{"test*"}, "30071305746573742a"},
|
{printableStringTest{"test*"}, "30071305746573742a"},
|
||||||
|
Loading…
Reference in New Issue
Block a user