Задача - exit point для WebSphere MessageQueue для аутентификации и шифрования обмена при помощи КриптоПро CSP 3.6.
Пусть HCRYPTPROV hProv - дескриптор криптопровайдера, CERT_CONTEXT *rcrt - сертификат респондента.
Хочу получить ключ обмена. Для этого - получаю открытый ключ из сертификата респондента, экспортирую его в блоб, получаю свой закрытый ключ и с ним импортирую блоб.
Если отбросить проверки на успешность, подчистку ресурсов, логирование и прочее, оставив только общую идею, это выглядит примерно так:
HCRYPTKEY rpk;
CryptImportPublicKeyInfoEx(
hProv,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
&rcrt->pCertInfo->SubjectPublicKeyInfo,
CALG_GR3410EL, 0, NULL, &rpk);
BYTE* pData = null;
unsigned long szData = 0;
CryptExportKey(rpk, 0, PUBLICKEYBLOB, 0, pData, &(szData));
pData = new BYTE[szData];
CryptExportKey(rpk, 0, PUBLICKEYBLOB, 0, pData, &(szData));
HCRYPTKEY pk;
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &pk);
HCRYPTKEY exk;
CryptImportKey(hProv, pData, szData, pk, 0, &exk);
Последний вызов - CryptImportKey - возвращает 0. При этом GetLastError() выдаёт 0x8010006b - код, который обычно означает неправильный ввод пароля, пин-кода и т.д.
Соответственно, возникает вопрос - что же я делаю не так?
Спасибо!