package ber import ( "bytes" "io" "strconv" "strings" ) type OID []int func MarshalOID(obj OID) []byte { if len(obj) < 2 || obj[0] > 2 { return nil } if obj[0] < 2 && obj[1] > 39 { return nil } buf := &bytes.Buffer{} MarshalLen(buf, len(obj)) buf.Write(base128(obj[0]*40 + obj[1])) for _, o := range obj[2:] { buf.Write(base128(o)) } return buf.Bytes() } func (o OID) Marshal() ([]byte, error) { return MarshalOID(o), nil } func UnmarshalOID(r io.ByteReader) (o OID) { l := UnmarshalLen(r) v := Debase128(r) if v < 80 { o = OID{v / 40, v % 40} } else { o = OID{2, v - 80} } for i := 0; i < l; i++ { o = append(o, Debase128(r)) } return } func (o OID) String() string { s := make([]string, len(o)) for i, v := range o { s[i] = strconv.Itoa(v) } return strings.Join(s, ".") } func (o OID) Equal(a OID) bool { if len(o) != len(a) { return false } for i := 0; i < len(o); i++ { if o[i] != a[i] { return false } } return true }