Возможная ошибка в CSP.
В продолжение темы:
1) Есть 4 контейнера в реестре и 4 их копии на токене (пока без сертификатов в контейнерах) все контейры(8) имееют разные имена
2) в контейнеры в реесте скопированы сертификаты с помощью
csptest -property -setcert -provtype CProCSP -container "petrov_new_reestr" -cert "petrov" -store user -storename my
3) далее произведена таже операция (копирование тех же 4х сертификатов) с контейнерами на токене,
4) сертификаты удалены из хранилища MY.
5) Токен удален из системы
Далее программа производит следующие действия:
CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
providerID,
CRYPT_VERIFYCONTEXT);
HANDLE hStore = CertOpenStore(
CERT_STORE_PROV_MEMORY,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
hCryptProv,
0,
NULL);
Перебираем контейнеры(причем получаем естественно только список контейнеров в реестре)
BOOL res = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, pContainerName, &containerNameSize, CRYPT_FIRST);
while(res)
{
Получаем сертификат в контейнере
HCRYPTKEY hKey = NULL;
CryptGetUserKey(hCP, AT_SIGNATURE, &hKey);
if(hKey==NULL)
CryptGetUserKey(hCP, AT_KEYEXCHANGE, &hKey);
...
CryptGetKeyParam(.., KP_CERTIFICATE, ...)
...
Создаем контекст сертификата
...
Связывает с закрытым ключом
...
CRYPT_KEY_PROV_INFO provInfo;
ZeroMemory(&provInfo, sizeof(CRYPT_KEY_PROV_INFO));
provInfo.dwProvType = 75;
provInfo.pwszContainerName = containerName;
provInfo.pwszProvName=L"Crypto-Pro GOST R 34.10-94 Cryptographic Service Provider";
CertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &provInfo);
...
Добавляем сертификат в хранилище в памяти
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL)
res = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, pContainerName, &containerNameSize, CRYPT_NEXT);
}
Далее при попытке вызова
CryptDecryptMessage
Появляется окно CSP c просьбой вставить токен....что странно