X.690 — один из стандартов ASN.1, совместно разработанных Международной организацией по стандартизации (ИСО), Международной электротехнической комиссией (МЭК) и Сектором стандартизации электросвязи Международного союза электросвязи (МСЭ-Т) для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей восьмибитных байтов (октетов). Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурами[1].
Стандарт X.690 описывает следующие правила кодирования структур данных, созданных в соответствии с ASN.1:
- BER (от англ. Basic Encoding Rules — «базовые правила кодирования»);
- CER (от англ. Canonical Encoding Rules — «канонические правила кодирования»);
- DER (от англ. Distinguished Encoding Rules — «особые правила кодирования»).
История
В 1984 году Международный консультативный комитет по телеграфии и телефонии (МККТТ) (ныне — МСЭ-Т) разработал серию стандартов X.400, в числе которых был и стандарт X.409, который (ввиду активного использования) в 1988 году был выделен МККТТ совместно с ИСО и МЭК в два отдельных стандарта: X.208, описывающий ASN.1, и X.209, описывающий правила BER. В 1994 году ASN.1 был переработан, и серия стандартов X.208 перешла в серию X.680, а на смену стандарту X.209 пришёл X.690[2].
Basic Encoding Rules
Базовые правила кодирования или BER — набор правил, объясняющий, как представить любую структуру данных, описанную согласно ASN.1, в виде последовательности октетов[3].
Для того, чтобы различные типы данных можно было описывать схожим образом, в X.690 была определена общая структура блока закодированных данных, состоящая из следующих трёх частей:
- Идентификатор — один или несколько октетов, в которых содержится информация о типе закодированных данных;
- Часть, содержащая информацию о длине блока — один или несколько октетов, в которых содержится информация о длине закодированных данных;
- Часть, содержащая закодированные данные.
Идентификатор
Формат идентификатора строго фиксирован[4].
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|
Класс | Тип | Тег |
Биты 8 и 7 определяют класс данных.
Класс | Бит 8 | Бит 7 | Описание класса |
---|---|---|---|
Универсальный | 0 | 0 | типы, которые определены только в X.690 и имеют одинаковый смысл во всех приложениях |
Прикладной | 0 | 1 | типы, смысл которых меняется в зависимости от приложения[a] |
Контекстно-зависимый | 1 | 0 | типы, смысл которых зависит от данного составного типа[b] |
Частный | 1 | 1 | типы, смысл которых зависит от конкретной организации |
Бит 6 определяет, являются ли данные простыми (например, INTEGER) или могут содержать в себе другие различные наборы данных (например, SET). При этом при кодировании в первом случае говорят о примитивном кодировании, а во втором — о конструктивном.
Тип данных | Бит 6 |
---|---|
Простой | 0 |
Составной | 1 |
Биты 5—1 определяют тег данных.
Тип данных | Тег | |
---|---|---|
10 с. с. | 16 с. с. | |
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 = 3410 (001000102) будет закодирована в виде: 2216 (001000102)
Если длина блока закодированных данных больше 127 октетов, то:
- в биты второго и последующих октетов записывается значение длины блока закодированных данных в её (длины) двоичном представлении в порядке от старшего к младшему;
- в первый октет записывается количество дополнительных блоков длины, считая со второго; бит 8 первого октета устанавливается в 1.
Такая форма представления октетов длины называется длинной (англ. long form).
Пример: длина блока данных L: L = 261410 (000010102 001101102) будет закодирована в виде: 8216 0A16 3616 (100000102 000010102 001101102)
Если же длина блока закодированных данных на момент кодирования длины неизвестна, то в октет длины записывается значение 0x80
, что указывает на кодирование с неопределённой длиной (англ. indefinite form). В этом случае в конце блока закодированных данных должны стоять октеты 0x00
0x00
, явно указывающие на его завершение. Кодирование с неопределённой длиной разрешено только для конструктивных типов данных; два нулевых октета в конце соответствуют ASN.1-типу данных с тегом 0 (EOC) и длиной 0.
Кодирование структур различных типов
Кодирование различных типов данных детально описано в тексте стандарта[5].
Неоднозначность кодирования
В зависимости от структуры и преследуемых при кодировании целей кодирование одних и тех же данных может существенно различаться[6][7].
Так, 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 поддерживают только конкретный вариант кодирования для каждого типа[7]. Это различие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определённый формат данных, то системе требуется для этого намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BER[8].
Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с неизвестной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных, а CER — для больших[9].
Сравнение X.690 и X.209
Общее
Переход от стандартов X.208 и X.209 к X.680—X.683 и X.690 был обусловлен необходимостью исправления ошибок, выявленных в процессе использования протоколов, работающих с ASN.1[10]. В связи с этим при переходе от одних стандартов к другим была обеспечена их полная совместимость. В частности, при получении одним пользователем от другого структуры, закодированной по правилам BER, зачастую невозможно с определённостью сказать, какой из стандартов тот использовал при кодировании[11].
Различия
- Для новых типов данных (например, RELATIVE-OID) добавлены правила кодирования;
- Для типов данных, правила описания которых изменились, изменились и правила кодирования (но результат кодирования одной и той же структуры данных одинаков как при использовании X.209, так и при использовании X.690)[11].
Применение
BER, DER и CER активно применяют в различных протоколах передачи данных и в криптографических протоколах, например:
- SNMP и LDAP[12];
- PKCS #7 (для кодирования сообщений)[13];
- X.509 (для хранения сертификатов)[14];
- EMV (для кодирования данных хранимых на карте);
- Kerberos.
Другие стандарты кодирования
Несмотря на простоту в кодировании данных[15], многие считают BER, DER и CER неэффективными по сравнению с другими правилами кодирования, так как, во-первых, размер результата кодирования данных при помощи BER зачастую получается больше, чем при использовании его альтернатив, а, во-вторых, само кодирование занимает несколько больше времени[8].
Такими схемами кодирования данных, разработанными для улучшения BER[7], являются Packed Encoding Rules (PER), XML Encoding Rules (XER) и ASN.1 SOAP, описанные, соответственно, в МСЭ-Т X.691, X.693 и в X.892.
См. также
Примечания
Литература
- ↑ Douglas Steedman, E4. Encoding Rules.
- ↑ Introduction to ASN.1 (англ.). ASN.1 Project. Сектор стандартизации электросвязи МСЭ. Дата обращения: 12 декабря 2012. Архивировано 16 декабря 2012 года.
- ↑ Семёнов Ю. А. 4.4.13.2 Нотация ASN.1. (недоступная ссылка)
- ↑ Юрий Строжевский, 2012, Глава 1.
- ↑ ITU-T Rec. X.690, ISO/IEC 8825-1.
- ↑ Bernett et al, 2001, Appendix B.
- ↑ 1 2 3 Douglas Steedman, E.1 What is ASN.1?.
- ↑ 1 2 Lin Huai-An Estimation of the Optimal Performance of ASN.1/BER Transfer Syntax. — ACM Computer Communication Review, July 1993. PP. 45—58.
- ↑ ITU-T Rec. X.690, ISO/IEC 8825-1, Introduction.
- ↑ Tony Bradley. [netsecurity.about.com/cs/windowsxp/a/aa021204.htm Microsoft ASN.1 Vulnerability - What's The Big Deal?] (англ.). About.com Guide (12 февраля 2004). Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- ↑ 1 2 Changing from ASN.1:1988/1990 to ASN.1:2008 (англ.). ASN.1 Project. ITU-T (12 февраля 2004). Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- ↑ Vijay Mukhi, Sonal Kotecha, Arsalan Zaidi, Vinesh Kurup. Basic Encoding Rules (англ.). Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- ↑ B. Kaliski. PKCS #7: Cryptographic Message Syntax - Version 1.5 (англ.) (март 1998). — General overview. Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- ↑ Peter Gutmann. X.509 Style Guide (англ.) (октябрь 2000). — Introduction. Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- ↑ Douglas Steedman, E.4 Encoding Rules.
Источники
- Information technology – ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER) (англ.) (февраль 2002). — Рекомендация МСЭ-Т X.690. Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- Extract from Abstract Syntax Notation One (ASN.1): The Tutorial and Reference by Douglas Steedman (англ.). Technology Appraisals Limited. — Некоторые главы из книги-оригинала. Дата обращения: 12 декабря 2012. Архивировано 25 января 2013 года.
- Строжевский Юрий. ASN.1 простыми словами // Персональный сайт Юрия Строжевского. — 2012.
- Burton S. Kaliski Jr. A Layman's Guide to a Subset of ASN.1, BER, and DER (англ.) // RSA Laboratories : Technical Note. — 1993.
- Steve Burnett, Stephen Paine. RSA Security's official guide to cryptography (англ.). — McGraw-Hill Osborne Media, 2001. — 419 p. — ISBN 007213139X.