Статус: Участник
Группы: Участники
Зарегистрирован: 23.06.2010(UTC) Сообщений: 10 Откуда: Санкт-Петербург
|
Добрый день. У меня к Вам следующий вопрос. Средствами CryptoApi реализовал подпись документа, добавление подписи в документ, и проверку подписанного документа. Далее при тестировании валидности цепочек сертификатов и подписей обнаружил непонятное для меня поведение CryptMsgGetParam(... CMSG_SIGNER_COUNT_PARAM ..., &signersNum). Оно все время возвращает 4, независимо от количества подписей реально находящихся в документе. Можно конечно в цикле проверять CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, i, pbSignerCertInfo, &size) параметр size на равенство 0, но я не уверен в правильности этого решения. КриптоАрм показывает, что все подписи на месте, и видит все сертификаты, находящиеся в подписанном файле. собственно вопрос почему же тогда signersNum все время 4 и можно ли обойтись вообще без него, проверяя в цикле CryptMsgGetParam(...., &size)? Благодарю за внимание! Код:
//инициализируем криптопровайдер
if(!CryptAcquireContext(
&hCryptProv,
NULL, //т.к. CRYPT_VERIFYCONTEXT, то контейнер ключей задаем NULL
NULL,
PROV_GOST_2001_DH/*75*/, //тип криптопровайдера
CRYPT_VERIFYCONTEXT)) //флаги .
throw gcnew Exception("Cryptographic context could not be acquired.");
HCRYPTMSG hMsg = CryptMsgOpenToDecode(
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
0,
hCryptProv,
NULL,
NULL);
if (!hMsg)
throw gcnew Exception("OpenToDecode failed");
if(!CryptMsgUpdate(hMsg, (BYTE *) signedData, signedDataLen, true))
throw gcnew Exception("MsgUpdate failed");
DWORD signersNum = 0; //количество подписчиков
DWORD size = 0;
//получаем количество подписей
CryptMsgGetParam(hMsg, CMSG_SIGNER_COUNT_PARAM, 0, NULL, &signersNum); //<<<<<<<< signersNum всегда 4
...
//потом в цикле достаю информацию о сертификате
CryptMsgGetParam(...CMSG_SIGNER_CERT_INFO_PARAM....);
//делаю проверки на отозванность
CertGetCertificateChain(...CERT_CHAIN_REVOCATION_CHECK_CHAIN...); //отозванность
CertVerifyCertificateChainPolicy(...CPCERT_CHAIN_POLICY_SIGNATURE...); //корректность цепочки дял подписи
CryptMsgControl(...CMSG_CTRL_VERIFY_SIGNATURE...); //проверяем мат. корректность подписи
//вроде этого должно быть достаточно
|