Занимаясь долгое время работой с ASN.1 постоянно сталкиваешься с необходимостью применения программы кодирования/декодирования (специальной программы работы с ASN.1). Однако не смотря на общедоступность стандарта ASN.1 различные программы работы с ASN.1 подчас производят различные результаты. Зачастую даже известные (и платные!) программы допускают ошибки при работе со стандартными типами ASN.1, что является следствием упущений в тестировании программы или следствием неполного понимания всех аспектов стандарта ASN.1.
Для решения данной проблемы, казалось бы, достаточно одного, централизованно разработанного набора тестов для каждого из типов ASN.1. Однако разбираясь с этим вопросом я обнаружил, что в свободном доступе таких тестов нет. Вообще. По моей информации все-таки такие тесты существуют, но они либо закрытые, либо платные и тестирование по таким тестам производится только на специальных площадках в аттестованных организациях. Но что делать обычному разработчику например нового, свободно распространяемого ASN.1-компилятора? Именно для помощи всем желающим создавать что-то новое для работы с данными в стандарте ASN.1, а также для всех желающих изучить данный стандарт мною был сделан набор тестов, достаточно полно охватывающий вопросы кодирования для типов данных ASN.1.
Набор тестов решает следующие задачи:
Даёт тесты для наиболее общего формата кодирования ASN.1 - BER;
Выполнение требований к кодированию каждого из типов, а также каждого из подблоков каждого типа;
Даёт полный набор нестандартных ситуаций при кодировании каждого из типов;
Даёт полный набор ошибочного кодирования для каждого из типов;
Даёт рекомендательное описание поведения программы обработки ASN.1 для каждого из предлагаемых тестов;
Даёт возможность участия любого заинтересованного лица в добавлении новых тестовых случаев, а также предоставляет отправную точку для создания собственных наборов тестов;
Собственно сами тесты представляют из себя бинарные файлы с закодированными данными в формате ASN.1 BER. Для облегчения работы с предлагаемым набором тестов предлагается также сводное текстовое краткое описание каждого тестового случая, вместе с тестируемым типом данных, а также кратким описанием предлагаемых действий программы обработки ASN.1 данных. Все тесты являются допустимыми вариантами кодирования, то есть все они так или иначе могут быть рано или поздно встречены в реальной работе программы обработки ASN.1 данных. Полный архив со всеми тестами (файлы "tc*.ber"), файлами формата CompliXML (см. ниже) полученными на основе тестов (файлы "transformed_tc*.xml"), повторно закодированными файлами (файлы "encoded_tc*.ber"), а также с кратким описанием всех тестов (файл "free_asn1_testsuite.pdf") можно получить по прямой ссылке.
Первично при составлении вышеупомянутых тестов я использовал только свой личный опыт и собственно стандарт кодирования ASN.1. Однако по мере составления полного списка тестовых случаев все чаще возникал вопрос - как же надо правильно реагировать программе обработки ASN.1 в каждом конкретном случае и вообще возможно ли как-то нормально обработать каждую исключительную ситуацию? Для нахождения ответа на данные вопросы мне пришлось создать свою программу, позволяющую как декодировать ASN.1 BER, так и кодировать такие же ASN.1 BER данные. Все исходные коды этой программы я распространяю совершенно бесплатно и каждый волен использовать эти коды как ему угодно (почти - программа выпущена под BSD license). Программа служит исключительно для тестовых и ознакомительных целей. Ниже приведено более подробное описание моего программного продукта.
Программа называется COMPLI (fully-compliant ASN.1 BER decoder/encoder).
Сначала об ограничениях программы:
Программа написана под Windows;
Для работы программы требуется установленный MSXML 6;
Программа предназначена исключительно для ознакомления с принципами кодирования/декодирования типов данных ASN.1, а также для предоставления образца реакции на нестандартные ситуации, возникающие в процессе кодирования/декодирования;
В программе отсутствует оптимизация исходного кода, что позволяет легче понимать процессы внутренней деятельности программы;
Теперь более подробно об особенностях программы:
Представляет из себя кодер/декодер для наиболее общего формата кодирования ASN.1 - BER (то есть форматы DER и CER программа обрабатывает также);
Также программный продукт позволяет работать с бинарными данными, дополнительно закодированными в BASE64-формате, а также с внутренним XML форматом описания ASN.1 типов (см. ниже);
Кодирование и декодирование реализовано для всех типов из последнего стандарта ASN.1:2008;
Кодирование и декодирование для каждого из типов на 100% удовлетворяет предлагаемым ранее тестовым случаям для тестирования совместимости со стандартом ASN.1;
Программа поставляется в исходных кодах, под лицензией, позволяющей использовать их даже в коммерческих разработках;
Код программы написан на С++ с применением объектной модели программирования;
Код проверен на отсутствие ошибок и утечек памяти;
Код произвольно расширяем, позволяя добавлять работу с новыми форматами кодирования ASN.1;
Программа имеет пакетный режим работы с файлами, позволяя за один раз обработать множество входных файлов, причем в одном пакете обработки могут быть как операции декодирования для определенного типа, так и операции кодирования. Конфигурационный файл представляется в XML, формат конфигурационного файла описан в виде XSD-схемы ( ссылка на файл XSD );
Стандартный выходной формат (CompliXML) описывает декодированные типы в виде XML, что позволяет проще воспринимать результаты декодирования, а также дает возможность делать вторичные отчеты на основе декодированных данных;
Стандартный выходной формат подробно описан в виде XSD-схемы ( ссылка на файл XSD );
Стандартный выходной формат описывает каждый отдельный подблок внутри каждого декодированного типа. Например при декодировании OBJECT IDENTIFIER в выходном файле создается отдельный блок информации для каждого "sub-identifier", а при декодировании типа REAL - отдельные блоки информации для подблоков мантиссы, экспоненты и информационного подблока;
Кроме собственно декодированных данных стандартный выходной формат позволяет описывать возникающие при декодировании предупреждения и ошибки. Причём предупреждения и ошибки могут относиться как ко всему декодированному файлу, так и к каждому из декодированных подблоков внутри каждого ASN.1 типа;
Для упрощения возможностей кодирования выходной и входной форматы программы полностью идентичны. То есть декодировав сложный файл (например X.509 сертификат) и получив выходной XML файл в формате CompliXML можно этот же файл передать на вход программы и получить закодированный бинарный файл, абсолютно идентичный исходному декодированному файлу;
Подобная гибкость программы позволяет даже например декодировать бинарный файл, поменять в нем тип ASN.1 данных (например с BMP STRING на PRINTABLE STRING), а затем закодировать новый бинарный файл с новыми, измененными типами данных;
В итоге после создания программы COMPLI мне удалось реализовать следующие задачи:
Получить действующий свободно распространяемых ASN.1 BER кодировщик/декодировщик;
Получить стенд для тестирования предлагаемых тестовых случаев кодирования всех типов ASN.1;
Получить максимально детализированный и простой формат описания для каждого из типов ASN.1;
Получить возможность простого кодирования с помощью XML файлов всех типов ASN.1, причем в формате BER. То есть COMPLI позволяет полностью избавится от программирования при создании произвольных бинарных ASN.1 BER файлов, предоставляя возможность работать только с текстовыми данными в формате XML;
Показать возможные варианты реакций на все предлагаемые мною тестовые случаи кодирования ASN.1 типов;
Программа будет еще расти и расширяться. В настоящий момент она позволяет кодировать в/из для следующих форматов:
BER (DER, CER);
BER дополнительно закодированный в BASE64 (например OpenSSL сертификаты);
CompliXML;
В скором времени к этому списку добавится и формат XER.
Собственно сам test suite
Исходные тексты COMPLI
Исполняемый файл COMPLI + XSD схемы + файл конфигурации для набора тестов