static char *DigiCrypt_GetFirstAllowedCSPName(void) { char *psRes = NULL; HKEY hKey = NULL; LONG lRet=0; DWORD dwIndex = 0; BOOL fRes; char sProvName[dSTRING_ITEM_LEN+1]; char sKeyNameBuf[dSTRING_ITEM_LEN+1]; HCRYPTPROV hProvide = 0; DWORD dwBufLen; FILETIME oTime; //char buff[200]; BYTE pbData[dNAME_ITEM_LEN+1]; DWORD cbData=dNAME_ITEM_LEN+1; DWORD dwProvType; strncpy(sKeyNameBuf, psData_CSP_Path, sizeof(sKeyNameBuf)); lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,sKeyNameBuf,0, KEY_READ, &hKey); while (lRet == ERROR_SUCCESS) { dwBufLen = dSTRING_ITEM_LEN; lRet = RegEnumKeyEx(hKey,dwIndex,sProvName,&dwBufLen,NULL,NULL,0,&oTime); if (lRet == ERROR_SUCCESS) { if (lstrcmp(sProvName,psData_Ignore_CSP_Name) != 0) { dwProvType = DigiCrypt_FindContext_GetCSPType(sProvName); LOG("CSP %s",sProvName); if (lstrcmp(sProvName,psData_Extra_CSP_Name) != 0) fRes = OpenProvider(&hProvide, sProvName, CRYPT_SILENT); else { fRes = OpenProvider(&hProvide, sProvName, CRYPT_VERIFYCONTEXT); //fRes = CryptAcquireContext(&hProvide,"SetCARDKeyContainer",sProvName,dwProvType, CRYPT_SILENT); fRes = CryptAcquireContext(&hProvide,NULL,sProvName,dwProvType, CRYPT_VERIFYCONTEXT); if(fRes) { //the extra csp might give wrong answer. We should ask from provider, why. //The following is the work-around -- try to lookup key container from the card. //if the result is negative this is a not the csp what is needed. fRes=CryptGetProvParam(hProvide, PP_ENUMCONTAINERS, pbData, &cbData,CRYPT_FIRST); } } if (fRes == TRUE) { // && dwProvType == 2) //set global values LOG("CSP %s accepted",sProvName); strncpy(oG_sCSPName, sProvName, sizeof(oG_sCSPName)); CryptReleaseContext(hProvide, 0); psRes = oG_sCSPName; break; } } } //hProvide = 0; CryptReleaseContext(hProvide, 0); dwIndex++; } if (hKey != NULL) RegCloseKey(hKey); return(psRes); }
static char *DigiCrypt_GetDefaultKeyContainerNameSimple(char *psCSPName) { char *psRes = NULL; HCRYPTPROV hProvider=0; BOOL fRes; DWORD dwFlags = 0; BYTE pbData[dNAME_ITEM_LEN+1]; DWORD cbData = dNAME_ITEM_LEN; DWORD dwError; fRes = OpenProvider(&hProvider, psCSPName, dwFlags); //fRes = CryptAcquireContext(&hProvider,NULL,psCSPName,PROV_RSA_SIG, dwFlags); if (fRes == TRUE) { fRes = CryptGetProvParam(hProvider, PP_CONTAINER, pbData, &cbData, 0); if (fRes == FALSE) dwError = GetLastError(); } if (fRes == TRUE) { lstrcpy(oG_sKeyContainerName,(const char *)pbData); psRes = oG_sKeyContainerName; DigiCrypt_ChangeContainerName(oG_sKeyContainerName); } if (hProvider != 0) CryptReleaseContext(hProvider, 0); return(psRes); }
static PCCERT_CONTEXT DigiCrypt_SelectFromAllKeysCerts(HCRYPTPROV hProvider) { PCCERT_CONTEXT pCertContext = NULL; HCRYPTPROV hProv; BYTE pbData[dNAME_ITEM_LEN+1]; DWORD cbData = dNAME_ITEM_LEN; DWORD dwFlag; BOOL fRes; BOOL fRelease = FALSE; CRYPT_KEY_PROV_INFO* poKeyInfo = NULL; char sContainer[dNAME_ITEM_LEN+1]; hProv = hProvider; if (hProv == 0) { fRes = OpenProvider(&hProv, oG_sCSPName, CRYPT_VERIFYCONTEXT); //fRes = CryptAcquireContext(&hProv,NULL,oG_sCSPName,PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); if (fRes == FALSE) { LOG("Find1 - Can't open provider"); return(pCertContext); } fRelease = TRUE; } dwFlag = CRYPT_FIRST; fRes = TRUE; while (fRes == TRUE) { cbData = dNAME_ITEM_LEN; cbData = 0; fRes = CryptGetProvParam(hProv, PP_ENUMCONTAINERS, NULL, &cbData, dwFlag); if (fRes == TRUE) fRes = CryptGetProvParam(hProv, PP_ENUMCONTAINERS, pbData, &cbData, dwFlag); dwFlag = 0; if (fRes == FALSE) { if (GetLastError() == ERROR_NO_MORE_ITEMS) { LOG("Find1 End"); fRes = TRUE; break; } } else { LOG("Find1 select certs from %s",(char *)pbData); DigiCrypt_SelectCertsFromKeyContainer(hProv, (char *)pbData); } } pCertContext = RunDlg_RunDlg(); //we have selected the cert, but do we know corresponding key? //let change values of globals when these are different if (DigiCrypt_GetContainerFromCert(pCertContext, sContainer, dNAME_ITEM_LEN) == TRUE) { lstrcpy(oG_sKeyContainerName,sContainer); } if (fRelease == TRUE) CryptReleaseContext(hProv, 0); return(pCertContext); }