Advertisement
Shokedbrain

CryptEnumProviders with CryptGenRandom

Feb 21st, 2022
137
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.  
  32.     // переменная содержит всех провайдеров после парсинга локальных значений
  33.     vector<LPTSTR> providersList{};
  34.     // Цикл по перечисляемым провайдерам.
  35.     dwIndex = 0;
  36.     while (CryptEnumProviders(
  37.         dwIndex,     // in -- dwIndex
  38.         NULL,        // in -- pdwReserved- устанавливается в NULL
  39.         0,           // in -- dwFlags -- устанавливается в ноль
  40.         &dwType,     // out -- pdwProvType
  41.         NULL,        // out -- pszProvName -- NULL при первом вызове
  42.         &cbName      // in, out -- pcbProvName
  43.     ))
  44.     {
  45.         //  cbName - длина имени следующего провайдера.
  46.         //  Распределение памяти в буфере для восстановления этого имени.
  47.         pszName = static_cast<LPTSTR>(malloc(cbName));
  48.         if (!pszName)
  49.             ErrorHandling("malloc failed!");
  50.         memset(pszName, 0, cbName);
  51.         //  Получение имени типа провайдера.
  52.         if (CryptEnumProviders(
  53.             dwIndex++,
  54.             NULL,
  55.             0,
  56.             &dwType,
  57.             pszName,
  58.             &cbName))
  59.         {
  60.             // красивый вывод данных
  61.             /*wcout << std::left << std::setw(sizeof(dwType)) << std::setfill(L' ') << dwType;
  62.             wcout << std::left << std::setw(sizeof(pszName)) << std::setfill(L' ') << pszName << "\n";
  63.             */
  64.             // парсим названия провайдера
  65.             providersList.push_back(pszName);
  66.         }
  67.         else
  68.         {
  69.             ErrorHandling("CryptEnumProviders");
  70.         }
  71.     }
  72.     cout << "\nfound providers\n";
  73.     for (size_t i = 0; i < providersList.size(); i++)
  74.     {
  75.         wcout << i << " " << providersList[i] << "\n";
  76.     }
  77.  
  78.     cout << "choose provider: ";
  79.     int choice = 0;
  80.     do
  81.     {
  82.         cin >> choice;
  83.         choseProvName = providersList[choice];
  84.         wcout << "Chosen provider: " << choseProvName << "\n";
  85.  
  86.     } while (choice < 0 && choice > providersList.size());
  87.  
  88.  
  89.     // уже передаём параметр chosedProvName в CryptAcquireContext и т.д.
  90.  
  91.     HCRYPTPROV hCryptProv;
  92.     BYTE         pbData[16] = {}; // инициализируем переменную
  93.     if (CryptAcquireContext(
  94.         &hCryptProv,
  95.         nullptr,
  96.         choseProvName, // вот здесь передали провайдера
  97.         PROV_RSA_FULL,
  98.         CRYPT_VERIFYCONTEXT))
  99.     {
  100.         if (CryptGenRandom(
  101.             hCryptProv,
  102.             8,
  103.             pbData))
  104.         {
  105.             CryptReleaseContext(hCryptProv, 0);
  106.             cout << "Random sequence generated\n";
  107.             for (const auto a : pbData)
  108.                 cout << a;
  109.             cout << "\n";
  110.         }
  111.         else
  112.         {
  113.             CryptReleaseContext(hCryptProv, 0);
  114.             ErrorHandling("error with cryptgenrandom context");
  115.         }
  116.     }
  117.     else
  118.     {
  119.         ErrorHandling("error with cryptacquire context");
  120.     }
  121.     system("pause");
  122.     return 0;
  123. }
Advertisement
RAW Paste Data Copied
Advertisement