Хорошо, в основном предварительным условием является понимание ASN.1
ASN.1 - это спецификация абстрактного синтаксиса, описывающего структуру данных. Это рекурсивно и сложно. И что меня интересует, так это точная структура данных, определяемая им, а не синтаксисом.
Итак, простое верхнее представление любого перевариваемого токена:
|Type(1byte)|Length(1-xbyte)|Value(ybyte)|
Type: |class(2bit)|form(1bit)|tag(5bit)|
Type.class определяется как mean
- 00: UNIVERSAL, универсально допустимый тип
- 01: APPLICATION, тип, определяемый приложением c
- 10: Context-specifici c
- 11: ЧАСТНЫЙ
Только УНИВЕРСАЛЬНЫЙ класс соответствует отображаемой структуре. Другие классы могут полностью переопределить все.
Type.form определяется как
- 0: примитив, например INTEGER
- 1: построено, например SEQUENCE
Type.tag означает
- 0x00: EO C
- 0x01: BOOLEAN
- 0x02: INTEGER
- 0x03: BIT_STRING
- 0x04: OCTET_STRING
- 0x05: NULL
- 0x06: OBJECT_IDENTIFIER
- 0x07: ObjectDescriptor
- 0x05 ВНЕШНИЙ
- 0x09: REAL
- 0x0A: ENUMERATED
- 0x0B: EMBEDDED_PDV
- 0x0 C: UTF8String
- 0x10: SEQUENCE
- 0x11: SET
- 0x12: NumericString
- 0x13: PrintableString
- 0x14: TeletexString
- 0x15: VideotexString ";
- 0x16: IA5String
- 0x17: UTCTime
- 0x18: GeneralizedTime
- 0x19: GraphicString
- 0x1A: VisibleString
- 0x1B: GeneralString
- 0x1 C : UniversalString
- 0x1E: BMPString
Длина может быть определена
- Short -> при определении как примитив -> первый бит равен 0, остальные 7 бит определяют значение
- Long -> при определении как Primitive -> первый бит равен 1, остальные 7 битов определяют длину следующего значения длины
- Indefinite -> здесь значение длины заканчивается двумя нулями байт