LINUX.ORG.RU

Библиотека для парсинга ASN.1 С++

 ,


0

4

Всем привет!

У меня есть файл, подписанный цифровой подписью, я его открываю, например, вот в таком онлайн парсере https://lapo.it/asn1js/, и получаю структуру ASN.1.

Я хочу вытащить из такого файла поле - data. Подскажите, пожалуйста, какую-нибудь легкую библиотеку С++ только для чтения файла (как я понял этот формат называется «BER (DER, CER) ASN.1 binary data»). ASN компилятор мне не нужен, ничего генерировать я не собираюсь.

Я уже нашел парочку:

  1. https://github.com/Samuel-Tyler/fast_ber (собрал к ней abseil, и даже ее какие-то либы, но так и не понял, как она должна работать)
  2. https://github.com/YuryStrozhevsky/C-plus-plus-ASN.1-2008-coder-decoder (странная зависимость от xml msxml6.dll, что будет работать только под виндой)


Последнее исправление: Tumyq (всего исправлений: 2)
Ответ на: комментарий от Tumyq

Посмотрите, для примера, этот исходник: https://github.com/ARMmbed/mbedtls/blob/development/library/x509_crl.c

И сделайте по аналогии. То есть открываете два текстовых редактора, в одном будет ваш парсер, в другом - объявления ASN.1, которые вам нужно реализовать. Ну и в третьем пример по ссылке. Внимательно тупите в ASN и пишете свой парсер :)

Дополню, имхо, с mbedtls приятнее работать, по сравнению с openssl: нет засорения пространства имен, есть целостность в стиле именования идентификаторов - не так вырвиглазно код выглядит.

Ещё дополнение: в том примере точка входа - mbedtls_x509_crl_parse_der(), если не сразу поняли. Вот с неё и начните разбираться.

eve
()
Последнее исправление: eve (всего исправлений: 2)
Ответ на: комментарий от eve

Хорошо, спасибо за наводку, приступим к операции, тампон.. скальпель :)

Tumyq
() автор топика
Ответ на: комментарий от eve

Промучившись много-много дней с попытками что-то извлечь из всех выше перечисленных библиотек, сборками и остальным… , так и не смог вытащить что-то полезное для себя. Но я, таки, понял, что между сборками я прочитал уже достаточно статей про этот der, что начал пронимать, как устроена кодировка asn.1 в pkcs#7. В общем случилось то, что, прочитав несколько статей, я просто написал одну единственную функцию, которая просто читает, и находит необходимое поле.

  • Основные статьи, по которым писал, и клевый онлайн парсер, который сразу покажет содержимое:

https://lapo.it/asn1js/

https://habr.com/ru/post/150757

https://stackoverflow.com/questions/38420344/parsing-asn1-document-with-openssl-c-api/

https://coolaj86.com/articles/asn1-for-dummies/

https://www.obj-sys.com/asn1tutorial/node124.html

  • Консоль:
pos: 0
30
SEQUENCE

pos: 4
06
OBJECT_IDENTIFIER
2a 86 48 86 f7 0d 01 07 02

pos: 15
a0
ENUMERATED

pos: 19
30
SEQUENCE

pos: 23
02
INTEGER

pos: 26
31
SET

pos: 28
30
SEQUENCE

pos: 30
06
OBJECT_IDENTIFIER
2a 85 03 07 01 01 02 02

pos: 40
05
NULL_TYPE

pos: 42
30
SEQUENCE

pos: 46
06
OBJECT_IDENTIFIER
2a 86 48 86 f7 0d 01 07 01  -> Data OID placed here!

pos: 57
a0
ENUMERATED

pos: 61
04
OCTET_STRING
Data faund and extracted!
Tumyq
() автор топика
Последнее исправление: Tumyq (всего исправлений: 7)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.