Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.11.2008(UTC) Сообщений: 31 Откуда: Ryazan
|
Выкладываю код, если явных проблем в нем нет и нужны будут сертификаты - выложу. Код:
bool Init()
{
LPCSTR pszCertNameOwn = "sens_mgV0U0f7";
LPCSTR pszCertNameOpposite = "CC.ESTYLE";
LPCWSTR pszLDAP = L"ldap:///< SID=S-1-5-21-1070260972-889993760-3969510834-3864>?userCertificate";
// Получение собственного сертификата
PCCERT_CONTEXT pCertContextOwn(NULL);
if( HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, NULL, CERT_STORE_READONLY_FLAG|CERT_SYSTEM_STORE_CURRENT_USER, "MY") )
{ // Find the certificate by CN.
pCertContextOwn = CertFindCertificateInStore( hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, pszCertNameOwn, NULL);
CertCloseStore(hCertStore, 0);
}
// Получение сертификата противоположной стороны
PCCERT_CONTEXT pCertContextOpp(NULL);
if ( HCERTSTORE hADCertStore = CertOpenStore(CERT_STORE_PROV_LDAP, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG, pszLDAP) )
{ // Find the certificate by CN.
pCertContextOpp = CertFindCertificateInStore( hADCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, pszCertNameOpposite, NULL);
CertCloseStore(hADCertStore, 0);
}
// Получение собственного закрытого ключа
HCRYPTKEY hOwnPrivate(NULL);
BOOL fCallerFreeProv(FALSE);
DWORD dwKeySpec(0);
HCRYPTPROV hProvider(0);
BOOL bOk = CryptAcquireCertificatePrivateKey(pCertContextOwn, CRYPT_ACQUIRE_USE_PROV_INFO_FLAG|CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProvider, &dwKeySpec, &fCallerFreeProv);
bOk = bOk && CryptGetUserKey(hProvider, dwKeySpec, &hOwnPrivate);
// Получение открытого ключа противоположной стороны
HCRYPTKEY hOppPublic(NULL);
bOk = bOk && CryptImportPublicKeyInfo(hProvider, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &(pCertContextOpp->pCertInfo->SubjectPublicKeyInfo), &hOppPublic);
// Генерация ключа согласования
HCRYPTKEY hAgree(0);
DWORD nBlobLen(0);
DWORD nErr(0);
if ( bOk && (bOk = CryptExportKey( hOppPublic, NULL, PUBLICKEYBLOB, 0, NULL, &nBlobLen)) )
{
LPBYTE pBuf = new byte [nBlobLen];
if ( bOk = CryptExportKey( hOppPublic, NULL, PUBLICKEYBLOB, 0, pBuf, &nBlobLen) )
{
if ( bOk = CryptImportKey( hProvider, pBuf, nBlobLen, hOwnPrivate, 0, &hAgree) )
{
ALG_ID ke_alg = CALG_PRO_EXPORT; // PRO_EXPORT алгоритм ключа согласования
bOk = bOk && CryptSetKeyParam( hAgree, KP_ALGID, (LPBYTE)&ke_alg, 0);
}
else
nErr = GetLastError();
}
}
return !!bOk;
}
|