Commit 9f06ccb4 authored by Dave Cheney's avatar Dave Cheney Committed by Russ Cox

asn1: add support for unmarshalling structs with int32 members

Also improve error message for unsupported integer types

R=agl, rsc
CC=golang-dev
https://golang.org/cl/4873049
parent b40bd5ef
...@@ -681,9 +681,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam ...@@ -681,9 +681,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
} }
err = err1 err = err1
return return
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: case reflect.Int, reflect.Int32:
switch val.Type().Kind() {
case reflect.Int:
parsedInt, err1 := parseInt(innerBytes) parsedInt, err1 := parseInt(innerBytes)
if err1 == nil { if err1 == nil {
val.SetInt(int64(parsedInt)) val.SetInt(int64(parsedInt))
...@@ -697,7 +695,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam ...@@ -697,7 +695,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
} }
err = err1 err = err1
return return
} // TODO(dfc) Add support for the remaining integer types
case reflect.Struct: case reflect.Struct:
structType := fieldType structType := fieldType
...@@ -760,7 +758,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam ...@@ -760,7 +758,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
} }
return return
} }
err = StructuralError{"unknown Go type"} err = StructuralError{"unsupported: " + v.Type().String()}
return return
} }
...@@ -787,7 +785,7 @@ func setDefaultValue(v reflect.Value, params fieldParameters) (ok bool) { ...@@ -787,7 +785,7 @@ func setDefaultValue(v reflect.Value, params fieldParameters) (ok bool) {
// Because Unmarshal uses the reflect package, the structs // Because Unmarshal uses the reflect package, the structs
// being written to must use upper case field names. // being written to must use upper case field names.
// //
// An ASN.1 INTEGER can be written to an int or int64. // An ASN.1 INTEGER can be written to an int, int32 or int64.
// If the encoded value does not fit in the Go type, // If the encoded value does not fit in the Go type,
// Unmarshal returns a parse error. // Unmarshal returns a parse error.
// //
......
...@@ -42,6 +42,37 @@ func TestParseInt64(t *testing.T) { ...@@ -42,6 +42,37 @@ func TestParseInt64(t *testing.T) {
} }
} }
type int32Test struct {
in []byte
ok bool
out int32
}
var int32TestData = []int32Test{
{[]byte{0x00}, true, 0},
{[]byte{0x7f}, true, 127},
{[]byte{0x00, 0x80}, true, 128},
{[]byte{0x01, 0x00}, true, 256},
{[]byte{0x80}, true, -128},
{[]byte{0xff, 0x7f}, true, -129},
{[]byte{0xff, 0xff, 0xff, 0xff}, true, -1},
{[]byte{0xff}, true, -1},
{[]byte{0x80, 0x00, 0x00, 0x00}, true, -2147483648},
{[]byte{0x80, 0x00, 0x00, 0x00, 0x00}, false, 0},
}
func TestParseInt32(t *testing.T) {
for i, test := range int32TestData {
ret, err := parseInt(test.in)
if (err == nil) != test.ok {
t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
}
if test.ok && int32(ret) != test.out {
t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
}
}
}
var bigIntTests = []struct { var bigIntTests = []struct {
in []byte in []byte
base10 string base10 string
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment