| ||||
| ||||
Проверяю подпись следующим образом 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, в чем может быть дело? | ||||
Ответы: | ||||
| ||||
Не надо вызывать CertFreeCertificateContext(pSignerCerttemp), это сделает сама функция CertEnumCertificatesInStore. | ||||
| ||||
Дело не в этом, ведь я CertFreeCertificateContext вызываю только при удачной проверке. | ||||
| ||||
Было время когда все это работало! | ||||