Free ASN.1:2008 compliance test suite
Ранее я уже представлял на данном ресурсе свою статью ASN.1 простыми словами. Теперь я публикую свой новый труд — свободно распространяемый набор тестов для проверки совместимости со стандартом ASN.1:2008. А точнее даже два своих труда — как дополнение к предлагаемому набору тестов я предлагаю свой собственный ASN.1 BER кодировщик/декодировщик (в исходных текстах), который на 100% удовлетворяет требованиям предлагаемого мною набора тестов. Ниже дано более подробное описание всего комплекса.
Занимаясь долгое время работой с 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 схемы + файл конфигурации для набора тестов
Эта же статья в виде PDF