Advertisement
Shokedbrain

Choosing CryptProvider via switch

Feb 17th, 2022
1,766
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  chosedProvName; // выбранный провайдер пользователем
  31.     DWORD   cbProvName;
  32.  
  33.     /*LPCTSTR provName = nullptr;
  34.     provName = MS_STRONG_PROV;
  35.     wcout << provName << "\n";*/
  36.  
  37.     // переменная содержит всех провайдеров после парсинга локальных значений
  38.     vector<LPTSTR> providersList{};
  39.     // Цикл по перечисляемым провайдерам.
  40.     dwIndex = 0;
  41.     while (CryptEnumProviders(
  42.         dwIndex,     // in -- dwIndex
  43.         NULL,        // in -- pdwReserved- устанавливается в NULL
  44.         0,           // in -- dwFlags -- устанавливается в ноль
  45.         &dwType,     // out -- pdwProvType
  46.         NULL,        // out -- pszProvName -- NULL при первом вызове
  47.         &cbName      // in, out -- pcbProvName
  48.     ))
  49.     {
  50.         //  cbName - длина имени следующего провайдера.
  51.         //  Распределение памяти в буфере для восстановления этого имени.
  52.         pszName = static_cast<LPTSTR>(malloc(cbName));
  53.         if (!pszName)
  54.             ErrorHandling("malloc failed!");
  55.         memset(pszName, 0, cbName);
  56.         //  Получение имени типа провайдера.
  57.         if (CryptEnumProviders(
  58.             dwIndex++,
  59.             NULL,
  60.             0,
  61.             &dwType,
  62.             pszName,
  63.             &cbName))
  64.         {
  65.             // красивый вывод данных
  66.             /*wcout << std::left << std::setw(sizeof(dwType)) << std::setfill(L' ') << dwType;
  67.             wcout << std::left << std::setw(sizeof(pszName)) << std::setfill(L' ') << pszName << "\n";
  68.             */
  69.             // парсим названия провайдера
  70.             providersList.push_back(pszName);
  71.         }
  72.         else
  73.         {
  74.             ErrorHandling("CryptEnumProviders");
  75.         }
  76.     }
  77.     cout << "\nfound providers\n";
  78.     for (size_t i = 0; i < providersList.size(); i++)
  79.     {
  80.         wcout << i << " " << providersList[i] << "\n";
  81.     }
  82.  
  83.     cout << "choose provider: ";
  84.     int choice = 0;
  85.     do
  86.     {
  87.         cin >> choice;
  88.         chosedProvName = providersList[choice];
  89.         wcout << chosedProvName << "\n";
  90.  
  91.     } while (choice < 0 && choice > providersList.size());
  92.  
  93.  
  94.     // уже передаём параметр chosedProvName в CryptAcquireContext и т.д.
  95.     system("pause");
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement