Advertisement
Shokedbrain

CryptEnumProviders extended

Feb 21st, 2022
1,724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <wincrypt.h>
  4. #include <iomanip>
  5. #include <vector>
  6. #include <map>
  7.  
  8. using std::cin;
  9. using std::cout;
  10. using std::string;
  11. using std::wcout;
  12. using std::vector;
  13. using std::map;
  14.  
  15. // вывод ошибок
  16. void ErrorHandling(string message)
  17. {
  18.     DWORD dw = GetLastError();
  19.     cout << "Error with: " << message << "\n";
  20.     cout << "Error code: " << dw << "\n";
  21. }
  22.  
  23.  
  24. int main()
  25. {
  26.     LPTSTR  pszName;
  27.     DWORD   dwType;
  28.     DWORD   cbName;
  29.     DWORD   dwIndex = 0;
  30.     LPTSTR  choseProvName; // выбранный провайдер пользователем
  31.     DWORD   choseProvType; // выбранный тип провайдера пользователем
  32.     vector<std::pair<LPTSTR, DWORD>> providersList;
  33.     // переменная содержит всех провайдеров после парсинга локальных значений
  34.  
  35.     // Цикл по перечисляемым провайдерам.
  36.     dwIndex = 0;
  37.     while (CryptEnumProviders(
  38.         dwIndex,     // in -- dwIndex
  39.         NULL,        // in -- pdwReserved- устанавливается в NULL
  40.         0,           // in -- dwFlags -- устанавливается в ноль
  41.         &dwType,     // out -- pdwProvType
  42.         NULL,        // out -- pszProvName -- NULL при первом вызове
  43.         &cbName      // in, out -- pcbProvName
  44.     ))
  45.     {
  46.         //  cbName - длина имени следующего провайдера.
  47.         //  Распределение памяти в буфере для восстановления этого имени.
  48.         pszName = static_cast<LPTSTR>(malloc(cbName));
  49.         if (!pszName)
  50.             ErrorHandling("malloc failed!");
  51.         memset(pszName, 0, cbName);
  52.         //  Получение имени типа провайдера.
  53.         if (CryptEnumProviders(
  54.             dwIndex++,
  55.             nullptr,
  56.             0,
  57.             &dwType,
  58.             pszName,
  59.             &cbName))
  60.         {
  61.             // красивый вывод данных
  62.             /* wcout << std::left << std::setw(sizeof(dwType)) << std::setfill(L' ') << dwType << "\n";
  63.             wcout << std::left << std::setw(sizeof(pszName)) << std::setfill(L' ') << pszName << "\n";
  64.             */
  65.             // парсим названия провайдера
  66.            
  67.             providersList.push_back(std::make_pair(pszName, dwType));
  68.         }
  69.         else
  70.         {
  71.             ErrorHandling("CryptEnumProviders");
  72.         }
  73.     }
  74.     cout << "\nfound providers\n";
  75.     for (size_t i = 0; i < providersList.size(); i++)
  76.     {
  77.         wcout << i << " " << providersList[i].first << " " << providersList[i].second << "\n";
  78.     }
  79.  
  80.     cout << "choose provider: ";
  81.     int choice = 0;
  82.     do
  83.     {
  84.         cin >> choice;
  85.         choseProvName = providersList[choice].first;
  86.         choseProvType = providersList[choice].second;
  87.         wcout << "Chose provider name: " << choseProvName << "\n";
  88.         wcout << "Chose provider type: " << choseProvType << "\n";
  89.  
  90.     } while (choice < 0 && choice > providersList.size());
  91.  
  92.  
  93.     // уже передаём параметр chosedProvName в CryptAcquireContext и т.д.
  94.  
  95.     HCRYPTPROV hCryptProv;
  96.     BYTE         pbData[16] = {}; // инициализируем переменную
  97.     if (CryptAcquireContext(
  98.         &hCryptProv,
  99.         nullptr,
  100.         choseProvName, // вот здесь передали имя провайдера
  101.         choseProvType, // вот здесь передали тип провайдера
  102.         CRYPT_VERIFYCONTEXT))
  103.     {
  104.         if (CryptGenRandom(
  105.             hCryptProv,
  106.             8,
  107.             pbData))
  108.         {
  109.             CryptReleaseContext(hCryptProv, 0);
  110.             cout << "Random sequence generated\n";
  111.             for (const auto a : pbData)
  112.                 cout << a;
  113.             cout << "\n";
  114.         }
  115.         else
  116.         {
  117.             CryptReleaseContext(hCryptProv, 0);
  118.             ErrorHandling("error with cryptgenrandom context");
  119.         }
  120.     }
  121.     else
  122.     {
  123.         ErrorHandling("error with cryptacquire context");
  124.     }
  125.     system("pause");
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement