aboutsummaryrefslogtreecommitdiff
path: root/ber/unmarshal.go
diff options
context:
space:
mode:
Diffstat (limited to 'ber/unmarshal.go')
-rw-r--r--ber/unmarshal.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/ber/unmarshal.go b/ber/unmarshal.go
new file mode 100644
index 0000000..487fb02
--- /dev/null
+++ b/ber/unmarshal.go
@@ -0,0 +1,97 @@
+package ber
+
+func (s *state) unmarshalLen() int {
+ b, _ := s.ReadByte()
+ if b&0x80 == 0 {
+ return int(b)
+ }
+ l := int(b) & 0x7f
+ var n int
+ for i, v := range s.Next(l) {
+ n |= int(v) << uint((l-i-1)*8)
+ }
+ return n
+}
+
+func (s *state) unmarshalBase128() int {
+ var i int
+ for {
+ b, err := s.ReadByte()
+ if err != nil {
+ return i
+ }
+ i = (i << 7) | int(b&0x7f)
+ if b&0x80 == 0 {
+ return i
+ }
+ }
+}
+
+func (s *state) unmarshalBool() bool {
+ b := s.next()
+ return b[0] != 0x00
+}
+
+func (s *state) unmarshalInt() int {
+ b := s.next()
+ neg := b[0]&0x80 != 0
+ var i int
+ for _, v := range b {
+ if neg {
+ v = ^v
+ }
+ i = (i << 8) | int(v)
+ }
+ if neg {
+ i = ^i
+ }
+ return i
+}
+
+func (s *state) unmarshalString() string {
+ return string(s.next())
+}
+
+func (s *state) unmarshalOID() OID {
+ var o OID
+ if s.Len() < 2 {
+ return o
+ }
+ buf := s.subState()
+ v := buf.unmarshalBase128()
+ if v < 80 {
+ o = OID{v / 40, v % 40}
+ } else {
+ o = OID{2, v - 80}
+ }
+ for buf.Len() > 0 {
+ o = append(o, buf.unmarshalBase128())
+ }
+ return o
+}
+
+func (s *state) unmarshalBitString() BitString {
+ var bs BitString
+ b := s.next()
+ pad := int(b[0])
+ l := (len(b)-1)*8 - pad
+ for i := 0; i < l; i++ {
+ x := 1 + i/8
+ y := 7 - uint(i%8)
+ bs = append(bs, b[x]&(1<<y) != 0)
+ }
+ return bs
+}
+
+func (s *state) unmarshalClass() Header {
+ b, _ := s.ReadByte()
+ tag := Tag(b) & tagMask
+ if tag == tagMask {
+ tag = Tag(s.unmarshalBase128())
+ }
+ return Header{
+ Class: Class(b) & classMask,
+ Kind: Kind(b) & kindMask,
+ Tag: tag,
+ }
+}