PCCERT_CONTEXT DigiCrypt_FindContext(BOOL fByKeyContainer, DWORD *dwResult, DWORD* dwSelectedCert) { PCCERT_CONTEXT hCert = NULL; char *psCSPName; char *psDefaultKeyContainerName; //char buff[200]; oG_fDialogUserCancel = FALSE; oG_selectedCert=*dwSelectedCert; *dwResult = dDigiCrypt_Okey; lstrcpy(oG_sCSPName,""); lstrcpy(oG_sKeyContainerName,""); if (fByKeyContainer == TRUE) { hCert = DigiCrypt_ReadCertFromCard(); if (hCert == NULL) { psCSPName = DigiCrypt_GetFirstAllowedCSPNameNew(); if (psCSPName == NULL) *dwResult = dDigiCrypt_Error_NotFoundCSP; else { psDefaultKeyContainerName = DigiCrypt_GetDefaultKeyContainerName(oG_sCSPName); if (psDefaultKeyContainerName == NULL) *dwResult = dDigiCrypt_Error_NoDefaultKey; else hCert = DigiCrypt_SelectFromAllKeysCerts(oG_hProvider); } } } else { hCert = DigiCrypt_SelectFromAllCerts(); if (hCert != NULL) { DigiCrypt_GetDataFromCert(hCert); } *dwSelectedCert=oG_selectedCert; } if (hCert == NULL) { if (oG_fDialogUserCancel == TRUE) *dwResult = dDigiCrypt_Error_UserCancel; else { if (*dwResult == dDigiCrypt_Okey) *dwResult = dDIgiCrypt_Error_NotFoundCert; } } return(hCert); }
PCCERT_CONTEXT DigiCrypt_FindContext(BOOL fByKeyContainer, DWORD *dwResult) { PCCERT_CONTEXT hCert = NULL; char *psCSPName; char *psDefaultKeyContainerName; oG_fDialogUserCancel = FALSE; *dwResult = dDigiCrypt_Okey; memset(oG_sCSPName, 0, sizeof(oG_sCSPName)); memset(oG_sKeyContainerName, 0, sizeof(oG_sKeyContainerName)); if (fByKeyContainer == TRUE) { hCert = DigiCrypt_ReadCertFromCard(); //TEST //Test_ReadCertDataC(hCert); //ENDTEST if (hCert == NULL) { psCSPName = DigiCrypt_GetFirstAllowedCSPNameNew(); if (psCSPName == NULL) *dwResult = dDigiCrypt_Error_NotFoundCSP; else { psDefaultKeyContainerName = DigiCrypt_GetDefaultKeyContainerName(oG_sCSPName); if (psDefaultKeyContainerName == NULL) *dwResult = dDigiCrypt_Error_NoDefaultKey; else hCert = DigiCrypt_SelectFromAllKeysCerts(oG_hProvider); } } } else { hCert = DigiCrypt_SelectFromAllCerts(); if (hCert != NULL) DigiCrypt_GetDataFromCert(hCert); } if (hCert == NULL) { if (oG_fDialogUserCancel == TRUE) *dwResult = dDigiCrypt_Error_UserCancel; else { if (*dwResult == dDigiCrypt_Okey) *dwResult = dDIgiCrypt_Error_NotFoundCert; } } return(hCert); }
PCCERT_CONTEXT DigiCrypt_ReadCertFromCard(void) { HCRYPTPROV hCryptProv; BYTE *pbData = NULL; HCRYPTKEY hKey; DWORD cbData = 0; DWORD dwKeyType=0; DWORD dwErrCode=0; DWORD cspType=0; DWORD cspFlag=CRYPT_SILENT; char *psCspName = NULL; char *psKeyContainer; BOOL fRes = FALSE; PCCERT_CONTEXT pCertContext = NULL; CRYPT_KEY_PROV_INFO KeyProvInfo; LPWSTR wszContainerName=NULL; LPWSTR wszProvName=NULL; DWORD cchContainerName; DWORD cchCSPName; HCRYPTPROV hProv; DigiCrypt_ReleaseFirstAllowedCSP(); psCspName=DigiCrypt_GetFirstAllowedCSPNameNew(); //very dummy thing.. i check from csp creators why i should do so... if(!lstrcmp(psCspName,"EstEID Card CSP")) fRes = CryptAcquireContext(&hProv,"XXX",psCspName,2, CRYPT_SILENT); // end dummy// if (psCspName == NULL || strstr(psCspName,psData_Est_CSP_Name) == NULL) return(pCertContext); cspType=DigiCrypt_FindContext_GetCSPType(psCspName); psKeyContainer=DigiCrypt_GetDefaultKeyContainerName(psCspName); fRes = CryptAcquireContext(&hCryptProv,psKeyContainer,psCspName,cspType, CRYPT_SILENT); if (fRes == FALSE) return(pCertContext); fRes=CryptGetUserKey(hCryptProv, AT_SIGNATURE, &hKey); if (fRes == TRUE) { fRes=CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &cbData, 0); if (fRes == TRUE) { pbData = (unsigned char*)malloc(cbData); if (pbData == NULL) fRes = FALSE; } if (fRes == TRUE) fRes=CryptGetKeyParam(hKey, KP_CERTIFICATE, pbData, &cbData, 0); if (fRes == TRUE) { pCertContext = CertCreateCertificateContext(MY_ENCODING_TYPE,pbData,cbData); if (pCertContext != NULL) { wszContainerName=NULL; wszProvName=NULL; cchContainerName = (lstrlen(psKeyContainer) + 1) * sizeof(WCHAR); cchCSPName = (lstrlen(psCspName) + 1) * sizeof(WCHAR); wszContainerName = (LPWSTR) malloc(cchContainerName); wszProvName = (LPWSTR) malloc(cchCSPName); mbstowcs(wszContainerName, psKeyContainer,cchContainerName); mbstowcs(wszProvName, psCspName, cchCSPName); ZeroMemory((PVOID)&KeyProvInfo, sizeof(CRYPT_KEY_PROV_INFO)); KeyProvInfo.pwszContainerName = (LPWSTR) wszContainerName; KeyProvInfo.pwszProvName = (LPWSTR) wszProvName; KeyProvInfo.dwProvType = PROV_RSA_SIG; KeyProvInfo.dwFlags = 0; KeyProvInfo.dwKeySpec = dwKeyType; fRes = CertSetCertificateContextProperty(pCertContext,CERT_KEY_PROV_INFO_PROP_ID, 0, (const void *) &KeyProvInfo); if (wszContainerName != NULL) free(wszContainerName); if (wszProvName != NULL) free(wszProvName); } } } //if (pCertContext != NULL) // DigiCrypt_AddCertToStore(pCertContext); if (fRes == FALSE && pCertContext != NULL) { CertFreeCertificateContext(pCertContext); pCertContext = NULL; } if (pbData != NULL) free(pbData); if (hCryptProv != 0) CryptReleaseContext(hCryptProv, 0); return(pCertContext); }