Крипто-Про CSP |
//-------------------------------------------------------------------- // Пример кода, в котором не используются Crypt-функции. // Для корректной работы этой программы необходимо создать контейнер с // именем "Source". //-------------------------------------------------------------------- #include <string.h> #include <wincsp.h> void HandleError(char *s); void WINAPI FunReturnHWnd( HWND *hwnd ) { *hwnd = 0; } BOOL WINAPI FunVerifyImage( LPCSTR szImage, CONST BYTE *pbSigData ) { UNREFERENCED_PARAMETER( szImage ); UNREFERENCED_PARAMETER( pbSigData ); return TRUE; } //-------------------------------------------------------------------- void main(void) { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HMODULE hModule; // Дескриптор модуля DLL CPAcquireContext_t lpProcAcquire; // Адрес функции "CPAcquireContext" CPReleaseContext_t lpProcRelease; // Адрес функции "CPGetUserKey" VTABLEPROVSTRUC VTable; // Передается провайдеру для // корректной работы HKEY hkResult; // Реестровый ключ char sDefaultProviderName[MAX_PATH]; // Массив, содержаший имя провайдера // по умолчанию char sDefaultProviderNamePath[MAX_PATH];// Массив, содержаший путь провайдера // по умолчанию DWORD cbDefaultProviderName = (DWORD)sizeof( sDefaultProviderName ); char sDefaultFileName[80]; // Массив, содержаший имя загружаемого // DLL DWORD cbDefaultFileName = (DWORD)sizeof( sDefaultFileName ); HCRYPTPROV hProv; // Дескриптор CSP //-------------------------------------------------------------------- // Открытие реестрового ключа. if(!RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type 075", 0, KEY_QUERY_VALUE, &hkResult)) { printf("RegOpenKeyEx succeeded.\n"); } else { HandleError("A error runing RegOpenKeyEx."); } //-------------------------------------------------------------------- // Получение имени провайдера по умолчанию. { DWORD type; if(!RegQueryValueEx( hkResult, "Name", 0, &type, (BYTE*)sDefaultProviderName, &cbDefaultProviderName )) { printf("RegQueryValueEx succeeded.\nDefault provider name: '%s.'\n", sDefaultProviderName ); } else { HandleError("A error runing RegQueryValueEx."); } } //-------------------------------------------------------------------- // Закрытие реестрового ключа. RegCloseKey( hkResult ); //-------------------------------------------------------------------- // Определение пути для получения имени загружаемого DLL. strcpy( sDefaultProviderNamePath, "SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\" ); strcat( sDefaultProviderNamePath, sDefaultProviderName ); //-------------------------------------------------------------------- // Открытие реестрового ключа. if(!RegOpenKeyEx( HKEY_LOCAL_MACHINE, sDefaultProviderNamePath, 0, KEY_QUERY_VALUE, &hkResult)) { printf("RegOpenKeyEx succeeded.\n"); } else { HandleError("A error runing RegOpenKeyEx."); } //-------------------------------------------------------------------- // Получение имени загружаемого DLL. if(!RegQueryValueEx( hkResult, "Image Path", 0, NULL, (BYTE*)sDefaultFileName, &cbDefaultFileName )) { printf("RegQueryValueEx succeeded.\nProvider dll:'%s'\n", sDefaultFileName); } else { HandleError("A error runing RegQueryValueEx."); } //-------------------------------------------------------------------- // Закрытие реестрового ключа. RegCloseKey( hkResult ); //-------------------------------------------------------------------- // Заполнение таблицы. VTable.Version = 3; VTable.dwProvType = 75; VTable.pszProvName = sDefaultProviderName; VTable.cbContextInfo = 0; VTable.pbContextInfo = NULL; VTable.FuncReturnhWnd = &FunReturnHWnd; VTable.FuncVerifyImage = &FunVerifyImage; //-------------------------------------------------------------------- // Загрузка DLL. hModule = LoadLibrary(sDefaultFileName); if(hModule) { printf("LoadLibrary succeeded.\n"); } else { HandleError("A error runing LoadLibrary."); } //-------------------------------------------------------------------- // Получение адреса функции "CPAcquireContext". lpProcAcquire = (CPAcquireContext_t)GetProcAddress(hModule, "CPAcquireContext"); if(lpProcAcquire) { printf("GetProcAddress for CPAcquireContext succeeded.\n"); } else { HandleError("A error runing GetProcAddress."); } //-------------------------------------------------------------------- // Получение адреса функции "CPReleaseContext". lpProcRelease = (CPReleaseContext_t)GetProcAddress(hModule, "CPReleaseContext"); if(lpProcRelease) { printf("GetProcAddress for CPReleaseContext succeeded.\n"); } else { HandleError("A error runing GetProcAddress."); } //-------------------------------------------------------------------- // Вызов функции "CPAcquireContext". if(lpProcAcquire) { printf("CPAcquireContext succeeded.\n"); } else { HandleError("A error runing CPAcquireContext."); } //-------------------------------------------------------------------- // Выполнение криптографических операций. // ... //-------------------------------------------------------------------- // Вызов функции "CPReleaseContext". if(lpProcRelease) { printf("CPReleaseContext succeeded.\n"); } else { HandleError("A error runing CPReleaseContext."); } //-------------------------------------------------------------------- // Получение дескриптора провайдера. if(lpProcAcquire( &hProv, "Source", 0, &VTable )) { printf("A context has been acquired.\n"); } else { HandleError("A error runing CPAcquireContext."); } //-------------------------------------------------------------------- // Освобождение дескриптора провайдера. if(lpProcRelease( hProv, 0)) { printf("A context has been released.\n"); } else { HandleError("A error runing CPReleaseContext."); } printf("The program ran to completion without error. \n"); } // Конец main
Windows 2000/XP/2003: Необходимо Windows 2000 SP4 или
старше с Internet Explorer 6.0 или старше.
Windows NT/95/98/ME: CSP 3.0 не поддерживает (см. КриптоПро CSP
2.0 ).
Solaris: 9 Update 4 или выше.
FreeBSD: FreeBSD 5.2 или выше
Linux: RedHat 7.3, RedHad 9.0.
Ядро Windows NT: не поддерживает.
Что Вы
думаете по поводу данной статьи? |
Закажите CD c Крипто-Про CSP |