Тема: Проверка подписи

Здравствуйте!
Выполняю проверку подписи под файлом:
    verify_param_t verifyParam;
    memset(&verifyParam, 0, sizeof(verify_param_t));
    verifyParam.flag = FLAG_PKCS7 | FLAG_VERIFY_DELSIGN; // Сообщение PKCS#7 и удалить подписи после проверки
    verifyParam.nSignToDelete = DELETE_ALL_SIGNS; // Удалить все подписи
    verifyParam.info = FIELD_ALL; // Вернуть все поля сертификата подписанта
    verify_result_t resultParam;
    error = VCERT_VerifyFile(context, &verifyParam, NULL, (char *)fileSign, (char *)outFile, &resultParam);
В результате error = 0. В resultParam: sign_num=1, а в resultParam.status = 0 (все OK), resultParam.signs[0].cert ничего не содержится, хотя в сообщении сертификат подписанта есть. Не подскажете почему не вытаскивается этот самый сертификат? Через справочник сертификатов подпись под этим файлом проверяется абсолютно нормально.

PS: СКЗИ Верба.

2

Re: Проверка подписи

Добрый день.

Скорее всего Вы пользуетесь Visual Studio 2005, а там тип time_t расширен до 64 бит. Для использования 32 битного time_t (который содержится в структуре sign_status_t) используйте #define _USE_32BIT_TIME_T при сборке приложения.

3

Re: Проверка подписи

Спасибо, именно в этом и была ошибка.
Сейчас возникла другая проблема: по большому счету мне необходимо на выходе получить сертификат, закодированный в DER. При проверке я указываю получать все поля, но вот после проверки в поле verify_result_t.signs[0].cert->certEncoded содержится явно не то: длина данных в этом буфере всего 14 байт. Почему так? :-(

4

Re: Проверка подписи

Алексей, добрый день!

Для лучшей консультации хотелось бы знать, Версию ПО которую Вы используете, от кого получили SDK ...
Для анализа ошибок можно прислать по почте кусок кода, который не работает и параметры для сборки проекта (/DEFINE и прочие).

5

Re: Проверка подписи

Здравствуйте!
Делаю проверку подписи средствами .NET (C#)
Получаю ошибку:

Exception from HRESULT: 0xE0700003

//------------ текст на C# -----------------------------
VCERTCOMLib.VCERT Crypt = new VCERTCOMLib.VCERT();
VCERTCOMLib.VerifyParam vp = new VCERTCOMLib.VerifyParam();
vp.flag = VCERTCOMLib.VerifyParamFlag_t.Flag_Verify_Pkcs7 |  VCERTCOMLib.VerifyParamFlag_t.Flag_Verify_Detached; // подпись в отдельном файле
vp.info = VCERTCOMLib.Certinfo_t.Field_All;
vp.mycert = null;
object VerifyResult = null;
                try
                {
                    Crypt.VerifyFile(vp, fullName, fullName + ".p7s", "", ref VerifyResult);
                }
                catch (Exception ex)
                {
                    throw new Exception(String.Format("Ошибка идентификации подписи файла {0}: " + ex.Message, fullName));
                }

Подскажите, пожалуйста, в чем дело?

Спасибо!

6

Re: Проверка подписи

Добрый день!

VCERTCOMLib не предназначен для вызова из .NET, потому что не все его функции в этом случае будут работать. Для .NET были написаны VCERTPIA.DLL (.NET 1.1) и VCPIA2.DLL (.NET 2.0) которые представляют собой подписанные сборки (.NET signed assemblies).

В Вашем случае, после создания Crypt его необходимо инициализировать функцией Initialize(), а если этого не сделать, то и возникнет ошибка Invalid Context (0xE0700003).

7

Re: Проверка подписи

Спасибо БОЛЬШОЕ!
Буду сейчас изучать вопрос. Есть ли у нас все это?