23.04.2007 10:11:01Перечисление сертификатов Ответов: 3
Волков
Проверяю подпись следующим образом
PCCERT_CONTEXT pSignerCertTemp=NULL;
while(pSignerCertTemp=CertEnumCertificatesInStore(
hStoreHandle,
pSignerCertTemp))
{

char pszNameString[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
CertGetNameString(
pSignerCertTemp,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
pszNameString,
128);
CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
//Çàïîëíåíèå ñòðóêòóðû äëÿ âåðèôèêàöèè
pSignerCerttemp=pSignerCertTemp;
VerifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
VerifyParams.dwMsgAndCertEncodingType = MY_TYPE;
VerifyParams.hCryptProv = 0;
VerifyParams.pfnGetSignerCertificate = MyGetSignerCertificateCallback;
VerifyParams.pvGetArg = (void*)pSignerCerttemp;

const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;

// âåðèôèêàöèÿ ïîäïèñè õýøà
if(CryptVerifyDetachedMessageSignature(
&VerifyParams, // óêàçàòåëü íà ñòðóêòóðó VerifyParams
0, //
pbArray, // óêàçàòåëü íà ïîäïèñü
cbArray, // äëèíà ïîäïèñè
1, // ÷èñëî ñîîáùåíèé
MessageArray, // ñîîáùåíèå
MessageSizeArray, // äëèíà ñîîáùåíèÿ
&pSignerCerttemp)) // óêàçàòåëü íà ñåðòèôèêàò
{
ShowMessage("Âåðèôèêàöèÿ ïðîøëà óñïåøíî äëÿ ñåðòèôèêàòà ");
if(pbArray)
delete pbArray;
if(pSignerCert)
CertFreeCertificateContext(pSignerCert);
if(pSignerCerttemp)
CertFreeCertificateContext(pSignerCerttemp);
return;
}
}
при проверке первого сертификата на валидность все проходит удачно, но когда while начинает отрабатывать второй раз то появляется ошибка AccessViolation, в чем может быть дело?
 
Ответы:
23.04.2007 12:09:44Kirill Sobolev
Не надо вызывать CertFreeCertificateContext(pSignerCerttemp), это сделает сама функция CertEnumCertificatesInStore.
23.04.2007 12:24:32Волков
Дело не в этом, ведь я CertFreeCertificateContext вызываю только при удачной проверке.
24.04.2007 6:30:26Волков
Было время когда все это работало!