Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.90 KB | None | 0 0
  1. #define UNIX
  2. #define LINUX
  3. #define SIZEOF_VOID_P 8
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include </opt/cprocsp/include/cpcsp/CSP_WinDef.h>
  7. #include </opt/cprocsp/include/cpcsp/CSP_WinCrypt.h>
  8. #include </opt/cprocsp/include/cpcsp/WinCryptEx.h>
  9. #include <cstring>
  10.  
  11. static void HandleError(char *s);
  12. static void CleanUp(void);
  13.  
  14. static HCRYPTPROV  hProv = 0;         // Дескриптор CSP
  15. static LPTSTR      pszName = NULL;
  16. static LPTSTR      pbProvName = NULL;
  17.  
  18. int main(void)
  19. {
  20.  
  21.     //--------------------------------------------------------------------
  22.     //  Объявление и инициализация переменных.
  23.  
  24.  
  25.     DWORD       dwType;
  26.     DWORD       cbName;
  27.     DWORD       dwIndex = 0;
  28.     BYTE        *ptr = NULL;
  29.     ALG_ID      aiAlgid;
  30.     DWORD       dwBits;
  31.     DWORD       dwNameLen;
  32.     CHAR        *szName; // Распределены динамически
  33.     BYTE        pbData[1024];// Распределены динамически
  34.     DWORD       cbData=1024;
  35.     DWORD       dwIncrement = sizeof(DWORD);
  36.     DWORD       dwFlags = CRYPT_FIRST;
  37.     CHAR        *pszAlgType = NULL;
  38.     BOOL        fMore = TRUE;
  39.     DWORD       cbProvName;
  40.  
  41.     //   Печать заголовка перечисления типов провайдеров.
  42.     printf("\n          Listing Available Provider Types.\n");
  43.     printf("Provider type      Provider Type Name\n");
  44.     printf("_____________    _____________________________________\n");
  45.  
  46.     // Цикл по перечисляемым типам провайдеров.
  47.     dwIndex = 0;
  48.     while(CryptEnumProviderTypes(
  49.         dwIndex,     // in -- dwIndex
  50.         NULL,        // in -- pdwReserved- устанавливается в NULL
  51.         0,           // in -- dwFlags -- устанавливается в ноль
  52.         &dwType,     // out -- pdwProvType
  53.         NULL,        // out -- pszProvName -- NULL при первом вызове
  54.         &cbName      // in, out -- pcbProvName
  55.         ))
  56.     {
  57.         //  cbName - длина имени следующего типа провайдера.
  58.         //  Распределение памяти в буфере для восстановления этого имени.
  59.         pszName = (LPTSTR)malloc(cbName);
  60.         if(!pszName)
  61.             //HandleError("ERROR - malloc failed!");
  62.  
  63.         memset(pszName, 0, cbName);
  64.  
  65.         //--------------------------------------------------------------------
  66.         //  Получение имени типа провайдера.
  67.  
  68.         if(CryptEnumProviderTypes(
  69.             dwIndex++,
  70.             NULL,
  71.             0,
  72.             &dwType,
  73.             pszName,
  74.             &cbName))
  75.         {
  76.             printf ("     %4.0d        %s\n",dwType, pszName);
  77.         }
  78.         else
  79.         {
  80.             //HandleError("ERROR - CryptEnumProviders");
  81.         }
  82.     }
  83.  
  84.     //   Печать заголовка перечисления провайдеров.
  85.     printf("\n\n          Listing Available Providers.\n");
  86.     printf("Provider type      Provider Name\n");
  87.     printf("_____________    _____________________________________\n");
  88.  
  89.     // Цикл по перечисляемым провайдерам.
  90.     dwIndex = 0;
  91.     while(CryptEnumProviders(
  92.         dwIndex,     // in -- dwIndex
  93.         NULL,        // in -- pdwReserved- устанавливается в NULL
  94.         0,           // in -- dwFlags -- устанавливается в ноль
  95.         &dwType,     // out -- pdwProvType
  96.         NULL,        // out -- pszProvName -- NULL при первом вызове
  97.         &cbName      // in, out -- pcbProvName
  98.         ))
  99.     {
  100.         //  cbName - длина имени следующего провайдера.
  101.         //  Распределение памяти в буфере для восстановления этого имени.
  102.         pszName = (LPTSTR)malloc(cbName);
  103.         if(!pszName)
  104.          //   HandleError("ERROR - malloc failed!");
  105.  
  106.         memset(pszName, 0, cbName);
  107.  
  108.         //  Получение имени провайдера.
  109.         if(CryptEnumProviders(
  110.             dwIndex++,
  111.             NULL,
  112.             0,
  113.             &dwType,
  114.             pszName,
  115.             &cbName     // pcbProvName -- длина pszName
  116.             ))
  117.         {
  118.             printf ("     %4.0d        %s\n",dwType, pszName);
  119.         }
  120.         else
  121.         {
  122.            // HandleError("ERROR - CryptEnumProviders");
  123.         }
  124.  
  125.     } // Конец цикла while
  126.  
  127.     printf("\n\nProvider types and provider names have been listed.\n");
  128.  
  129.     // Получение имени CSP, определенного для компьютера по умолчанию.
  130.  
  131.     // Получение длины имени провайдера по умолчанию.
  132.     if(!CryptGetDefaultProvider(
  133.         PROV_GOST_2001_DH,
  134.         NULL,
  135.         CRYPT_MACHINE_DEFAULT,
  136.         NULL,
  137.         &cbProvName))
  138.     {
  139.         //HandleError("Error getting the length of the default provider name.");
  140.     }
  141.  
  142.     // Распределение локальной памяти под имя провайдера по умолчанию.
  143.  
  144.     pbProvName = (LPTSTR)malloc(cbProvName);
  145.     if(!pbProvName)
  146.        // HandleError("Error during memory allocation for provider name.");
  147.  
  148.     memset(pbProvName, 0, cbProvName);
  149.  
  150.     // Получение имени провайдера по умолчанию.
  151.     if(CryptGetDefaultProvider(
  152.         PROV_GOST_2001_DH,
  153.         NULL,
  154.         CRYPT_MACHINE_DEFAULT,
  155.         pbProvName,
  156.         &cbProvName))
  157.     {
  158.         printf("The default provider name is %s\n\n",pbProvName);
  159.     }
  160.     else
  161.     {
  162.        // HandleError("Getting the name of the provider failed.");
  163.     }
  164.  
  165.     //-----------------------------------------------------
  166.     //  Получение криптографического контекста.
  167.  
  168.     if(!CryptAcquireContext(
  169.         &hProv,
  170.         NULL,
  171.         NULL,
  172.         PROV_GOST_2001_DH,
  173.         CRYPT_VERIFYCONTEXT))
  174.     {
  175.         //HandleError("Error during CryptAcquireContext!");
  176.     }
  177.  
  178.     //------------------------------------------------------
  179.     // Перечисление поддерживаемых алгоритмов.
  180.  
  181.     //------------------------------------------------------
  182.     // Печать заголовка таблицы, содержащей информацию об алгоритмах
  183.     printf("\n               Enumerating the supported algorithms\n\n");
  184.     printf("     Algid      Bits      Type        Name         Algorithm\n");
  185.     printf("                                     Length          Name\n");
  186.     printf("    ________________________________________________________\n");
  187.  
  188.     while(fMore)
  189.     {
  190.         //------------------------------------------------------
  191.         // Извлечение информации об алгоритме.
  192.  
  193.         if(CryptGetProvParam(hProv, PP_ENUMALGS, pbData, &cbData, dwFlags))
  194.         {
  195.             //-----------------------------------------------------------
  196.             // Извлечение информации об алгоритме из буфера 'pbData'.
  197.  
  198.             dwFlags=0;
  199.             ptr = pbData;
  200.             aiAlgid = *(ALG_ID *)ptr;
  201.             ptr += sizeof(ALG_ID);
  202.             dwBits = *(DWORD *)ptr;
  203.             ptr += dwIncrement;
  204.             dwNameLen = *(DWORD *)ptr;
  205.             ptr += dwIncrement;
  206.             //strncpy_s(szName, NAME_LENGTH, (char *) ptr, dwNameLen);
  207.             strncpy(szName, (char *) ptr, dwNameLen);
  208.             // Определение типа алгоритма.
  209.  
  210.             switch(GET_ALG_CLASS(aiAlgid)) {
  211.                 case ALG_CLASS_DATA_ENCRYPT: pszAlgType = "Encrypt  ";
  212.                     break;
  213.                 case ALG_CLASS_HASH:         pszAlgType = "Hash     ";
  214.                     break;
  215.                 case ALG_CLASS_KEY_EXCHANGE: pszAlgType = "Exchange ";
  216.                     break;
  217.                 case ALG_CLASS_SIGNATURE:    pszAlgType = "Signature";
  218.                     break;
  219.                 default:                     pszAlgType = "Unknown  ";
  220.             }
  221.  
  222.             // Печать информации об алгоритме.
  223.             printf("    %8.8xh    %-4d    %s     %-2d          %s\n",
  224.                 aiAlgid, dwBits, pszAlgType, dwNameLen, szName);
  225.         }
  226.         else
  227.             fMore = FALSE;
  228.     }
  229.  
  230.     if(GetLastError() == ERROR_NO_MORE_ITEMS)
  231.     {
  232.         printf("\nThe program completed without error.\n");
  233.     }
  234.     else
  235.     {
  236.        // HandleError("Error reading algorithm!");
  237.     }
  238.  
  239.     CleanUp();
  240.     return 0;
  241. }
  242.  
  243. void CleanUp(void)
  244. {
  245.     // Освобождение дескриптора провайдера.
  246.     if(hProv)
  247.         CryptReleaseContext(hProv, 0);
  248.     if(pszName)
  249.         free(pszName);
  250.     if(pbProvName)
  251.         free(pbProvName);
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement