| ||||
| ||||
Когда я копирую контейнер вместе с сертификатом, функция 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); | ||||
Ответы: | ||||
| ||||
1. Корректно ли завершились все предыдущие действия: сообщите пожалуйста размер извлекаемого сертификата и первые 5 байт сертификата в исходном контейнере. 2. Работает ли копирование контейнера в контрольной панели CSP? | ||||