18.10.2004 18:50:53Непонятная ошибка при работе с CAPICOM Ответов: 1
Zver
Проблема в следующем. С помощью PKI сгенерировал сертификат с параметрами:
- длина открытого ключа 512 байт;
- алгоритм хэширования MD5;
- имеется закртытый ключ.
С помощью разработанной мной программы,
использующей библиотеку CAPICOM, пытаюсь подписать некий текстовый файл.
При этом выводится сообщение "Неправильный открытый ключ поставщика" и работа программы прекращается. В чем может быть
проблема?

P.S. Привожу исходный код...
void MakeSignature(wchar_t* message_file, wchar_t* signature_file, wchar_t* store_name,
wchar_t* signer_name)
{
IStorePtr pStore(__uuidof(Store));
ICertificate2Ptr pCert(__uuidof(Certificate));
ISignedDataPtr pSignData(__uuidof(SignedData));
ISigner2Ptr pSigner(__uuidof(Signer));
FILE* infile = NULL;
FILE* outfile = NULL;
unsigned nSize = 0;
PBYTE pInBuf = NULL;
PBYTE pOutBuf = NULL;
HRESULT hr = S_OK;

try
{
if(FAILED(hr = pStore->Open(CAPICOM_CURRENT_USER_STORE, _bstr_t(store_name),
CAPICOM_STORE_OPEN_READ_ONLY)))
_com_raise_error(hr);

for(int i = 1; i <= pStore->Certificates->GetCount(); i++)
{
pCert = static_cast<ICertificate2Ptr>(pStore->Certificates->GetItem(i));
pCert->Display();
if(_bstr_t(signer_name) == pCert->GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))
break;
}
if(_bstr_t(signer_name) != pCert->GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))
_com_raise_error(CAPICOM_E_CERTIFICATE_NOT_INITIALIZED);

if(!pCert->HasPrivateKey())
_com_raise_error(CAPICOM_E_CERTIFICATE_NO_PRIVATE_KEY);

pAttr->PutName(CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME);
pAttr->PutValue(_variant_t(_bstr_t(message_file)));

pSigner->PutCertificate(pCert);
pSigner->AuthenticatedAttributes->Add(pAttr);
pSigner->PutOptions(CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT);

if((infile = _wfopen(message_file, L"r")) == NULL)
throw;

while(!feof(infile))
{
fgetwc(infile);
nSize++;
}
wprintf(L"&#208;&#224;&#231;&#236;&#229;&#240; &#244;&#224;&#233;&#235;&#224; &#241;&#238;&#238;&#225;&#249;&#229;&#237;&#232;&#255; %s: %d. \n", message_file, nSize);

pInBuf = new BYTE [nSize];

fread(reinterpret_cast<void*>(pInBuf), sizeof(BYTE), nSize, infile);

pSignData->PutContent(_bstr_t(reinterpret_cast<char*>(pInBuf)));

//Здесь вылазит ошибка.
_bstr_t bstrSignedData = pSignData->Sign(pSigner, VARIANT_FALSE, CAPICOM_ENCODE_ANY);

pOutBuf = new BYTE [bstrSignedData.length()];

memcpy(reinterpret_cast<void*>(pOutBuf), reinterpret_cast<void*>(
static_cast<char*>(bstrSignedData)), bstrSignedData.length());

if((outfile = _wfopen(signature_file, L"w")) == NULL)
throw;

fwrite(reinterpret_cast<void*>(pOutBuf), sizeof(BYTE),
bstrSignedData.length(), outfile);
}
catch(_com_error& e)
{
MessageBox(NULL, e.ErrorMessage(), NULL, MB_OK|MB_ICONEXCLAMATION);
}
catch(...)
{
if(pOutBuf)
delete [] pOutBuf;
if(pInBuf)
delete [] pInBuf;
if(outfile)
fclose(outfile);
if(infile)
fclose(infile);
}

if(pOutBuf)
delete [] pOutBuf;
if(pInBuf)
delete [] pInBuf;
if(outfile)
fclose(outfile);
if(infile)
fclose(infile);
 
Ответы:
21.10.2004 19:39:40kure
М.б. дело не в коде а в сертификате.
Он действительный.

А стандартный пример из CAPICOM с этим сертификатом работает?