From 511cf41a779929b5c81b7429c37dc11bd9544182 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 25 Sep 2015 20:41:38 +0200 Subject: Rewrite from scratch --- ber/new/marshal.go | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 ber/new/marshal.go (limited to 'ber/new/marshal.go') diff --git a/ber/new/marshal.go b/ber/new/marshal.go new file mode 100644 index 0000000..c45e61b --- /dev/null +++ b/ber/new/marshal.go @@ -0,0 +1,107 @@ +package ber + +func lenLen(i int) int { + var n int + for ; i > 255; i >>= 8 { + n++ + } + return n + 1 +} + +func (s *state) marshalLen(val int) { + if val < 0x80 { + s.WriteByte(byte(val)) + return + } + n := lenLen(val) + s.WriteByte(byte(n) | 0x80) + for ; n > 0; n-- { + s.WriteByte(byte(val >> uint(n-1) * 8)) + } +} + +func (s *state) marshalBool(val bool) { + s.marshalLen(1) + if val { + s.WriteByte(0xff) + } else { + s.WriteByte(0) + } +} + +func intLen(i int) int { + var n int + for ; i > 127; i >>= 8 { + n++ + } + for ; i < -128; i >>= 8 { + n++ + } + return n + 1 +} + +func (s *state) marshalInt(val int) { + n := intLen(val) + s.marshalLen(n) + for ; n > 0; n-- { + s.WriteByte(byte(val >> uint((n-1)*8))) + } +} + +func (s *state) marshalString(val string) { + s.marshalLen(len(val)) + s.Write([]byte(val)) +} + +func (s *state) marshalBase128(val int) { + if val == 0 { + s.WriteByte(0) + return + } + var l int + for i := val; i > 0; i >>= 7 { + l++ + } + for i := l - 1; i >= 0; i-- { + o := byte(val >> uint(i*7) & 0x7f) + if i != 0 { + o |= 0x80 + } + s.WriteByte(o) + } +} + +func (s *state) marshalOID(val OID) { + if len(val) < 2 || val[0] > 2 { + return + } + if val[0] < 2 && val[1] > 39 { + return + } + buf := &state{} + buf.marshalBase128(val[0]*40 + val[1]) + for _, v := range val[2:] { + buf.marshalBase128(v) + } + s.marshalLen(buf.Len()) + s.Write(buf.Bytes()) +} + +func (s *state) marshalBitString(val BitString) { + pad := (8 - len(val)%8) % 8 + l := len(val) / 8 + if pad != 0 { + l++ + } + b := make([]byte, l) + for i, v := range val { + if v { + x := i / 8 + y := 7 - uint(i%8) + b[x] |= 1 << y + } + } + s.marshalLen(l + 1) + s.WriteByte(byte(pad)) + s.Write(b) +} -- cgit v1.2.3