// сообщение, которое надо подписать содержится в файле dataToSignFile
hFile1 = ::CreateFile (dataToSignFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// читаем файл в szBuf
DWORD dwFileSize = ::GetFileSize (hFile1, NULL);
char* szBuf = static_cast<char*>(malloc(dwFileSize + 1));
ZeroMemory(szBuf, dwFileSize + 1);
ReadFile (hFile1, szBuf, dwFileSize, &dwRWBytes, NULL);
// получаем размер подписи
DWORD count = 0;
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFileSize, 0);
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &count);
CryptDestroyHash (hHash);
// подписываем сообщение szBuf
// и записываем подпись в файл hFile2
hFile2 = ::CreateFile (resFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
char* sign_hash = static_cast<char*>(malloc(count + 1));
ZeroMemory(sign_hash, count + 1);
CryptCreateHash (hCryptProv, CALG_MD5, 0, 0, &hHash);
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFileSize, 0);
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, (BYTE*)&sign_hash[0], &count);
DWORD dwRWBytes2 = 0;
WriteFile (hFile2, sign_hash, count, &dwRWBytes2, NULL);
CloseHandle (hFile2);
// подписали - все закрываем
CloseHandle (hFile1);
CryptDestroyHash (hHash);
CryptoAPI - CryptVerifySignature problem
Проблема с функцией CryptVerifySignature!
Я подписываю сообщение.Вот код подписи:
Код:
Теперь эту подпись надо проверить:
Проверяем функцией CryptVerifySignature следующим образом:
Код:
// dataToSignFile- файл с исходным сообщением
// resFile - файл с подписанным сообщением dataToSignFile
hFile1 = CreateFile (dataToSignFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hFile2 = CreateFile (resFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// читаем в szBuf файл с исходным сообщением
DWORD dwRWBytes = 0;
DWORD dwFile1Size = ::GetFileSize (hFile1, NULL);
char* szBuf = static_cast<char*>(malloc(dwFile1Size + 1));
ZeroMemory(szBuf, dwFile1Size + 1);
ReadFile (hFile1, szBuf, dwFile1Size, &dwRWBytes, NULL);
// загоняем в hHash хеш исходного сообщения
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFile1Size, 0);
// читаем в szBuf2 файл с подписанным сообщением
DWORD dwRWBytes2 = 0;
DWORD dwFile2Size = ::GetFileSize (hFile2, NULL);
char* szBuf2 = static_cast<char*>(malloc(dwFile2Size + 1));
ZeroMemory(szBuf2, dwFile2Size + 1);
ReadFile (hFile2, szBuf2, dwFile2Size, &dwRWBytes2, NULL);
// проверяем подпись - ВОТ ЗДЕСЬ КАК РАЗ ПРОБЛЕМА!!!
BOOL signOk = CryptVerifySignature (hHash, (BYTE *)&szBuf2[0], dwFile2Size, hPPKey, NULL, 0);
CloseHandle (hFile1);
CloseHandle (hFile2);
// resFile - файл с подписанным сообщением dataToSignFile
hFile1 = CreateFile (dataToSignFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hFile2 = CreateFile (resFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// читаем в szBuf файл с исходным сообщением
DWORD dwRWBytes = 0;
DWORD dwFile1Size = ::GetFileSize (hFile1, NULL);
char* szBuf = static_cast<char*>(malloc(dwFile1Size + 1));
ZeroMemory(szBuf, dwFile1Size + 1);
ReadFile (hFile1, szBuf, dwFile1Size, &dwRWBytes, NULL);
// загоняем в hHash хеш исходного сообщения
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFile1Size, 0);
// читаем в szBuf2 файл с подписанным сообщением
DWORD dwRWBytes2 = 0;
DWORD dwFile2Size = ::GetFileSize (hFile2, NULL);
char* szBuf2 = static_cast<char*>(malloc(dwFile2Size + 1));
ZeroMemory(szBuf2, dwFile2Size + 1);
ReadFile (hFile2, szBuf2, dwFile2Size, &dwRWBytes2, NULL);
// проверяем подпись - ВОТ ЗДЕСЬ КАК РАЗ ПРОБЛЕМА!!!
BOOL signOk = CryptVerifySignature (hHash, (BYTE *)&szBuf2[0], dwFile2Size, hPPKey, NULL, 0);
CloseHandle (hFile1);
CloseHandle (hFile2);
У меня signOk всегда равно 0.(контекст и ключи экпортируются и импортируются - нормально)
Что здесь не так, подскажите! У кого какие мысли?
Спасибо.