Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <Windows.h>
- #include <wincrypt.h>
- #include <vector>
- using namespace std;
- void ErrorHandling(const string& message)
- {
- DWORD dw = GetLastError();
- cout << "Error with: " << message << "\n";
- cout << "Error code: " << dw << "\n";
- }
- wstring strToWide(string inp)
- {
- return wstring(inp.begin(), inp.end());
- }
- DWORD chooseProvType()
- {
- LPTSTR pszName;
- DWORD dwType;
- DWORD cbName;
- DWORD dwIndex = 0;
- LPTSTR choseProvName; // выбранный провайдер пользователем
- DWORD choseProvType; // выбранный тип провайдера пользователем
- vector<std::pair<LPTSTR, DWORD>> providersList;
- // переменная содержит всех провайдеров после парсинга локальных значений
- // Цикл по перечисляемым типам провайдеров.
- dwIndex = 0;
- while (CryptEnumProviderTypes(
- dwIndex, // in -- dwIndex
- nullptr, // in -- pdwReserved- устанавливается в NULL
- 0, // in -- dwFlags -- устанавливается в ноль
- &dwType, // out -- pdwProvType
- nullptr, // out -- pszProvName -- NULL при первом вызове
- &cbName // in, out -- pcbProvName
- ))
- {
- // cbName - длина имени следующего провайдера.
- // Распределение памяти в буфере для восстановления этого имени.
- pszName = static_cast<LPTSTR>(malloc(cbName));
- if (!pszName)
- ErrorHandling("malloc failed!");
- memset(pszName, 0, cbName);
- // Получение имени типа провайдера.
- if (CryptEnumProviderTypes(
- dwIndex++,
- nullptr,
- 0,
- &dwType,
- pszName,
- &cbName))
- {
- providersList.emplace_back(pszName, dwType);
- }
- else
- {
- ErrorHandling("CryptEnumProviderTypes");
- return -1;
- }
- }
- cout << "\nfound types provider\n";
- for (size_t i = 0; i < providersList.size(); i++)
- {
- wcout << i << " " << providersList[i].first << " " << providersList[i].second << "\n";
- }
- cout << "choose provider: ";
- int choice = 0;
- do
- {
- cin >> choice;
- } while (choice < 0 && choice > providersList.size());
- choseProvName = providersList[choice].first;
- choseProvType = providersList[choice].second;
- wcout << "Chose provider name: " << choseProvName << "\n";
- wcout << "Chose provider type: " << choseProvType << "\n";
- return choseProvType;
- }
- LPCWSTR chooseContainer(DWORD provType)
- {
- HCRYPTPROV hCryptProv; // дескриптор криптопровайдера
- DWORD cbContainerName{}; // Размер имени контейнера
- if (CryptAcquireContext(&hCryptProv,
- nullptr,
- nullptr,
- provType,
- CRYPT_VERIFYCONTEXT))
- {
- cout << "CryptAcquireContext successful\n";
- }
- else
- {
- ErrorHandling("CryptAcquireContext");
- return nullptr;
- }
- // Получение размера параметра
- if (CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, nullptr,
- &cbContainerName, CRYPT_FIRST))
- {
- cout << "CryptGetProvParam PP_ENUMCONTAINERS succeeded. \n";
- }
- else
- {
- ErrorHandling("CryptGetProvParam");
- return nullptr;
- }
- DWORD dwFlags = CRYPT_FIRST; // флаг для CryptGetProvParam
- vector <wstring> containers{};
- int index = 0;
- while (true)
- {
- string bufContainer(cbContainerName + 1, 0); // Имя контейнера
- DWORD dwContainerLen = cbContainerName;
- if (!CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,
- reinterpret_cast<BYTE*>(&bufContainer[0]), &dwContainerLen, dwFlags))
- {
- // при возникновении ошибки ERROR_NO_MORE_ITEMS
- // нумерация контейнеров криптопровайдера завершена
- if (ERROR_NO_MORE_ITEMS == GetLastError())
- {
- cout << "The end of the enumeration has been reached\n";
- }
- break;
- }
- wstring conName = strToWide(bufContainer);
- containers.push_back(conName);
- bufContainer.clear();// очищаем имя контейнера для следующего использования
- dwFlags = CRYPT_NEXT; // переключаем флаг для продолжения перечисления имён контейнеров
- //++index;
- }
- if (!containers.empty())
- {
- for (int i = 0; i < containers.size(); i++)
- {
- wcout << i << " " << containers.at(i) << "\n";
- }
- int choice = 0;
- cout << "enter choice: ";
- do { cin >> choice; } while (choice < 0 && choice > containers.size());
- wcout << "chose container: " << containers.at(choice) << "\n";
- return containers.at(choice).c_str();
- }
- else
- {
- cout << "list of containers is empty...\n";
- return nullptr;
- }
- }
- int main()
- {
- const DWORD provType = chooseProvType(); // выбираем тип криптопровайдера
- // --------------------------------------
- LPCWSTR containerName = chooseContainer(provType);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement