aboutsummaryrefslogtreecommitdiff
path: root/ber
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-08-11 15:13:49 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-08-11 15:13:49 +0200
commitdbf201b61a9f3d9e55d6744009f0f8f35c204e9d (patch)
treeb9b97e5548e546051ce0db22edd95511251b7af9 /ber
parent2b4528f54bd8893213839f8c57dcfd9a0ce30cef (diff)
Draft
Diffstat (limited to 'ber')
-rw-r--r--ber/class.go7
-rw-r--r--ber/marshal.go35
2 files changed, 29 insertions, 13 deletions
diff --git a/ber/class.go b/ber/class.go
index 23d31cd..279b3db 100644
--- a/ber/class.go
+++ b/ber/class.go
@@ -136,3 +136,10 @@ func Private(b []byte) (int, bool) {
c, _, t, _ := Ident(b)
return int(t), c == classPrivate
}
+
+func MarshalClass(c Class, k Kind, t Tag) []byte {
+ tag := base128(int(t))
+ tag[0] |= byte(c)
+ tag[0] |= byte(k)
+ return tag
+}
diff --git a/ber/marshal.go b/ber/marshal.go
index 25e0cb1..282ab45 100644
--- a/ber/marshal.go
+++ b/ber/marshal.go
@@ -5,19 +5,6 @@ import (
"reflect"
)
-type Marshaler interface {
- Marshal() ([]byte, error)
-}
-
-type Unmarshaler interface {
- Unmarshal([]byte) error
-}
-
-type ASN1 interface {
- Marshaler
- Unmarshaler
-}
-
type encodeState struct {
bytes.Buffer
}
@@ -57,6 +44,10 @@ func newTypeEncoder(t reflect.Type) encoderFunc {
switch t.Kind() {
case reflect.Int:
return intEncoder
+ case reflect.Struct:
+ return structEncoder
+ case reflect.Slice:
+ return sliceEncoder
default:
return unsupportedTypeEncoder
}
@@ -80,10 +71,28 @@ func (e *encodeState) error(err error) {
func intEncoder(e *encodeState, v reflect.Value) {
b := MarshalInt(int(v.Int()))
+ l := MarshalLen(len(b))
+ t := MarshalClass(classUniversal, kindPrimitive, tagInteger)
+ e.Write(t)
+ e.Write(l)
e.Write(b)
}
func objEncoder(e *encodeState, v reflect.Value) {
b := MarshalOID(v.Interface().(OID))
+ l := MarshalLen(len(b))
+ t := MarshalClass(classUniversal, kindPrimitive, tagObjectIdentifier)
+ e.Write(t)
+ e.Write(l)
e.Write(b)
}
+
+func structEncoder(e *encodeState, v reflect.Value) {
+ for i := 0; i < v.NumField(); i++ {
+ e.reflectValue(v.Field(i))
+ }
+}
+
+func sliceEncoder(e *encodeState, v reflect.Value) {
+ e.Write(v.Bytes())
+}