Введение

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 году.

Языковая поддержка

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 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 в качестве формата данных протокола. Для получения более подробной информации см. Сравнение форматов сериализации данных.