1

Тема: Ошибка 0xE0700019 при проверке подписи

API СКАД Сигнатура предлагает методы
1.    VCERT_SignHashMem принимающий хэш-функцию данных в виде набора байт и возвращающий массив байт ЭП вычисленный по этой хэш-функции.
2.    VCERT_VerifyHashMem принимающий на вход кодированный сертификат предполагаемого подписчика, хэш-функцию данных и массив байт ЭП.

Следующая последовательность операций завершается успехом:
1.    Выполняем VCERT_SignHashMem, получаем массив из 64 байт
2.    Получаем сертификат с помощью функциии VCERT_FindCert  с использованием флага FLAG_FIND_MY.
3.    Используем полученный сертификат и подпись для проверки в качестве параметров в функции VCERT_VerifyHashMem.

Следующая последовательность операций завершается ошибкой 0xE0700019:
1.    Выполняем VCER_SignFile, получаем файл подписи.
2.    Извлекаем из файла подписи подпись (последние 64 байт в файле).
3.    Извлекаем из файла подписи хеш сертификата которым был подписан файл и по нему ищем сертификат с помощью функции VCERT_FindCert.
4.    Используем полученный сертификат и подпись для проверки в качестве параметров в функции VCERT_VerifyHashMem.

В результате возникают вопросы:
1.     Что не так во втором кейсе?
2.    Как из файла подписи следует извлекать массив байт для его последующего использования в качестве ЭП в методе VCERT_VerifyHashMem?

Также, хотелось бы узнать, возможно ли с помощью API СКАД Сигнатура из байт ЭП полученных в результате выполнения VCERT_SignHashMem создать файл подписи в формате ASN.1?

Основная задача: проверять и формировать файлы подписи с использованием только результата хеш-функции файла данных.

2

Re: Ошибка 0xE0700019 при проверке подписи

Добрый день!

  1. Последние 64 байт в файле не являются подписью.

  2. Можно воспользоваться функцией VCERT_VerifyFile либо использовать отсоединенную (detached) подпись.

3

Re: Ошибка 0xE0700019 при проверке подписи

Добавлю уточнения:
Второй кейс имитирует работу для ситуации в которой у нас имеется:
1. Файл отсоединенной подписи.
2. Результат выполнения хэш-функции над файлом данных.

В такой ситуации мы не можем на прямую воспользоваться функцией VCERT_VerifyFile.

Нам неясно что именно передавать функции VCERT_VerifyHashMem в качестве последнего параметра (mem_blk_t* sign) в такой ситуации. Мы пробовали разбирать файл отсоединенной подписи и извлекать из нее саму подпись (массив байт следующий за messageDigest, последние 64 байта в конце файла), но операция не завершилась успехом.

4

Re: Ошибка 0xE0700019 при проверке подписи

Дело в том, что в формировании ЭП в формате CMS/PKCS#7 хэш-значение данных используется опосредованно, а не напрямую. При формировании ЭП формируются так называемые подписываемые атрибуты CMS/PKCS#7 сообщения - например, хэш-значение подписываемых данных, время формирования ЭП, идентификатор сертификата подписанта, и т.п. Данные атрибуты затем хэшируются в их ASN.1 кодировке (грубо говоря, в сериализованном виде), и именно полученное хэш-значение подписывается ключом ЭП отправителя.