| ||||
| ||||
Проблема в следующем. С помощью 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"Ðàçìåð ôàéëà ñîîáùåíèÿ %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); | ||||
Ответы: | ||||
| ||||
М.б. дело не в коде а в сертификате. Он действительный. А стандартный пример из CAPICOM с этим сертификатом работает? | ||||