static int capi_get_provname(CAPI_CTX *ctx, LPSTR *pname, DWORD *ptype, DWORD idx) { LPSTR name; DWORD len, err; CAPI_trace(ctx, "capi_get_provname, index=%d\n", idx); if (!CryptEnumProvidersA(idx, NULL, 0, ptype, NULL, &len)) { err = GetLastError(); if (err == ERROR_NO_MORE_ITEMS) return 2; CAPIerr(CAPI_F_CAPI_GET_PROVNAME, CAPI_R_CRYPTENUMPROVIDERS_ERROR); capi_adderror(err); return 0; } name = OPENSSL_malloc(len); if (!CryptEnumProvidersA(idx, NULL, 0, ptype, name, &len)) { err = GetLastError(); if (err == ERROR_NO_MORE_ITEMS) return 2; CAPIerr(CAPI_F_CAPI_GET_PROVNAME, CAPI_R_CRYPTENUMPROVIDERS_ERROR); capi_adderror(err); return 0; } *pname = name; CAPI_trace(ctx, "capi_get_provname, returned name=%s, type=%d\n", name, *ptype); return 1; }
impl(const std::string & token) : provider(token) { char buffer[80]; DWORD type; DWORD len; // Find the type of the provider for(DWORD i = 0; ; ++i) { len = sizeof(buffer); if(!CryptEnumProvidersA(i, NULL, 0, &type, buffer, &len)) { error("Could not find provider name"); } if(buffer == provider) { break; } } if(!CryptAcquireContextA(&hProv, NULL, provider.c_str(), type, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { error("Could not acquire CSP context"); } }