aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ber/class.go10
-rw-r--r--ber/int.go7
-rw-r--r--parse/parse.go18
3 files changed, 19 insertions, 16 deletions
diff --git a/ber/class.go b/ber/class.go
index f2915fe..0839c05 100644
--- a/ber/class.go
+++ b/ber/class.go
@@ -116,3 +116,13 @@ func Ident(b []byte) (Class, Kind, Tag, int) {
}
return c, k, t, n + 1
}
+
+func Length(b []byte) (int, int) {
+ if b[0] & 0x80 != 0 {
+ l := b[0] & 0x7f
+ i := unmarshalUint(b[1:l+1])
+ return int(i), int(l+1)
+ } else {
+ return int(b[0]), 1
+ }
+}
diff --git a/ber/int.go b/ber/int.go
index a8fe19c..5bfcd89 100644
--- a/ber/int.go
+++ b/ber/int.go
@@ -32,6 +32,13 @@ func unmarshalInt(b []byte) (i int64) {
return
}
+func unmarshalUint(b []byte) (i int64) {
+ for n, v := range b {
+ i += int64(v) << uint((n-1)*8)
+ }
+ return
+}
+
func marshalInt(i int64) (b []byte) {
for n := intLen(i); n > 0; n-- {
b = append(b, byte(i>>uint((n-1)*8)))
diff --git a/parse/parse.go b/parse/parse.go
index 0ab611b..64a197b 100644
--- a/parse/parse.go
+++ b/parse/parse.go
@@ -3,26 +3,12 @@ package main
import (
"dim13.org/asn1/ber"
"fmt"
- "log"
)
-func Chop(b []byte) (h byte, l int, v []byte, r []byte) {
- if len(b) > 1 {
- h = b[0]
- l = int(b[1])
- if 2+l > len(b) {
- log.Fatal("lenght ", l, len(b))
- }
- v, r = b[2:2+l], b[2+l:]
- }
- return
-}
-
// broken
func dump(b []byte, indent int) {
- head, _, value, rest := Chop(b)
+ class, kind, tag, _, value, rest := ber.Split(b)
- class, kind, tag := ber.Ident(head)
for i := indent; i > 0; i-- {
fmt.Print("\t")
}
@@ -52,7 +38,7 @@ func dump(b []byte, indent int) {
func main() {
for n, s := range session {
- fmt.Println("packet", n)
+ fmt.Println(">>> packet", n)
dump(s, 0)
fmt.Println("")
}