Вопрос

Привет,

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

Фон, если вы заинтересованы:

Почему я хочу злоупотреблять ASN.1 таким образом? Для исследовательского проекта мне нужно встроить некоторые данные в цифровую подпись, которая имеет связанный с сертификатом X.509. (Я использую Createsignatureex в библиотеке Cryptlib Peter Gutmann для создания соответствующих подписей CMS / S / MIME-2/3 / PKCS- # 7, если это имеет значение. Я не подписываю данные, которые я хочу кодировать, просто добавляя его в виде метаданных Для подписи, чтобы обогатить его.) Согласно моему пониманию, серьезные подписи с произвольными данными расширения требуют, требуют кодировки данных расширения с использованием ASN.1 DER. Мои данные - это двоичный BLOB и полезно только для моего приложения, поэтому нет никакой реальной стоимости при выполнении правильности ASN.1 Кодирования каждой части моих данных. Я рисую с некоторой работой, которую я мог бы научиться использовать ASN1C, чтобы сделать это, но выглядит довольно сложно, и я в срок. Не менее важно, главное, кажется ненужным, и кажется, что эта информация может быть полезна другим разработчикам, которые хотят избежать боли подходящего кодирования ASN.1.

Спасибо!

Это было полезно?

Решение

Я бы использовал ASN.1 компилятор.

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top