package ber type Class byte const ( Universal Class = iota << 6 Application ContextSpecific Private classMask Class = 3 << 6 ) var classNames = map[Class]string{ Universal: "Universal", Application: "Application", ContextSpecific: "Context-specific", Private: "Private", } func (c Class) String() string { return classNames[c] } type Kind byte const ( Primitive Kind = iota << 5 Constructed kindMask Kind = 1 << 5 ) var kindNames = map[Kind]string{ Primitive: "Primitive", Constructed: "Constructed", } func (k Kind) String() string { return kindNames[k] } type Tag int const ( EOT Tag = iota Boolean Integer BitString OctetString Null ObjectIdentifier ObjectDescriptor InstanceOf Real Enumerated EmbeddedPDV UTF8String RelativeOID _ _ Sequence // SequenceOf Set // SetOf NumericString PrintableString TeletexString // T61String VideotexString IA5String UTCTime GeneralizedTime GraphicString VisibleString // ISO646String GeneralString UniversalString CharacterString BMPString tagMask Tag = (1 << 5) - 1 ) var tagNames = map[Tag]string{ EOT: "End-of-Content", Boolean: "Boolean", Integer: "Integer", BitString: "Bit String", OctetString: "Octet String", Null: "Null", ObjectIdentifier: "Object Identifier", ObjectDescriptor: "Object Descriptor", InstanceOf: "Instance Of", Real: "Real", Enumerated: "Enumerated", EmbeddedPDV: "Embedded PDV", UTF8String: "UTF8 String", RelativeOID: "Relative OID", Sequence: "Sequence / Of", Set: "Set / Of", NumericString: "Numeric String", PrintableString: "Printable String", TeletexString: "Teletext String", VideotexString: "Videotex String", IA5String: "IA5 String", UTCTime: "UTC Time", GeneralizedTime: "Generalized Time", GraphicString: "Graphic String", VisibleString: "Visible String", GeneralString: "General String", UniversalString: "Universal String", CharacterString: "Character String", BMPString: "BMP String", } func (t Tag) String() string { return tagNames[t] } func Ident(b []byte) (Class, Kind, Tag, int) { var d, n int c := Class(b[0]) & classMask k := Kind(b[0]) & kindMask t := Tag(b[0]) & tagMask if t == tagMask { d, n = debase128(b[1:]) t = Tag(d) } return c, k, t, n + 1 } func Length(b []byte) (int, int) { if b[0] & 0x80 != 0 { l := int(b[0] & 0x7f) i := unmarshalUint(b[1:l+1]) return int(i), int(l+1) } else { return int(b[0]), 1 } }