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 := ber.Ident(head) for i := indent; i > 0; i-- { fmt.Print("\t") } switch class { case ber.Universal: switch tag { case ber.Integer: fmt.Println(tag, ber.UnmarshalInt(value)) case ber.ObjectIdentifier: fmt.Println(tag, ber.UnmarshalOID(value)) default: fmt.Println(tag, kind, value) } default: fmt.Println(class, kind, byte(tag), value) } if len(value) > 0 && kind != ber.Primitive { dump(value, indent+1) } if len(rest) > 0 { dump(rest, indent) } } func main() { for n, s := range session { fmt.Println("packet", n) dump(s, 0) fmt.Println("") } }