| ||||
| ||||
Пытаюсь получить дескриптор криптопровайдера следующим образом: if (!CryptAcquireContext( &hProv, NULL, NULL, 71, CRYPT_VERIFYCONTEXT)) { dwStatus = GetLastError(); printf("CryptAcquireContext failed: %d\n", dwStatus); if (dwStatus==ERROR_INVALID_PARAMETER) ShowMessage("ERROR_INVALID_PARAMETER"); fclose(hFile); return dwStatus; } Во время выполнения программы происходит ошибка ERROR_INVALID_PARAMETER. В чём дело? | ||||
Ответы: | ||||
| ||||
КриптоПро CSP вообще установлен (если да - какой сборки)? Нет ли ошибок в журналах Win при перезагрузке? | ||||
| ||||
CryptoPRO 2.0 установлен сборки 2049. Ошибок нету. | ||||
| ||||
Пришлите экспортированный в файл раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults | ||||
| ||||
Кажется нужно указать название криптопровайдера, иначе по умолчанию. | ||||
| ||||
pszProvider [in] A null-terminated string that specifies the name of the CSP to be used. If this parameter is NULL, the user default provider is used. В Вашем случае нужно использовать криптопровайдер "Crypto-Pro GOST R 34.10-94 Cryptographic Service Provider" именно он поддерживает 71 тип."GOST GOST R 34.10-94 Signature with Diffie-Hellman Key Exchange" | ||||
| ||||
Мой комментарий. Если имя CSP - NULL, то используется параметр реестра Name из раздела HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type NNN, в данном случае HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type 071 | ||||
| ||||
Спасибо за информацию, будем знать. | ||||
| ||||
Может его нужно получить ручками из реестра и подставить? Есть специальная функция которая делает выбранный криптопровайдер действующим по умрлчанию. А с помощью этого CryptGetDefaultProvider получаем контекст провайдера по умолчанию. | ||||
| ||||
Для каждого типа CSP есть CSP по умолчанию (ставится либо при установке этого CSP либо потом ф-ей CryptSetProvider). Поэтому можно использовать NULL (если, конечно, руками в реестре не править...) | ||||