Русская Википедия:X.690
X.690 – один из стандартов ASN.1, разработанных совместно организациями ISO, IEC и ITU-T для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей байт. Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурамиШаблон:Sfn.
Стандарт X.690 описывает следующие правила кодирования структур данных, созданных в соответствии с ASN.1:
- BER (Basic Encoding Rules);
- CER (Canonical Encoding Rules);
- DER (Distinguished Encoding Rules);
История
В 1984 году организация ITU-T создала серию стандартов X.400, в числе которых был и стандарт X.409, который, ввиду активного использования, в 1988 году ITU-T совместно с ISO и IEC выделили в два отдельных стандарта: X.208, описывающий ASN.1, и X.209, в котором описывались правила BER. В 1994 году ASN.1 был переработан и серия стандартов X.208 перешла в серию X.680, а стандарту X.209 на смену пришёл стандарт X.690[1].
Basic Encoding Rules
Базовые правила кодирования или BER – набор правил, объясняющий, как представить любую структуру данных, описанную согласно ASN.1, в виде последовательности восьмибитных октетов[2].
Для того, чтобы различные типы данных можно было описывать схожим образом, в X.690 была определена общая структура блока закодированной информации, состоящая из следующих 3 частей:
- Идентификатор – один или несколько октетов, в которых содержится информация о типе закодированных данных;
- Часть, содержащая информацию о длине блока – один или несколько октетов, в которых содержится информация о длине закодированных данных;
- Часть, содержащая закодированную информацию.
Идентификатор
Формат идентификатора строго фиксированШаблон:Sfn.
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|
Класс | Тип | Тег |
Биты 8 и 7 определяют класс данных
Класс | бит 8 | бит 7 | Описание класса |
---|---|---|---|
Универсальный | 0 | 0 | типы, которые определены только в X.690 и имеют одинаковый смысл во всех приложениях |
Прикладной | 0 | 1 | типы, смысл которых меняется в зависимости от приложения [примечание 1] |
Контекстно-зависимый | 1 | 0 | типы, смысл которых зависит от данного составного типа[примечание 2] |
Частный | 1 | 1 | типы, смысл которых зависит от конкретной организации |
Бит 6 определяет, являются ли данные простыми (как-то INTEGER) или могут содержать в себе другие различные наборы данных (как-то SET). При этом при кодировании в первом случае говорят о примитивном кодировании, а во втором - о конструктивном;
Тип данных | бит 6 |
---|---|
Простой | 0 |
Составной | 1 |
Биты 5 - 1 определяют тег данных.
Тип данных | Тег (десятичный) | Тег (шестнадцатеричный) |
---|---|---|
EOC (End-of-Content) | 0 | 0 |
BOOLEAN | 1 | 1 |
INTEGER | 2 | 2 |
BIT STRING | 3 | 3 |
OCTET STRING | 4 | 4 |
NULL | 5 | 5 |
OBJECT IDENTIFIER | 6 | 6 |
Object Descriptor | 7 | 7 |
EXTERNAL | 8 | 8 |
REAL | 9 | 9 |
ENUMERATED | 10 | A |
EMBEDDED PDV | 11 | B |
UTF8String | 12 | C |
RELATIVE-OID | 13 | D |
(reserved) | 14 | E |
(reserved) | 15 | F |
SEQUENCE и SEQUENCE OF | 16 | 10 |
SET и SET OF | 17 | 11 |
NumericString | 18 | 12 |
PrintableString | 19 | 13 |
T61String | 20 | 14 |
VideotexString | 21 | 15 |
IA5String | 22 | 16 |
UTCTime | 23 | 17 |
GeneralizedTime | 24 | 18 |
GraphicString | 25 | 19 |
VisibleString | 26 | 1A |
GeneralString | 27 | 1B |
UniversalString | 28 | 1C |
CHARACTER STRING | 29 | 1D |
BMPString | 30 | 1E |
(длинная форма) | 31 | 1F |
В случае, если класс данных не определен в ASN.1, то тег может быть больше 30. В таком случае используют несколько октетов для представления идентификатора. При этом биты 5-1 первого октета имеют значение 111112
, а следующие октеты кодируются следующим образом:
- Бит 8 во всех октетах, кроме последнего, равен 1; в последнем октете бит 8 равен 0;
- Биты с 1 по 7 этих октетов содержат биты тега в его двоичном представлении.
Октеты длины закодированных данных
В случае, если длина блока закодированных данных заранее известна, октеты длины кодируются следующим образом:
Если эта длина не превышает 127 октетов (байт), то она просто записывается в соответствующий октет длины. Такая форма представления октетов длины называется короткой (short form).
Пример: длина блока данных L: L = 34 будет закодирована в виде 0010 0010
Если длина блока закодированных данных больше 127 байт, то:
- в биты второго и последующих октетов записывается значение длины блока закодированной информации в её (длины) двоичном представлении в порядке от старшего к младшему (big-endian);
- в первый октет записывается количество дополнительных блоков длины, считая со второго; бит 8 первого октета устанавливается в 1.
Такая форма представления октетов длины называется длинной (long form)
Пример: длина блока данных L: L = 2614 (0000 1010 0011 0110 в двоичном формате) будет закодирована в виде: 82 0A 36 (10000010 00001010 00110110 в двоичном формате)
Если же длина блока закодированных данных на момент кодирования длины неизвестна, то в октет длины записывается значение 0х80
, что указывает на кодирование с неопределенной длиной (indefinite form). В этом случае в конце блока закодированных данных должны стоять октеты 00 00
, явно указывающие на его завершение. Кодирование с неопределённой длиной разрешено только для конструктивных типов данных; два нулевых октета в конце соответствуют ASN.1-типу данных с тегом 0 (End-of-contents) и длиной 0.
Кодирование структур различных типов
Кодирование различных типов данных детально описано в тексте стандартаШаблон:Ref-en.
Неоднозначность кодирования
В зависимости от структуры и преследуемых при кодировании целей кодирование одних и тех же данных может существенно различатьсяШаблон:SfnШаблон:Sfn.
Так, BER-кодирование значения TRUE типа BOOLEAN может иметь как вид:
01 01 01
так и вид:
01 01 0F
Результат кодирования типа SET может быть различным в зависимости от того, в каком порядке мы кодируем "вложенные" типы данных:
если
set::= SET { int, float} int::= INTEGER float::= REAL
то для
set{-128, 0.15625}
результат кодирования по правилам BER может быть таким:
31 08 02 01 80 09 03 80 FB 05;
и таким:
31 08 09 03 80 FB 05 02 01 80.
В зависимости от того, примитивное или конструктивное кодирование используется, его результат может также различаться. Так, для значения "Test User 1" типа STRING при примитивном кодировании результат будет иметь вид:
13 0B 54 65 73 74 20 55 73 65 72 20 31
при конструктивном:
33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31
DER и CER
Для однозначного кодирования данных используются правила кодирования DER и CER.
Distinguished Encoding Rules
Особые правила кодирования или DER совпадают с BER с учётом выполнения следующих ограничений:
- Для кодирования данных с известной длиной количество октетов длины должно быть наименьшим;
- Кодирование простых типов данных (в том числе STRING, OCTET STRING и BIT ARRAY) всегда примитивное;
- Для типа SET кодирование вложенных типов должно происходить в порядке следования их тегов (согласно ASN.1).
Canonical Encoding Rules
Канонические правила кодирования или CER совпадают с BER с учётом выполнения следующих ограничений:
- Для составных типов данных должно применяться кодирование с неизвестной длиной;
- Для примитивного кодирования количество октетов длины должно быть наименьшим;
- Для типа SET кодирование вложенных типов должно происходить в порядке следования их тегов (согласно ASN.1).
Сравнение BER, DER и CER
BER предлагает пользователю различные пути для кодирования одних и тех же данных, причём предполагается, что система, которая поддерживает стандарты ASN.1, может корректно их декодировать вне зависимости от представления, в то время как DER и CER поддерживают только конкретный вариант кодирования для каждого типаШаблон:Sfn. Это различие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определенный формат данных, то системе требуется для этого намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BER[3].
Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с не известной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных, а CER - для большихШаблон:Sfn.
Сравнение X.690 и X.209
Общее
Переход от стандартов X.208 и X.209 к X.680 - X.683 и X.690 был обусловлен необходимостью исправления ошибок, выявленных в процессе использования протоколов, работающих с ASN.1[4]. В связи с этим при переходе от одних стандартов к другим была обеспечена их полная совместимость. В частности, при получении одним пользователем от другого структуры, закодированной по правилам BER, зачастую невозможно с определенностью сказать, какой из стандартов тот использовал при кодировании[5].
Различия
- Для новых типов данных (как-то RELATIVE-OID) добавлены правила кодирования;
- Для типов данных, правила описания которых изменились, изменились и правила кодирования (но результат кодирования одной и той же структуры данных одинаков как при использовании X.209, так и при использовании X.690)[5].
Применение
BER, DER и CER активно применяют в различных протоколах передачи данных и в криптографических протоколах, как-то:
- SNMP и LDAP[6];
- PKCS #7 (для кодирования сообщений)[7];
- X.509 (для хранения сертификатов)[8];
- EMV (для кодирования данных хранимых на карте).
- Kerberos
Другие стандарты кодирования
Несмотря на простоту в кодировании данныхШаблон:Sfn, многие считают BER, DER и CER неэффективными по сравнению с другими правилами кодирования, так как, во-первых, размер результата кодирования данных при помощи BER зачастую получается больше, чем при использовании его альтернатив, а во-вторых, само кодирование занимает несколько больше времени[3].
Такими схемами кодирования данных, разработанными для улучшения BERШаблон:Sfn, являются Packed Encoding Rules (PER), XML Encoding Rules (XER) и ASN.1 SOAP, описанные соответственно в ITU-T X.691, X.693 и в X.892.
См. также
Примечания
Литература
Источники
Ссылки
- ↑ Шаблон:Cite web
- ↑ Шаблон:СтатьяШаблон:Недоступная ссылка
- ↑ 3,0 3,1 Lin Huai-An Estimation of the Optimal Performance of ASN.1/BER Transfer Syntax. — ACM Computer Communication Review, July 93, С. 45 - 58.
- ↑ Шаблон:Cite web
- ↑ 5,0 5,1 Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web