
Эксперт
   
Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной
Репутация: 5 Всего: 64
|
Решил проблему: Код | bool CertToECP(const char *ccFileName, Byte *bECP, int iECPLen, Byte *bCert, int iCertLen) {
// ccFileName - путь куда будет сохранён результат // bECP - файл ЭЦП (байтовый массив) // iECPLen - длина массива // bCert - файл сертификата (байтовый массив) // iCertLen - длина массива
HCRYPTMSG hMsg; CRYPT_INTEGER_BLOB cib; PCCERT_CONTEXT hCert = NULL; Byte *bRes; unsigned long int iSize;
hCert = CertCreateCertificateContext(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, bCert, iCertLen);
if(!hCert) { CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, NULL, NULL, NULL); if(!hMsg) {
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
if(!CryptMsgUpdate(hMsg, bECP, iECPLen, true)) { CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
cib.cbData = iCertLen; cib.pbData = bCert;
if(!CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &cib)) { CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
iSize = 0; if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, NULL, &iSize)) { CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
bRes = new Byte[iSize]; if(!bRes) { CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
if(!CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, bRes, &iSize)) { delete [] bRes; CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
int hFile; hFile = FileCreate(ccFileName);
if(hFile) { FileWrite(hFile, bRes, iSize);
FileClose(hFile); } else { delete [] bRes; CertFreeCertificateContext(hCert); CryptMsgClose(hMsg);
LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Ошибка", MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
return false; }
delete [] bRes; CertFreeCertificateContext(hCert); CryptMsgClose(hMsg); return true; }
|
--------------------
Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт.
|