X.690 — один из стандартов ASN.1, совместно разработанных Международной организацией по стандартизации (ИСО), Международной электротехнической комиссией (МЭК) и Сектором стандартизации электросвязи Международного союза электросвязи (МСЭ-Т) для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей восьмибитных байтов (октетов). Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурами.
Стандарт X.690 описывает следующие правила кодирования структур данных, созданных в соответствии с ASN.1: BER (от — «базовые правила кодирования»); CER (от — «канонические правила кодирования»); DER (от — «особые правила кодирования»).
История В 1984 году Международный консультативный комитет по телеграфии и телефонии (МККТТ) (ныне — МСЭ-Т) разработал серию стандартов X.400, в числе которых был и стандарт X.409, который (ввиду активного использования) в 1988 году был выделен МККТТ совместно с ИСО и МЭК в два отдельных стандарта: X.208, описывающий ASN.1, и X.209, описывающий правила BER. В 1994 году ASN.1 был переработан, и серия стандартов X.208 перешла в серию X.680, а на смену стандарту X.209 пришёл X.690.
Basic Encoding Rules Базовые правила кодирования или BER — набор правил, объясняющий, как представить любую структуру данных, описанную согласно ASN.1, в виде последовательности октетов.
Для того, чтобы различные типы данных можно было описывать схожим образом, в X.690 была определена общая структура блока закодированных данных, состоящая из следующих трёх частей: Идентификатор — один или несколько октетов, в которых содержится информация о типе закодированных данных; Часть, содержащая информацию о длине блока — один или несколько октетов, в которых содержится информация о длине закодированных данных; Часть, содержащая закодированные данные.
Идентификатор Формат идентификатора строго фиксирован. 8 7 6 5 4 3 2 1 Класс Тип Тег
Биты 8 и 7 определяют класс данных. Класс Бит 8 Бит 7 Описание класса Универсальный 0 0 типы, которые определены только в X.690 и имеют одинаковый смысл во всех приложениях Прикладной 0 1 типы, смысл которых меняется в зависимости от приложения Контекстно-зависимый 1 0 типы, смысл которых зависит от данного составного типа Частный 1 1 типы, смысл которых зависит от конкретной организации
Бит 6 определяет, являются ли данные простыми (например, INTEGER) или могут содержать в себе другие различные наборы данных (например, SET). При этом при кодировании в первом случае говорят о примитивном кодировании, а во втором — о конструктивном. + Тип данных Бит 6 Простой 0 Составной 1
Биты 5—1 определяют тег данных. + Теги, описанные в ASN.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 октетов, то она просто записывается в соответствующий октет длины. Такая форма представления октетов длины называется короткой ().
Пример: длина блока данных L: L = 3410 (001000102) будет закодирована в виде: 2216 (001000102)
Если длина блока закодированных данных больше 127 октетов, то: в биты второго и последующих октетов записывается значение длины блока закодированных данных в её (длины) двоичном представлении в порядке от старшего к младшему; в первый октет записывается количество дополнительных блоков длины, считая со второго; бит 8 первого октета устанавливается в 1.
Такая форма представления октетов длины называется длинной ().
Пример: длина блока данных L: L = 261410 (000010102 001101102) будет закодирована в виде: 8216 0A16 3616 (100000102 000010102 001101102)
Если же длина блока закодированных данных на момент кодирования длины неизвестна, то в октет длины записывается значение , что указывает на кодирование с неопределённой длиной (). В этом случае в конце блока закодированных данных должны стоять октеты , явно указывающие на его завершение. Кодирование с неопределённой длиной разрешено только для конструктивных типов данных; два нулевых октета в конце соответствуют ASN.1-типу данных с тегом 0 (EOC) и длиной 0.
Кодирование структур различных типов Кодирование различных типов данных детально описано в тексте стандарта.
Неоднозначность кодирования В зависимости от структуры и преследуемых при кодировании целей кодирование одних и тех же данных может существенно различаться.
Так, 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 поддерживают только конкретный вариант кодирования для каждого типа. Это различие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определённый формат данных, то системе требуется для этого намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BERLin Huai-An Estimation of the Optimal Performance of ASN.1/BER Transfer Syntax. — ACM Computer Communication Review, July 1993. PP. 45—58..
Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с неизвестной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных, а CER — для больших.
Сравнение X.690 и X.209
Общее Переход от стандартов X.208 и X.209 к X.680—X.683 и X.690 был обусловлен необходимостью исправления ошибок, выявленных в процессе использования протоколов, работающих с ASN.1. В связи с этим при переходе от одних стандартов к другим была обеспечена их полная совместимость. В частности, при получении одним пользователем от другого структуры, закодированной по правилам BER, зачастую невозможно с определённостью сказать, какой из стандартов тот использовал при кодировании.
Различия Для новых типов данных (например, RELATIVE-OID) добавлены правила кодирования; Для типов данных, правила описания которых изменились, изменились и правила кодирования (но результат кодирования одной и той же структуры данных одинаков как при использовании X.209, так и при использовании X.690).
Применение BER, DER и CER активно применяют в различных протоколах передачи данных и в криптографических протоколах, например: SNMP и LDAP; PKCS #7 (для кодирования сообщений); X.509 (для хранения сертификатов); EMV (для кодирования данных хранимых на карте); Kerberos.
Другие стандарты кодирования Несмотря на простоту в кодировании данных, многие считают BER, DER и CER неэффективными по сравнению с другими правилами кодирования, так как, во-первых, размер результата кодирования данных при помощи BER зачастую получается больше, чем при использовании его альтернатив, а, во-вторых, само кодирование занимает несколько больше времени.
Такими схемами кодирования данных, разработанными для улучшения BER, являются Packed Encoding Rules (PER), XML Encoding Rules (XER) и ASN.1 SOAP, описанные, соответственно, в МСЭ-Т X.691, X.693 и в X.892.
См. также ASN.1
Примечания
Литература
Источники
Категория:ASN.1 Категория:Рекомендации ITU-T Категория:Стандарты ISO/IEC