01.11.2007 10:24:52Проверка atache подписи Ответов: 0
Волков
Пытаюсь проверить подпсь файла следующим образом:
//--------------------------------------------------------------
//ïîëó÷åíèå êîíòåêñòà ñåðòèôèêàòà
if (!(hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY")))
{
printf("Íåëüçÿ îòêðûòü õðàíèëèùå ñåðòèôèêàòîâ");
return 0;
}
pUserCert = CertFindCertificateInStore(
hStoreHandle,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
L"Âîëêîâ",
NULL);
//--------------------------------------------------------------
//if(Cert_LM) pUserCert = read_cert_from_MY(certfile);
//else pUserCert = read_cert_from_my(certfile);
if (!pUserCert)
{
printf("read_cert_from_my");
printf ("Cannot find User certificate: %s\n", certfile);
goto err;
}

if (ask)
{
ret = CryptAcquireProvider ("my", pUserCert, &hCryptProv, &keytype, &should_release_ctx);
if (ret)
{
printf("A CSP has been acquired. \n");
}
else
{
printf("Cryptographic context could not be acquired.");
}
}
ret = get_file_data_pointer (sign_file, &mem_len, &mem_tbs);
if (!ret)
{
printf("Cannot read input file");
goto err;
}
BYTE *pbDer;
DWORD cbDer;

cbDer = mem_len;
pbDer = (BYTE *)malloc(mem_len);
if (!base64_decode(mem_tbs, mem_len, pbDer, &cbDer) ||
cbDer >= mem_len)
{
printf("Base64 conversion error");
goto err;
}
else
{
release_file_data_pointer(mem_tbs);
mem_tbs = pbDer;
mem_tbs_need_free = 1;
mem_len = cbDer;
}
DWORD dwSignerIndex = 0;
signed_mem = (BYTE*)malloc(signed_len = mem_len);
if (!signed_mem)
{
printf("Memory allocation error allocating decode blob.");
}

ret = CryptVerifyMessageSignature(
&param,
dwSignerIndex,
mem_tbs, /* ??????????? ?????????*/
mem_len, /* ?????*/
signed_mem, /* ???? ????? ????????? ???????? BYTE *pbDecoded,*/
&signed_len, /* ???? ????????? ???????? DWORD *pcbDecoded,*/
NULL); /* ???????????? ?????????? ?? ??????? ????????? ??? (PCCERT_CONTEXT *ppSignerCert)*/

if (ret)
{
printf("Signature was verified OK\n");
}
else
{
printf("Signature was NOT verified\n");
goto err;
}
В конце концов подпись оказывается не верной, хотя утилита cryptcp говорит обратное. В чем может быть дело?