Крипто-Про CSP |
//-------------------------------------------------------------------- // В примере используются функции CryptEnumProviderTypes, CryptEnumProviders, // CryptGetDefaultProvider и CryptGetProvParam. // Большинство из этих функций доступны только для версий Windows 2000 // и старше. // // Для корректной работы данного примера необходимо предварительно создать // контейнер с именем "OUR_Container" (например, при помощи программы // CreatingKeyContainer). //-------------------------------------------------------------------- void HandleError(char *s); void Wait(char *s); int main() { //-------------------------------------------------------------------- // Объявление и инициализация переменных. HCRYPTPROV hProv; // Дескриптор CSP LPTSTR pszName; DWORD dwType; DWORD cbName; DWORD dwIndex=0; BYTE *ptr; ALG_ID aiAlgid; DWORD dwBits; DWORD dwNameLen; CHAR szName[100]; // Распределены динамически BYTE pbData[1024];// Распределены динамически DWORD cbData=1024; DWORD dwIncrement = sizeof(DWORD); DWORD dwFlags=CRYPT_FIRST; CHAR *pszAlgType = NULL; BOOL fMore=TRUE; LPTSTR pbProvName; DWORD cbProvName; //-------------------------------------------------------------- // Печать заголовка перечисления типов провайдеров. printf("\n Listing Available Provider Types.\n"); printf("Provider type Provider Type Name\n"); printf("_____________ _____________________________________\n"); // Цикл по перечисляемым типам провайдеров. dwIndex = 0; while(CryptEnumProviderTypes( dwIndex, // in -- dwIndex NULL, // in -- pdwReserved- устанавливается в NULL 0, // in -- dwFlags -- устанавливается в ноль &dwType, // out -- pdwProvType NULL, // out -- pszProvName -- NULL при первом вызове &cbName // in, out -- pcbProvName )) { //-------------------------------------------------------------------- // cbName - длина имени следующего типа провайдера. // Распределение памяти в буфере для восстановления этого имени. pszName = (LPTSTR)malloc(cbName); if (!pszName) { HandleError("ERROR - malloc failed!"); } memset(pszName, 0, cbName); //-------------------------------------------------------------------- // Получение имени типа провайдера. if (CryptEnumProviderTypes( dwIndex++, NULL, 0, &dwType, pszName, &cbName)) { printf (" %4.0d %s\n",dwType, pszName); } else { HandleError("ERROR - CryptEnumProviders"); } free(pszName); } //-------------------------------------------------------------- // Печать заголовка перечисления провайдеров. printf("\n\n Listing Available Providers.\n"); printf("Provider type Provider Name\n"); printf("_____________ _____________________________________\n"); //---------------------------------------------------------------- // Цикл по перечисляемым провайдерам. dwIndex = 0; while(CryptEnumProviders( dwIndex, // in -- dwIndex NULL, // in -- pdwReserved- устанавливается в NULL 0, // in -- dwFlags -- устанавливается в ноль &dwType, // out -- pdwProvType NULL, // out -- pszProvName -- NULL при первом вызове &cbName // in, out -- pcbProvName )) { //-------------------------------------------------------------------- // cbName - длина имени следующего провайдера. // Распределение памяти в буфере для восстановления этого имени. pszName = (LPTSTR)malloc(cbName); if (!pszName) { HandleError("ERROR - malloc failed!"); } memset(pszName, 0, cbName); //-------------------------------------------------------------------- // Получение имени провайдера. if (CryptEnumProviders( dwIndex++, NULL, 0, &dwType, pszName, &cbName // pcbProvName -- длина pszName )) { printf (" %4.0d %s\n",dwType, pszName); } else { HandleError("ERROR - CryptEnumProviders"); } free(pszName); } // Конец цикла while printf("\n\nProvider types and provider names have been listed.\n"); Wait("Press Enter to continue."); //----------------------------------------------------------------- // Получение имени CSP, определенного для компьютера по умолчанию. // //--------------------------------------------------------------- // Получение длины имени провайдера по умолчанию. if (!(CryptGetDefaultProvider( 75, NULL, CRYPT_MACHINE_DEFAULT, NULL, &cbProvName))) { HandleError("Error getting the length of the default provider name."); } //--------------------------------------------------------------- // Распределение локальной памяти под имя провайдера по умолчанию. pbProvName = (LPTSTR)malloc(cbProvName); if (!pbProvName) { HandleError("Error during memory allocation for provider name."); } memset(pbProvName, 0, cbProvName); //--------------------------------------------------------------- // Получение имени провайдера по умолчанию. if (CryptGetDefaultProvider( 75, NULL, CRYPT_MACHINE_DEFAULT, pbProvName, &cbProvName)) { printf("The default provider name is %s\n\n",pbProvName); } else { HandleError("Getting the name of the provider failed."); } //----------------------------------------------------- // Получение криптографического контекста. if(!CryptAcquireContext( &hProv, "OUR_Container", NULL, 75, 0 // Если контейнер с именем "OUR_Container" существует. // В противном случае необходимо устаносить флаг // CRYPT_NEWKEYSET для создания контейнера с таким именем. )) { HandleError("Error during CryptAcquireContext!"); } //------------------------------------------------------ // Перечисление поддерживаемых алгоритмов. //------------------------------------------------------ // Печать заголовка таблицы, содержащей информацию об алгоритмах printf("\n Enumerating the supported algorithms\n\n"); printf(" Algid Bits Type Name Algorithm\n"); printf(" Length Name\n"); printf(" ________________________________________________________\n"); while(fMore) { //------------------------------------------------------ // Извлечение информации об алгоритме. if(CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &cbData, dwFlags)) { //----------------------------------------------------------- // Извлечение информации об алгоритме из буфера 'pbData'. dwFlags=0; ptr = pbData; aiAlgid = *(ALG_ID *)ptr; ptr += sizeof(ALG_ID); dwBits = *(DWORD *)ptr; ptr += dwIncrement; dwNameLen = *(DWORD *)ptr; ptr += dwIncrement; strncpy(szName,(char *) ptr, dwNameLen); //-------------------------------------------------------- // Определение типа алгоритма. switch(GET_ALG_CLASS(aiAlgid)) { case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt "; break; case ALG_CLASS_HASH: pszAlgType = "Hash "; break; case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange "; break; case ALG_CLASS_SIGNATURE: pszAlgType = "Signature"; break; default: pszAlgType = "Unknown "; } //------------------------------------------------------------ // Печать информации об алгоритме. printf(" %8.8xh %-4d %s %-2d %s\n", aiAlgid, dwBits, pszAlgType, dwNameLen, szName ); } else fMore=FALSE; } if(GetLastError() == ERROR_NO_MORE_ITEMS) { printf("\nThe program completed without error.\n"); } else { HandleError("Error reading algorithm!"); } } // Конец main void Wait(char *s) { char x; printf("%s",s); scanf("%c",&x); printf("\n\n\n\n\n\n\n\n\n"); }//Конец wait
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 |