aboutsummaryrefslogtreecommitdiff
path: root/ber/new/unmarshal.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-09-25 20:41:38 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-09-25 20:41:38 +0200
commit511cf41a779929b5c81b7429c37dc11bd9544182 (patch)
tree6ab421d4b7ec868c48b40da57e3de542831767dd /ber/new/unmarshal.go
parent0559b7d4eab07cacf0f005e8e756c1d04470e0c7 (diff)
Rewrite from scratch
Diffstat (limited to 'ber/new/unmarshal.go')
-rw-r--r--ber/new/unmarshal.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/ber/new/unmarshal.go b/ber/new/unmarshal.go
new file mode 100644
index 0000000..9fd27cd
--- /dev/null
+++ b/ber/new/unmarshal.go
@@ -0,0 +1,83 @@
+package ber
+
+func (s *state) unmarshalLen() int {
+ b, _ := s.ReadByte()
+ if b&0x80 == 0 {
+ return int(b)
+ }
+ var n int
+ for i, v := range s.Next(int(b)) {
+ n |= int(v) << uint(i*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
+}