X.690
X.690 – один из стандартов ASN.1, разработанных совместно организациями ISO, IEC и ITU-T для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей байт. Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурами[1].
Стандарт 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[2].
Basic Encoding Rules
Базовые правила кодирования или BER – набор правил, объясняющий как представить любую структуру данных, описанную согласно ASN.1, в виде последовательности восьмибитных октетов[3].
Для того, чтобы различные типы данных можно было описывать схожим образом, в X.690 была определена общая структура блока закодированной информации, состоящая из следующих 3 частей:
- Идентификатор – один или несколько октетов, в которых содержится информация о типе закодированных данных;
- Часть, содержащая информацию о длине блока – один или несколько октетов, в которых содержится информация о длине закодированных данных;
- Часть, содержащая закодированную информацию.
Идентификатор
Формат идентификатора строго фиксирован[4].
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 байт, то:
- в биты второго и последующих октетов записывается значение длины блока закодированной информации в её (длины) двоичном представлении;
- в первый октет записывается количество дополнительных блоков длины, считая со второго; бит 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.
Кодирование структур различных типов
Кодирование различных типов данных детально описано в тексте стандарта (англ.).
Неоднозначность кодирования
В зависимости от структуры и преследуемых при кодировании целей, кодирование одних и тех же данных может существенно различаться[5][6].
Так, 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 поддерживают только конкретный вариант кодирования для каждого типа[6]. Это отличие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определенный формат данных, то системе требуется для этого намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BER[7].
Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с неизвестной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных, а CER - для больших[8].
Сравнение X.690 и X.209
Общее
Переход от стандартов X.208 и X.209 к X.680 - X.683 и X.690 был обусловлен необходимостью исправления ошибок, выявленных в процессе использования протоколов, работающих с ASN.1[9]. В связи с этим, при переходе от одних стандартов к другим была обеспечена их полная совместимость. В частности, при получении одним пользователем от другого структуры, закодированной по правилам BER, зачастую невозможно с определенностью сказать, какой из стандартов тот использовал при кодировании[10].
Отличия
- Для новых типов данных (как-то RELATIVE-OID) добавлены правила кодирования;
- Для типов данных, правила описания которых изменились, изменились и правила кодирования (но результат кодирования одной и той же структуры данных одинаков как при использовании X.209, так и при использовании X.690)[10].
Применение
BER, DER и CER активно применяют в различных протоколах передачи данных и в криптографических протоколах, как-то:
Другие стандарты кодирования
Несмотря на простоту в кодировании данных[14], многие считают BER, DER и CER неэффективными по сравнению с другими правилами кодирования, так как, во-первых, размер результата кодирования данных при помощи BER зачастую получается больше, чем при использовании его альтернатив, а во-вторых, само кодирование занимает несколько больше времени[7].
Такими схемами кодирования данных, разработанными для улучшения BER[6], являются Packed Encoding Rules (PER), XML Encoding Rules (XER) и ASN.1 SOAP, описанные соответственно в ITU-T X.691, X.693 и в X.892.
См. также
Примечания
- Например, для служб каталогов X.500 типы в двух разных приложениях могут иметь одинаковые тэги, но разный смысл
- Такие тэги используются для того, чтобы провести различие между типами компонентов с одинаковыми базовыми тэгами в контексте данного составного типа
Литература
- Douglas Steedman, E4. Encoding Rules.
- Introduction to ASN.1 (англ.). ASN.1 Project. ITU-T. Дата обращения: 12 декабря 2012.
- Семенов Ю.А. 4.4.13.2 Нотация ASN.1. (недоступная ссылка)
- Юрий Строжевский, 2012, Глава 1.
- Bernett et al, 2001, Appendix B.
- Douglas Steedman, E.1 What is ASN.1?.
- Lin Huai-An Estimation of the Optimal Performance of ASN.1/BER Transfer Syntax. — ACM Computer Communication Review, July 93, С. 45 - 58.
- ITU-T Rec. X.690, ISO/IEC 8825-1, Introduction.
- Tony Bradley. Microsoft ASN.1 Vulnerability - What's The Big Deal? (англ.). About.com Guide (12 февраля 2004). Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- 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 (англ.) (March 1998). — General overview. Дата обращения: 11 декабря 2012. Архивировано 25 января 2013 года.
- Peter Gutmann. X.509 Style Guide (англ.) (October 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 с. — ISBN 007213139X.