13.06.2006 16:02:16CryptVerifyMessageSignature Ответов: 3
Василий
При использовании, CryptVerifyMessageSignature выдаёт ошибку: Access violation at address 77421A53 in module 'crypt32.dll' Read of address 00000000. Использую следующее описание (Delphi):

function CryptVerifyMessageSignature(pVerifyPara :PCRYPT_VERIFY_MESSAGE_PARA;
dwSignerIndex :DWORD;
const pbSignedBlob :PBYTE;
cbSignedBlob :DWORD;
pbDecoded :PBYTE;
pcbDecoded :PDWORD;
ppSignerCert :PCCERT_CONTEXT
):BOOL ; stdcall;

В чём может быть дело?
 
Ответы:
13.06.2006 18:32:38Василий
Обнаружил такую вещь:
Вызываю
CryptVerifyMessageSignatureMy(@param,
0,
mem_tbs, // подписанное сообщение
mem_len, // длина
signed_mem, // если нужно сохранить
@signed_len,// длина сохраняемого
nil);

где:

FillChar(param,sizeof(CRYPT_VERIFY_MESSAGE_PARA),0);
param.cbSize := sizeof(CRYPT_VERIFY_MESSAGE_PARA);
param.dwMsgAndCertEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
param.hCryptProv := 0;
param.pfnGetSignerCertificate := @global_sml_my_get_cert;
param.pvGetArg := pUserCert;

Так вот, значение pUserCert не совпадает, со значением, передаваемым в callback функцию:

function global_sml_my_get_cert(pvGetArg: PVOID;
dwCertEncodingType : DWORD;
pSignerId : PCERT_INFO;
hMsgCertStore: HCERTSTORE): PCCERT_CONTEXT;
begin
Result := PCCERT_CONTEXT(pvGetArg); //pvGetArg <> param.pvGetArg
end;
14.06.2006 11:13:53Kirill Sobolev
Возможно, у Вас проблема в описании callback функции.
Вот у Марии была такая проблема http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2540.
14.06.2006 12:03:32Василий
Да, спасибо, помогло! ошибка была в том, что я не использовал stdcall в описании callback функции.