2011-10-15 73 views
1

我一直嘗試從PCCERT_CONTEXT獲取提供者名稱,因爲在我當前的項目中,我必須將所有來自智能卡的證書加載到我的程序中。而且在將來,我必須處理這些證書和一些任務,如更新證書,刪除證書。但是我有問題,我必須將CSP名稱和提供程序名稱與CryptAcquireContext映射到執行程序。而我目前對如何歸檔這個問題感到困惑,任何人都可以有一些指導來幫助我解決這個問題。 我嘗試CertGetCertificateContextProperty與dwPropId是CERT_KEY_PROV_INFO_PROP_ID但我無法獲得CRYPT_KEY_PROV_INFO。如何從PCCERT_CONTEXT獲取CSP的提供者名稱?

回答

1

如果我已經正確理解了你,下面的代碼片段顯示瞭如何從證書中提取關鍵提供者信息。

void trace(char* message, DWORD errorCode) 
{ 
    cout << message << errorCode; 
} 

std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext) 
{ 
    DWORD dwSize = 0;  
    BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                 CERT_KEY_PROV_INFO_PROP_ID, 
                 NULL, 
                 &dwSize); 
    if (!bIsSuccess) 
    { 
     trace("CertGetCertificateContextProperty failed with error: ", GetLastError()); 
     return L""; 
    } 

    PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize); 
    if (pKeyProvInfo == NULL) 
    { 
     trace("LocalAlloc failed with error:", GetLastError()); 
     return L""; 
    } 

    bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                CERT_KEY_PROV_INFO_PROP_ID, 
                pKeyProvInfo, 
                &dwSize); 

    std::wstring provName; 
    if (bIsSuccess) 
    { 
     provName = pKeyProvInfo->pwszProvName; 
    } 

    LocalFree(pKeyProvInfo); 

    return provName; 
} 
相關問題