package ber type Class byte const ( Universal Class = iota << 6 Application ContextSpecific Private ) // 1100 0000 // C 0 const 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 ) // 0010 0000 // 2 0 const KindMask Kind = 1 << 5 var kindNames = map[Kind]string{ Primitive: "Primitive", Constructed: "Constructed", } func (k Kind) String() string { return kindNames[k] } type Tag byte 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 ) // 0001 1111 // 1 F const TagMask Tag = 0x20 - 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) { return Class(b) & ClassMask, Kind(b) & KindMask, Tag(b) & TagMask }