Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}