Как просто создать DER-код в ASN.1 - PullRequest
2 голосов
/ 03 сентября 2010

Greetings,

Как я могу просто закодировать некоторые двоичные данные в BLN-код в формате ASN.1 DER?Я использую C / C ++, и я полагаю, что должна быть возможность просто префиксировать двоичный двоичный объект некоторыми подходящими байтами, которые означают, что данные имеют тип строки октетов и имеют заданную длину (и в последовательности длиной 1 Iугадайте).

Предыстория, если вам интересно:

Почему я хочу злоупотреблять ASN.1 таким образом?Для исследовательского проекта мне нужно встроить некоторые данные в цифровую подпись, с которой связан сертификат X.509.(Я использую createSignatureEx в библиотеке cryptlib Питера Гутмана для создания совместимых с CMS / S / MIME-2/3 / PKCS- # 7 подписей, если это важно. Я не подписываю данные, которые хочу кодировать, просто добавляю их как метаданныек подписи, чтобы обогатить ее.) Насколько я понимаю, серьезные подписи с произвольными данными расширения требуют кодирования данных расширения с использованием DER ASN.1.Мои данные - это двоичный двоичный объект, который полезен только для моего приложения, поэтому нет смысла делать правильное кодирование ASN.1 для каждой части моих данных.Я полагаю, что с некоторой работой я мог бы научиться использовать asn1c для этого, но это выглядит довольно сложно, и я в срок.Не менее важно, что это кажется ненужным, и кажется, что эта информация может быть полезна для других разработчиков, которые хотят избежать боли правильной кодировки ASN.1.

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Нельзя просто добавить блоб ASN.1 в сертификат X.509 и ожидать, что он станет частью сертификата. Сертификат представляет собой последовательность значений ASN.1, и поэтому он начинается с тега SEQUENCE и длины, которая охватывает весь сертификат.

Если вы хотите добавить поле в структуру сертификата (что, вероятно, будет означать, что он больше не является действительным сертификатом, но все еще может быть действительной структурой ASN.1), вам придется изменить длину этого последовательность, а также добавление ваших данных.

Да, 04 08 01 23 45 67 89 ab cd ef - допустимое кодирование DER для строки октетов. 04 в начале - это тег для OCTET STRING, а 08 - длина строки. Обратите внимание, что длины до 127 кодируются одним байтом, а для больших длин используется более длинное кодирование.

Хорошее введение в ASN.1 - и особенно его использование в криптографических сообщениях - см. «Руководство для неспециалистов по подмножеству ASN.1, BER и DER», которое вы сможете найти на Сайт rsa.com.

1 голос
/ 03 сентября 2010

Я бы использовал ASN.1 Compiler .

Люди злоупотребляют ASN.1, потому что это способ кодирования структур данных.Каждый раз, когда у вас есть программа на C / C ++, работающая со структурой данных, которую злоумышленник контролирует, например, проблемы;переполнения буфера и целочисленные переполнения, вступайте в игру.ASN.1 не более небезопасен, чем, скажем, XML, JSON или bencode, поскольку все они являются вероятными точками отказа.Могут быть проблемы с самой библиотекой кодирования, как эта неприятная уязвимость Microsoft. Но это утверждение верно независимо от используемого метода кодирования.ASN.1 - отличный выбор, потому что получающееся в результате сообщение чрезвычайно мало, и это наиболее эффективное использование пространства из всех известных мне методов кодирования.

0 голосов
/ 23 ноября 2017

Я бы предложил использовать Quick DER и передать в подпрограмму der_pack() описание структуры, которое можно скомпилировать с помощью компилятора asn2quickder.Если речь идет об использовании стандартной структуры, вы, вероятно, можете просто #include <quick-der/rfc5280> и использовать ее предварительно определенные данные.

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

Извините, что загружаю мою библиотеку onw;но на самом деле он был написан для легкодоступного ASN.1 для разработчиков C / C ++ и Python (с открытым исходным кодом).

...