Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.05.2010(UTC) Сообщений: 103 Откуда: центр Вселенной
Сказал(а) «Спасибо»: 2 раз Поблагодарили: 1 раз в 1 постах
|
Последняя функция CertToECP работала правильно. Всё дело было в том, что сертификат, который я брал из БД был подпорчен: другая софтина, при добавлении сертификата в БД, дописывает в конец NULL'ы. Почему она это делает ещё придётся разобраться. Ещё раз функция: Код: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;
}
Спасибо всем, кто помогал и принимал участие в обсуждении.
|