Введение
Abstract Syntax Notation One (ASN.1) — это стандартный язык описания интерфейса (IDL) для определения структур данных, которые могут быть сериализованы и десериализованы кроссплатформенным способом. Он широко используется в телекоммуникациях и компьютерных сетях, и особенно в криптографии. Разработчики протоколов определяют структуры данных в модулях ASN.1, которые обычно являются частью более широкого стандарта, написанного на языке ASN.1. Преимущество заключается в том, что описание кодирования данных в ASN.1 не зависит от конкретного компьютера или языка программирования. Поскольку ASN.1 читаем как человеком, так и машиной, компилятор ASN.1 может компилировать модули в библиотеки кода – кодеки, которые кодируют или декодируют структуры данных. Некоторые компиляторы ASN.1 могут генерировать код для кодирования или декодирования различных кодировок, например, упакованной, BER или XML. ASN.1 является совместным стандартом Международного союза электросвязи – Сектора стандартизации электросвязи (ITU T) в Исследовательской группе 17 ITU T и Международной организации по стандартизации / Международной электротехнической комиссии (ISO/IEC), впервые определённым в 1984 году как часть CCITT X.409:1984. В 1988 году ASN.1 был выделен в отдельный стандарт X.208 в связи с широкой областью применения. Существенно переработанная версия 1995 года охватывается серией X.680. Последняя редакция серии рекомендаций X.680 – издание 6.0, опубликованное в 2021 году.
Abstract Syntax Notation One (ASN.1) is a standard interface description language (IDL) for defining data structures that can be serialized and deserialized in a cross platform way. It is broadly used in telecommunications and computer networking, and especially in cryptography. Protocol developers define data structures in ASN.1 modules, which are generally a section of a broader standards document written in the ASN.1 language. The advantage is that the ASN.1 description of the data encoding is independent of a particular computer or programming language. Because ASN.1 is both human readable and machine readable, an ASN.1 compiler can compile modules into libraries of code, codecs, that decode or encode the data structures. Some ASN.1 compilers can produce code to encode or decode several encodings, e. g. packed, BER or XML. ASN.1 is a joint standard of the International Telecommunication Union Telecommunication Standardization Sector (ITU T) in ITU T Study Group 17 and International Organization for Standardization/International Electrotechnical Commission (ISO/IEC), originally defined in 1984 as part of CCITT X.409:1984. In 1988, ASN.1 moved to its own standard, X.208, due to wide applicability. The substantially revised 1995 version is covered by the X.680 series. The latest revision of the X.680 series of recommendations is the 6.0 Edition, published in 2021.
Языковая поддержка
ASN.1 — это нотация для объявления типов данных. Он не определяет, как работать с переменными этого типа. Операции с переменными определяются в других языках, таких как SDL (язык спецификаций и описаний) для исполнимого моделирования или TTCN 3 (нотация тестирования и контроля испытаний) для тестирования на соответствие стандартам. Оба этих языка изначально поддерживают объявления ASN.1. Можно импортировать модуль ASN.1 и объявить переменную любого из типов ASN.1, определенных в этом модуле.
Приложения
ASN.1 используется для определения большого количества протоколов. Его наиболее широкое применение сохраняется в телекоммуникациях, криптографии и биометрии. + Протоколы, использующие спецификацию протокола ASN.1, указанные или общепринятые правила кодирования: Interledger Protocol ILPV4 Спецификация Правила кодирования октетов NTCIP 1103 Протоколы управления транспортом NTCIP 1103 Правила кодирования октетов Управление трафиком, транспортом и инфраструктурой Службы каталогов X.500 Серия рекомендаций ITU X.500 Основные правила кодирования, правила кодирования с разграничением LDAP, TLS (Сертификаты X.509), Аутентификация Протокол доступа к легковесным каталогам (LDAP) Основные правила кодирования Стандарты криптографии PKCS Стандарты криптографии PKCS Основные правила кодирования и правила кодирования с разграничением Асимметричные ключи, пакеты сертификатов Обработка сообщений X.400 Серия рекомендаций ITU X.400 Ранний конкурент электронной почты EMV Публикации EMVCo Платежные карты T.120 Мультимедийные конференции Серия рекомендаций ITU T.120 Основные правила кодирования, правила кодирования с упаковкой Удаленный рабочий стол Microsoft (RDP) Простой протокол управления сетью (SNMP) Основные правила кодирования Управление и мониторинг сетей и компьютеров, особенно характеристики, касающиеся производительности и надежности Протокол общего управления информацией (CMIP) Рекомендация ITU X.711 Конкурент SNMP, но более мощный и менее популярный Сигнализация № 7 (SS7) Серия рекомендаций ITU Q.700 Управление телефонными соединениями по общедоступной коммутируемой телефонной сети (PSTN) Мультимедийные протоколы ITU H Серия рекомендаций ITU H.200, H.300 и H.400 Голосовая связь по IP (VOIP) Протокол взаимодействия BioAPI (BIP) ISO/IEC 24708:2008 Общий формат обмена биометрическими данными (CBEFF) NIST IR 6529 A Основные правила кодирования Контексты аутентификации для биометрии (ACBio) ISO/IEC 24761:2019 Приложения для компьютерных телекоммуникаций (CSTA) Основные правила кодирования Специальные короткодействующие коммуникации (DSRC) SAE J2735 Правила кодирования с упаковкой Коммуникация транспортных средств IEEE 802.11p (IEEE WAVE) IEEE 1609.2 Коммуникация транспортных средств Интеллектуальные транспортные системы (ETSI ITS) ETSI EN 302 637 2 (CAM) ETSI EN 302 637 3 (DENM) Правила кодирования с упаковкой без выравнивания Коммуникация транспортных средств Глобальная система мобильной связи (GSM) 2G Коммуникации мобильных телефонов Общая пакетная радиосвязь (GPRS) / Улучшенные скорости передачи данных для эволюции GSM (EDGE) 2.5G Коммуникации мобильных телефонов Универсальная мобильная телекоммуникационная система (UMTS) 3G Коммуникации мобильных телефонов Долгосрочная эволюция (LTE) 4G Коммуникации мобильных телефонов 5G 5G Коммуникации мобильных телефонов Протокол общего оповещения (CAP) Правила кодирования XML Обмен информацией об оповещениях, такой как Amber Alerts Связь данных между контроллером и пилотом (CPDLC) Авиационная связь Службы расширения космической связи (SLE) Коммуникации космических систем Спецификация производственных сообщений (MMS) ISO 9506 1:2003 Передача, доступ и управление производственными файлами (FTAM) Ранний и более мощный конкурент протокола передачи файлов, но редко используемый в настоящее время. Протокол элемента службы удаленных операций (ROSE) Рекомендации ITU X.880, X.881 и X.882 Ранняя форма удаленного вызова процедур Элемент службы управления ассоциацией (ACSE) Рекомендация ITU X.227 Протокол сетей автоматизации и управления зданиями (BACnet) ASHRAE 135 2020 Правила кодирования BACnet Автоматизация и управление зданиями, например, с пожарными сигнализациями, лифтами, системами HVAC и т. Д. Kerberos Основные правила кодирования Безопасная аутентификация WiMAX 2 Сети широкополосного доступа Интеллектуальная сеть Серия рекомендаций ITU Q.1200 Телекоммуникации и компьютерные сети X2AP Основные правила кодирования с выровненной упаковкой Законный перехват (LI) Интерфейс передачи ETSI TS 102 232 1 Законный перехват
Кодировки
ASN.1 тесно связано с набором правил кодирования, которые определяют, как представить структуру данных в виде последовательности байтов. Стандартные правила кодирования ASN.1 включают в себя: + ASN.1 Правила кодирования rowspan=2 Идентификатор объекта Дескриптор объекта Значение rowspan=2 rowspan=2 rowspan=2 rowspan=2 rowspan=2 rowspan=2 Описание Пунктирный IRI (интернационализированный идентификатор ресурса) 2.1.1 /ASN.1/Базовое кодирование Базовое кодирование одного типа ASN.1 ITU X.690 Октет ✔ ✔ Первые определенные правила кодирования. Кодируют элементы в виде последовательностей тег-длина-значение (TLV). Обычно предоставляют несколько вариантов кодирования значений данных. Это одно из самых гибких правил кодирования. 2.1.2.1 /ASN.1/BERDerived/DistinguishedEncoding Различающее кодирование одного типа ASN.1 ITU X.690 Октет ✔ ✔ Ограниченное подмножество основных правил кодирования (BER). Обычно используется для данных с цифровой подписью, поскольку DER допускает меньше вариантов кодирования, а закодированные значения DER с большей вероятностью будут повторно закодированы в одни и те же байты. Таким образом, цифровые подписи, полученные из данного абстрактного значения, будут одинаковыми во всех реализациях, а цифровые подписи, полученные из закодированных данных DER, будут менее подвержены атакам на основе коллизий. 2.1.2.0 /ASN.1/BERDerived/CanonicalEncoding Каноническое кодирование одного типа ASN.1 ITU X.690 Октет ✔ ✔ Ограниченное подмножество основных правил кодирования (BER). Использует почти те же ограничения, что и различающие правила кодирования (DER), но CER предписывают, что многие большие значения (особенно строки) должны быть "разбиты" на отдельные элементы подстроки при достижении 1000 байт или 1000 символов (в зависимости от типа данных). 2.1.3.0.0 /ASN.1/PackedEncoding/Basic/Aligned Упакованное кодирование одного типа ASN.1 (базовое выровненное) ITU X.691 Бит ✔ Кодирует значения по битам, но если закодированные биты не делятся на восемь, добавляются заполняющие биты до тех пор, пока целое число октетов не закодирует значение. Способно создавать очень компактные кодировки, но за счет сложности, а PER сильно зависят от ограничений, налагаемых на типы данных. 2.1.5.0 /ASN.1/XMLEncoding/Basic Базовое XML-кодирование одного типа ASN.1 ITU X.693 Символ ✔ ✔ ✔ Кодирует данные ASN.1 в формате XML. 2.1.6.0 Базовое OER-кодирование одного типа ASN.1 ITU X.696 Октет ✔ Набор правил кодирования, который кодирует значения в октетах, но не кодирует теги или определители длины, как основные правила кодирования (BER). Значения данных, закодированные с использованием правил кодирования октетов, часто похожи на те, что встречаются в протоколах "на основе записей". Правила кодирования октетов (OER) были разработаны для простоты реализации и создания кодировок, более компактных, чем создаваемые основными правилами кодирования (BER). Помимо снижения усилий по разработке кодировщиков/декодировщиков, использование OER может уменьшить использование полосы пропускания (хотя и не так сильно, как упакованные правила кодирования), сэкономить циклы процессора и снизить задержку кодирования/декодирования. ITU X.697 Символ ✔ ✔ ✔ Кодирует данные ASN.1 в формате JSON. 1.2.36.79672281.0.0 Общие правила кодирования строк (GSER) Символ ✔ Неполная спецификация правил кодирования, которые создают читаемые человеком значения. Цель GSER - представление закодированных данных пользователю или ввод данных от пользователя в очень простом формате. GSER изначально был разработан для протокола Lightweight Directory Access Protocol (LDAP) и редко используется за его пределами. Использование GSER в реальных протоколах не рекомендуется, поскольку не все кодировки строк символов, поддерживаемые ASN.1, могут быть воспроизведены в нем. ASHRAE 135 Октет ✔ ✔ ✔ Кодирует элементы в виде последовательностей тег-длина-значение (TLV), как в основных правилах кодирования (BER). France Telecom R&D Internal Document Октет ✔ ✔ Используется в основном в телекоммуникационных протоколах, таких как GSM и SS7. Разработан для создания идентичного кодирования из ASN.1, которое могли бы создать ранее существовавшие протоколы, не определенные в ASN.1. Внутренний документ INRIA. Memory Word ✔ Происходит из внутреннего документа, подготовленного INRIA, с подробным описанием "Синтаксиса Flat Tree Light Weight" (FTLWS). Отменено в 1997 году из-за превосходной производительности упакованных правил кодирования (PER). Опционально передача в формате Big Endian или Little Endian, а также 8-битные, 16-битные и 32-битные слова памяти. (Следовательно, существует шесть вариантов, поскольку есть шесть комбинаций этих опций.) Бит Предложено в 1980-х годах. Предназначено для максимальной компактности, как упакованные правила кодирования (PER). Бит Неполная спецификация правил кодирования, разработанная NEMA. Она неполна, поскольку не может кодировать и декодировать все типы данных ASN.1. Компактно, как упакованные правила кодирования (PER). "Coding Rules for High Speed Networks" Определение этих правил кодирования было побочным продуктом работы INRIA над "Синтаксисом Flat Tree Light Weight" (FTLWS).
+ ASN.1 Encoding Rules rowspan=2 Object identifier Object descriptor value rowspan=2 rowspan=2 rowspan=2 rowspan=2 rowspan=2 Description Dotted IRI (Internationalized resource identifier) 2.1.1 /ASN.1/Basic Encoding Basic Encoding of a single ASN.1 type ITU X.690 Octet ✔ ✔ The first specified encoding rules. Encodes elements as tag length value (TLV) sequences. Typically provides several options as to how data values are to be encoded. This is one of the most flexible encoding rules. 2.1.2.1 /ASN.1/BERDerived/DistinguishedEncoding Distinguished encoding of a single ASN.1 type ITU X.690 Octet ✔ ✔ A restricted subset of the Basic Encoding Rules (BER). Typically used for things that are digitally signed because, since the DER allow for fewer options for encoding, and because DER encoded values are more likely to be re encoded on the exact same bytes, digital signatures produced by a given abstract value will be the same across implementations and digital signatures produced over DER encoded data will be less susceptible to collision based attacks. 2.1.2.0 /ASN.1/BERDerived/CanonicalEncoding Canonical encoding of a single ASN.1 type ITU X.690 Octet ✔ ✔ A restricted subset of the Basic Encoding Rules (BER). Employs almost all of the same restrictions as the Distinguished Encoding Rules (DER), but the noteworthy difference is that the CER specify that many large values (especially strings) are to be "chopped up" into individual substring elements at the 1000 byte or 1000 character mark (depending on the data type). 2.1.3.0.0 /ASN.1/PackedEncoding/Basic/Aligned Packed encoding of a single ASN.1 type (basic aligned) ITU X.691 Bit ✔ Encodes values on bits, but if the bits encoded are not evenly divisible by eight, padding bits are added until an integral number of octets encode the value. Capable of producing very compact encodings, but at the expense of complexity, and the PER are highly dependent upon constraints placed on data types. 2.1.5.0 /ASN.1/XMLEncoding/Basic Basic XML encoding of a single ASN.1 type ITU X.693 Character ✔ ✔ ✔ Encodes ASN.1 data as XML. 2.1.6.0 Basic OER encoding of a single ASN.1 type ITU X.696 Octet ✔ A set of encoding rules that encodes values on octets, but does not encode tags or length determinants like the Basic Encoding Rules (BER). Data values encoded using the Octet Encoding Rules often look like those found in "record based" protocols. The Octet Encoding Rules (OER) were designed to be easy to implement and to produce encodings more compact than those produced by the Basic Encoding Rules (BER). In addition to reducing the effort of developing encoder/decoders, the use of OER can decrease bandwidth utilization (though not as much as the Packed Encoding Rules), save CPU cycles, and lower encoding/decoding latency. ITU X.697 Character ✔ ✔ ✔ Encodes ASN.1 data as JSON. 1.2.36.79672281.0.0 Generic String Encoding Rules (GSER) Character ✔ An incomplete specification for encoding rules that produce human readable values. The purpose of GSER is to represent encoded data to the user or input data from the user, in a very straightforward format. GSER was originally designed for the Lightweight Directory Access Protocol (LDAP) and is rarely used outside of it. The use of GSER in actual protocols is discouraged since not all character string encodings supported by ASN.1 can be reproduced in it. ASHRAE 135 Octet ✔ ✔ ✔ Encodes elements as tag length value (TLV) sequences like the Basic Encoding Rules (BER). France Telecom R&D Internal Document Octet ✔ ✔ Used primarily in telecommunications related protocols, such as GSM and SS7. Designed to produce an identical encoding from ASN.1 that previously existing protocols not specified in ASN.1 would produce. Internal document by INRIA. Memory Word ✔ Originates from an internal document produced by INRIA detailing the "Flat Tree Light Weight Syntax" (FTLWS). Abandoned in 1997 due to the superior performance of the Packed Encoding Rules (PER). Optionally Big Endian or Little Endian transmission as well as 8 bit, 16 bit, and 32 bit memory words. (Therefore, there are six variants, since there are six combinations of those options.) Bit Proposed in the 1980s. Meant to be as compact as possible, like the Packed Encoding Rules (PER). Bit An incomplete encoding rule specification produced by NEMA. It is incomplete because it cannot encode and decode all ASN.1 data types. Compact like the Packed Encoding Rules (PER). "Coding Rules for High Speed Networks" Definition of these encoding rules were a byproduct of INRIA's work on the Flat Tree Light Weight Syntax (FTLWS).
Кодирование контрольной нотации
Рекомендации ASN.1 предоставляют ряд предопределенных правил кодирования. Если ни одно из существующих правил кодирования не является подходящим, Encoding Control Notation (ECN) позволяет пользователю определить собственные пользовательские правила кодирования.
Отношение к кодированию почты с повышенной конфиденциальностью (PEM)
Кодирование PEM не имеет никакого отношения к ASN.1 и его кодировщикам, однако данные ASN.1, которые часто представлены в бинарном формате, часто кодируются в PEM для передачи в виде текстовых данных, например, через SMTP-ретрансляторы или буфер обмена.
Сравнение с аналогичными схемами
ASN.1 аналогичен по назначению и применению протоколам буферов Google и Apache Thrift, которые также являются языками описания интерфейсов для сериализации данных на разных платформах. Как и эти языки, он имеет схему (в ASN.1 она называется "модулем") и набор кодировок, обычно кодировок типа "длина-значение". В отличие от них, ASN.1 не предоставляет единую и удобную в использовании реализацию с открытым исходным кодом и публикуется как спецификация, которую должны реализовать сторонние поставщики. Однако ASN.1, определенный в 1984 году, предшествует им на много лет. Он также включает в себя более широкий спектр базовых типов данных, некоторые из которых устарели, и имеет больше возможностей для расширения. Одно сообщение ASN.1 может включать данные из нескольких модулей, определенных в нескольких стандартах, даже стандартов, разработанных с разницей в годы. ASN.1 также включает встроенную поддержку ограничений на значения и размеры. Например, модуль может указать целочисленное поле, которое должно находиться в диапазоне от 0 до 100. Длина последовательности значений (массива) также может быть указана как фиксированная длина или диапазон допустимых длин. Ограничения также могут быть определены как логические комбинации наборов базовых ограничений. Значения, используемые в качестве ограничений, могут быть либо литералами, используемыми в спецификации PDU, либо значениями ASN.1, указанными в другом месте файла схемы. Некоторые инструменты ASN.1 сделают эти значения ASN.1 доступными для программистов в сгенерированном исходном коде. Используемые в качестве констант для протокола, разработчики могут использовать их в логической реализации протокола. Таким образом, все PDU и протокольные константы могут быть определены в схеме, и все реализации протокола на любом поддерживаемом языке используют эти значения. Это позволяет избежать необходимости разработчикам вручную кодировать протокольные константы в исходном коде их реализации. Это значительно облегчает разработку протокола: протокольные константы можно изменить в схеме ASN.1, и все реализации обновляются путем перекомпиляции, что способствует быстрому и низкорискованному циклу разработки. Если инструменты ASN.1 правильно реализуют проверку ограничений в сгенерированном исходном коде, это автоматически проверяет данные протокола во время работы программы. Обычно инструменты ASN.1 включают проверку ограничений в генерируемые процедуры сериализации/десериализации, выдавая ошибки или исключения при обнаружении данных за пределами допустимого диапазона. Реализация всех аспектов ограничений ASN.1 в компиляторе ASN.1 является сложной задачей. Не все инструменты поддерживают полный спектр возможных выражений ограничений. XML schema и JSON schema поддерживают схожие концепции ограничений. Поддержка ограничений в различных инструментах различается. Компилятор xsd.exe от Microsoft игнорирует их. ASN.1 визуально похож на форму Augmented Backus Naur (ABNF), которая используется для определения многих интернет-протоколов, таких как HTTP и SMTP. Однако на практике они существенно отличаются: ASN.1 определяет структуру данных, которую можно кодировать различными способами (например, JSON, XML, двоичный код). ABNF, с другой стороны, определяет кодирование ("синтаксис") одновременно с определением структуры данных ("семантики"). ABNF чаще используется для определения текстовых, удобочитаемых человеком протоколов и обычно не используется для определения кодировок типа "длина-значение". Многие языки программирования определяют специфичные для языка форматы сериализации. Например, модуль "pickle" в Python и модуль "Marshal" в Ruby. Эти форматы обычно специфичны для языка. Они также не требуют схемы, что облегчает их использование в ситуациях ad hoc хранения, но делает их неподходящими для протоколов связи. JSON и XML также не требуют схемы, что делает их простыми в использовании. Они также являются кроссплатформенными стандартами, широко популярными для протоколов связи, особенно в сочетании с JSON schema или XML schema. Некоторые инструменты ASN.1 способны переводить между ASN.1 и XML schema (XSD). Перевод стандартизирован ITU. Это позволяет определить протокол в ASN.1 и автоматически в XSD. Таким образом, возможно (хотя, возможно, не рекомендуется) иметь в проекте схему XSD, компилируемую инструментами ASN.1, производящую исходный код, который сериализует объекты в/из JSON wireformat. Более практичное применение — разрешить другим подпроектам использовать схему XSD вместо схемы ASN.1, возможно, в соответствии с доступностью инструментов для языка, выбранного подпроектом, при использовании XER в качестве формата данных протокола. Для получения более подробной информации см. Сравнение форматов сериализации данных.