Открыть сервис

Формат ASN.1

ASN.1 (Abstract Syntax Notation One, Абстрактная синтаксическая нотация версии один) — это стандартизированный язык описания структур данных и правил их сериализации (кодирования) для передачи по сетям связи или хранения. Он предназначен для обеспечения аппаратной и программной независимости представления информации, позволяя описывать сложные типы данных (целые числа, строки, последовательности, множества, выбор из альтернатив) вне зависимости от конкретной вычислительной платформы или языка программирования. ASN.1 является международным стандартом: ITU-T X.680 (описание нотации) и X.690 (правила кодирования).

История

Разработка ASN.1 началась в 1980-х годах в рамках деятельности Международного союза электросвязи (ITU-T) и Международной организации по стандартизации (ISO). Основной целью было создание универсального формата для обмена данными в гетерогенных компьютерных сетях, где машины могли иметь разную разрядность, порядок байтов (endianness) и способы представления чисел. Первая версия стандарта была опубликована в 1984 году как часть рекомендаций X.409 для систем электронной почты X.400. Впоследствии нотация была выделена в отдельный стандарт X.208 (1988 год), а затем переработана в современную версию X.680 (1994 год).

ASN.1 получил широкое распространение в телекоммуникационных протоколах (GSM, UMTS, LTE), в системах управления сетями (SNMP), в криптографических приложениях (сертификаты X.509, подписи PKCS#7, криптографические сообщения CMS) и в протоколах аутентификации (Kerberos, LDAP). В 1990-х годах, с развитием интернета, появились альтернативные форматы (XML, JSON, Protocol Buffers), однако ASN.1 остаётся востребованным в областях, требующих высокой компактности, строгой типизации и определённых правил кодирования, особенно в телекоммуникациях и криптографии.

Основные понятия

Типы данных

ASN.1 определяет набор встроенных (примитивных) типов, а также позволяет создавать пользовательские (конструируемые) типы. Классификация включает:

  • Примитивные типы: INTEGER (целое число произвольной точности), BOOLEAN (логическое значение), REAL (вещественное число), OCTET STRING (последовательность байтов), BIT STRING (последовательность битов), OBJECT IDENTIFIER (идентификатор объекта — уникальный числовой код, например, для алгоритмов шифрования), UTF8String, IA5String, PrintableString (строки в разных кодировках), UTCTime, GeneralizedTime (временные метки).
  • Конструируемые типы: SEQUENCE (упорядоченная последовательность элементов разных типов, аналог структуры в C), SET (неупорядоченное множество элементов разных типов), SEQUENCE OF (список однотипных элементов), SET OF (множество однотипных элементов), CHOICE (выбор одного из нескольких вариантов), ENUMERATED (перечисление именованных целочисленных констант).
  • Типы-обёртки: IMPLICIT (изменение тега без дополнительной маркировки), EXPLICIT (добавление внешнего тега).

Модули и импорты

Спецификации ASN.1 организуются в модули — именованные блоки, содержащие определения типов и значений. Модули могут импортировать типы из других модулей, что позволяет создавать иерархические и переиспользуемые описания. Пример заголовка модуля:

`` MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN -- определения типов END ``

Тегирование

Каждый тип данных в ASN.1 имеет уникальный тег (метку), который используется при кодировании для идентификации типа. Теги бывают:

  • Универсальные (universal) — зарезервированы для встроенных типов (например, тег 2 для INTEGER, тег 16 для SEQUENCE).
  • Контекстно-зависимые (context-specific) — определяются в рамках конкретного CHOICE или SEQUENCE.
  • Частные (private) — для специфических нужд организаций.
  • Прикладные (application-wide) — для протокольных типов.

При использовании AUTOMATIC TAGS компилятор автоматически назначает контекстно-зависимые теги для всех полей SEQUENCE и SET, что упрощает написание спецификаций.

Правила кодирования (Encoding Rules)

ASN.1 не определяет способ представления данных в байтах — это делают отдельные стандарты, называемые правилами кодирования. Наиболее распространённые:

BER (Basic Encoding Rules — базовые правила кодирования)

Стандарт ITU-T X.690. Каждое значение кодируется по схеме TLV (Tag — Length — Value):

  • Tag — один или несколько байтов, идентифицирующих тип.
  • Length — один или несколько байтов, указывающих длину значения (в байтах). Может быть фиксированной или неопределённой (для конструируемых типов).
  • Value — собственно данные.

BER является самодокументируемым форматом: декодер может разобрать сообщение, зная только правила кодирования, без предварительного знания схемы ASN.1. Однако BER имеет избыточность (например, для целого числа 0 может потребоваться 3 байта: тег, длина, значение).

DER (Distinguished Encoding Rules — отличительные правила кодирования)

Подмножество BER, которое налагает дополнительные ограничения для обеспечения единственности кодирования:

  • Длина всегда фиксированная (неопределённая длина запрещена).
  • Для BOOLEAN используется только один байт значения (0xFF для TRUE, 0x00 для FALSE).
  • Для BIT STRING и OCTET STRING используется минимально возможная длина.
  • Порядок элементов в SET должен быть отсортирован по тегам.

DER широко применяется в криптографии, где требуется однозначное представление данных для вычисления цифровых подписей (например, в сертификатах X.509).

CER (Canonical Encoding Rules — канонические правила кодирования)

Аналогичен DER, но допускает неопределённую длину для конструируемых типов. Используется реже, в основном для потоковой передачи.

PER (Packed Encoding Rules — упакованные правила кодирования)

Стандарт ITU-T X.691. Ориентирован на максимальную компактность. PER не использует теги и явную длину — вместо этого кодирование основывается на знании схемы (на стороне отправителя и получателя). Размер сообщения может быть в 2–10 раз меньше, чем при BER. PER бывает:

  • ALIGNED PER — значения выравниваются на границы байтов.
  • UNALIGNED PER — биты упаковываются без выравнивания, что даёт ещё большую экономию, но усложняет декодирование.

PER используется в протоколах с ограниченной пропускной способностью (GSM, UMTS, LTE, ZigBee).

XER (XML Encoding Rules — правила кодирования в XML)

Стандарт ITU-T X.693. Представляет данные ASN.1 в виде XML-документа. Позволяет использовать текстовые инструменты (XSLT, XPath) для обработки. Применяется для совместимости с веб-сервисами и системами, где XML является основным форматом.

OER (Octet Encoding Rules — октетные правила кодирования)

Стандарт ITU-T X.696. Промежуточный вариант между BER и PER: использует фиксированную длину полей, но без тегов. Обеспечивает быстрое кодирование/декодирование и умеренную компактность.

Применение

Телекоммуникации

  • GSM/UMTS/LTE/5G: все сообщения протоколов управления (RRC, NAS, MM) описываются на ASN.1 и кодируются PER. Это позволяет уместить сигнальные сообщения в минимальное количество бит.
  • SNMP (Simple Network Management Protocol): данные управляющей информации (MIB) описываются с помощью ASN.1, а передаются в BER-кодировании.
  • LDAP (Lightweight Directory Access Protocol): запросы и ответы кодируются с помощью BER.

Криптография и безопасность

  • Сертификаты X.509: структура сертификата (версия, серийный номер, издатель, владелец, открытый ключ, подпись) описывается на ASN.1 и кодируется DER. Это обеспечивает однозначность при проверке подписи.
  • PKCS#7 / CMS (Cryptographic Message Syntax): формат зашифрованных и подписанных сообщений (например, в S/MIME).
  • Kerberos: билеты и аутентификационные сообщения используют ASN.1 (DER).
  • Электронная подпись (ГОСТ Р 34.10-2012): в российских стандартах криптографической защиты информации ASN.1 применяется для описания ключей и подписей.

Управление сетями

  • CMIP (Common Management Information Protocol): протокол управления сетями OSI, использующий ASN.1.
  • CORBA (Common Object Request Broker Architecture): интерфейсы и типы данных описываются с помощью IDL, который может быть отображён на ASN.1.

Авиация и транспорт

  • AIDC (ATS Interfacility Data Communications): протокол обмена данными между диспетчерскими центрами в гражданской авиации использует ASN.1 (PER).
  • IETF (Internet Engineering Task Force): многие протоколы (например, EAP, RADIUS, Diameter) используют ASN.1 для описания атрибутов.

Инструменты и компиляторы

Для работы с ASN.1 используются компиляторы, которые на основе текстовой спецификации генерируют код на языках программирования (C, C++, Java, Python, Go, Rust) для кодирования/декодирования данных. Наиболее известные:

  • ASN1C (Objective Systems) — коммерческий компилятор с поддержкой BER/DER/PER/XER.
  • asn1c (Lev Walkin) — открытый компилятор для C, поддерживающий BER/DER/PER/XER.
  • pyasn1 (Python) — библиотека для работы с ASN.1, поддерживающая BER/DER.
  • JACOB (Java ASN.1 Compiler) — компилятор для Java.
  • asn1tools (Rust) — библиотека для кодирования/декодирования.

Критика и ограничения

  • Сложность: ASN.1 имеет избыточную нотацию с множеством опций (теги, имплицитные/эксплицитные типы, автоматические теги), что затрудняет изучение и отладку.
  • Избыточность BER: при использовании BER размер сообщения может быть в 2–3 раза больше, чем у бинарных форматов с фиксированной схемой (например, Protocol Buffers).
  • Отсутствие поддержки в веб-среде: ASN.1 не является нативным форматом для браузеров или JavaScript, что ограничивает его применение в веб-приложениях (хотя существуют полифиллы, например, asn1.js).
  • Конкуренция с альтернативами: в современных системах часто используются JSON (для текстового обмена) и Protocol Buffers / FlatBuffers (для бинарного обмена), которые проще в освоении и имеют более широкую экосистему.

Интересные факты

  • ASN.1 является единственным стандартом, который одновременно поддерживает и текстовое (XER), и бинарное (BER/PER) представление одних и тех же данных.
  • Идентификаторы объектов (OID) в ASN.1 используются для однозначной идентификации алгоритмов, протоколов и организаций. Например, OID 1.2.840.113549.1.1.1 соответствует алгоритму RSA.
  • В России ASN.1 применяется в стандартах электронной подписи (ГОСТ Р 34.10-2012, ГОСТ Р 34.11-2012) и в протоколах защищённого обмена (например, в системе «КриптоПро»).

Источники

  • ITU-T Recommendation X.680 (2021) — Information technology — Abstract Syntax Notation One (ASN.1): Specification of basic notation.
  • ITU-T Recommendation X.690 (2021) — Information technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER).
  • ITU-T Recommendation X.691 (2021) — Information technology — ASN.1 encoding rules: Specification of Packed Encoding Rules (PER).
  • ITU-T Recommendation X.693 (2021) — Information technology — ASN.1 encoding rules: XML Encoding Rules (XER).
  • ITU-T Recommendation X.696 (2021) — Information technology — ASN.1 encoding rules: Specification of Octet Encoding Rules (OER).
  • ISO/IEC 8824-1:2021 — Information technology — Abstract Syntax Notation One (ASN.1) — Part 1: Specification of basic notation.
  • ISO/IEC 8825-1:2021 — Information technology — ASN.1 encoding rules — Part 1: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER).
  • Dubuisson, O. (2000). ASN.1 — Communication Between Heterogeneous Systems. Morgan Kaufmann.
  • Lev Walkin. ASN.1 Compiler (asn1c) — документация и исходные коды.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →