29.08.2007 16:41:50Внутренняя ошибка при копировании контейнера Ответов: 1
jar
Когда я копирую контейнер вместе с сертификатом, функция CryptSetKeyParam(KP_CERTIFICATE) возвращает ошибку NTE_FAIL (0x80090020).

Криптопровайдер: КриптоПро CSP KC2 3.0.3293
Токен: eToken PRO 32k
OS: Windows XP SP2

Как можно узнать, по какой причине попытка записать сертификат в контейнер возвращает Внутреннюю ошибку?

Вот участок кода, совершающего эту операцию:
(на последней функции валится)

CryptAcquireContext(&hProvOld, strOldName.c_str(), strProvName.c_str(), dwProvType, 0);
CryptSetProvParam(hProvNew, PP_KEYEXCHANGE_PIN, (BYTE*)strPinCode.c_str(), 0);
CryptSetProvParam(hProvOld, PP_KEYEXCHANGE_PIN, (BYTE*)strPinCode.c_str(), 0);
CryptGetProvParam(hProvOld, PP_HASHOID, NULL, &data_len, 0);
vecBuf.resize(data_len);
CryptGetProvParam(hProvOld, PP_HASHOID, &vecBuf[0], &data_len, 0);
CryptSetProvParam(hProvNew, PP_HASHOID, &vecBuf[0], 0);
data_len = 0;
CryptGetProvParam(hProvOld, PP_CIPHEROID, NULL, &data_len, 0);
vecBuf.resize(data_len);
CryptGetProvParam(hProvOld, PP_CIPHEROID, &vecBuf[0], &data_len, 0);
CryptSetProvParam(hProvNew, PP_CIPHEROID, &vecBuf[0], 0);
data_len = 0;
CryptGetUserKey( hProvOld, AT_KEYEXCHANGE, &hOldExchKey );
CryptGenKey(hProvOld, CALG_DH_EX_EPHEM, CRYPT_EXPORTABLE, &hOldEphemKey);
CryptGenKey(hProvNew, CALG_DH_EX_EPHEM, CRYPT_EXPORTABLE | CRYPT_PREGEN, &hNewEphemKey);
CryptGetKeyParam(hOldEphemKey, KP_DHOID, NULL, &dwBlobLen, 0);
vecBuf.resize(dwBlobLen);
CryptGetKeyParam(hOldEphemKey, KP_DHOID, &vecBuf[0], &dwBlobLen, 0);
CryptSetKeyParam(hNewEphemKey, KP_DHOID, &vecBuf[0], 0);
CryptSetKeyParam(hNewEphemKey, KP_X, NULL, 0);
CryptExportKey(hOldEphemKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen );
vecBuf.resize(dwBlobLen);
CryptExportKey(hOldEphemKey, 0, PUBLICKEYBLOB, 0, &vecBuf[0], &dwBlobLen );
CryptImportKey(hProvNew, &vecBuf[0], dwBlobLen, hNewEphemKey, 0, &hNewAgreeKey);
CryptExportKey(hNewEphemKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen );
vecBuf.resize(dwBlobLen);
CryptExportKey(hNewEphemKey, 0, PUBLICKEYBLOB, 0, &vecBuf[0], &dwBlobLen );
CryptImportKey(hProvOld, &vecBuf[0], dwBlobLen, hOldEphemKey, 0, &hOldAgreeKey);
CryptSetKeyParam(hOldAgreeKey, KP_ALGID, (BYTE*)&cAlg, 0);
CryptSetKeyParam(hNewAgreeKey, KP_ALGID, (BYTE*)&cAlg, 0);
CryptExportKey(hOldExchKey, hOldAgreeKey, PRIVATEKEYBLOB, 0, NULL, &dwBlobLen );
vecBuf.resize(dwBlobLen);
CryptExportKey(hOldExchKey, hOldAgreeKey, PRIVATEKEYBLOB, 0, &vecBuf[0], &dwBlobLen );
CryptImportKey(hProvNew, &vecBuf[0], dwBlobLen, hNewAgreeKey, 0, &hNewExchKey);
CryptExportKey(hOldExchKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen );
vecBuf.resize(dwBlobLen);
CryptExportKey(hOldExchKey, 0, PUBLICKEYBLOB, 0, &vecBuf[0], &dwBlobLen );
CryptImportKey(hProvNew, &vecBuf[0], dwBlobLen, 0, 0, &hNewExchKey);
CryptGetKeyParam(hOldExchKey, KP_CERTIFICATE, NULL, &dwBlobLen, 0);
vecBuf.resize(dwBlobLen);
CryptGetKeyParam(hOldExchKey, KP_CERTIFICATE, &vecBuf[0], &dwBlobLen, 0));
PCCERT_CONTEXT pCertContext = CertCreateCertificateContext(MY_ENCODING_TYPE, &vecBuf[0], dwBlobLen);
CryptSetKeyParam(hNewExchKey, KP_CERTIFICATE, pCertContext->pbCertEncoded, 0);
 
Ответы:
30.08.2007 15:40:49Александр
1. Корректно ли завершились все предыдущие действия: сообщите пожалуйста размер извлекаемого сертификата и первые 5 байт сертификата в исходном контейнере.
2. Работает ли копирование контейнера в контрольной панели CSP?