⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getisn.cpp

📁 某CA中心电子签章插件(.dll)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
if(disk==1&&ek==0)
{
//	MessageBox(NULL,"PIN码错误!","提示信息",MB_OK | MB_ICONSTOP);
   	DWORD len=fp.GetLength();
	strc=(byte*)malloc(len);
	fp.Read(strc,len);
    fp.Close();
////////////////////////////////////////////////////////////////////////////////////////////////
    if(!CryptAcquireContext(
		&hCryptProv, 
		NULL, 
		"Microsoft Enhanced Cryptographic Provider v1.0",//"Microsoft Enhanced Cryptographic Provider v1.0"
		PROV_RSA_FULL, 
		0 ))
	{
		if(!CryptAcquireContext(
		   &hCryptProv, 
		   NULL, 
		   "Microsoft Enhanced Cryptographic Provider v1.0",//"Microsoft Enhanced Cryptographic Provider v1.0"
		   PROV_RSA_FULL, 
		   CRYPT_NEWKEYSET ))
		{
            MessageBox(NULL,"请插入电子令牌或是安装数字证书!","提示信息",MB_OK | MB_ICONINFORMATION);
			*rev=::SysAllocString(L"sign false");
			return S_FALSE;
		}

	}
/////////////////////////////////////////////////////////////////////////////////////////////////////
	if(!CryptCreateHash(
       hCryptProv, 
       CALG_MD5, 
       0, 
       0, 
       &hHash))
	{
		    MessageBox(NULL,"获取证书结构错误!","提示信息",MB_OK |MB_ICONERROR);
			*rev=SysAllocString(L"sign false");
			return S_FALSE;
	}
//--------------------------------------------------------------------
// Hash in the password data. 

	if(!CryptHashData(
       hHash, 
       (BYTE *)szPassword, 
       strlen(szPassword), 
       0)) 
	{
		MessageBox(NULL,"获取证书结构错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE; 
	}
	if(!CryptDeriveKey(
      hCryptProv, 
      ENCRYPT_ALGORITHM, 
      hHash, 
      KEYLENGTH, 
      &hKey))
	{ 
		MessageBox(NULL,"获取证书结构错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE; 
	}
	CryptDestroyHash(hHash); 
    hHash = 0; 
	if(!CryptDecrypt(
      hKey, 
      0, 
      true, 
      0, 
      strc, 
      &len))
	{
		MessageBox(NULL,"获取证书结构错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE; 
	}
/////////////////////////////////////////////////////////////////////////////////////////

	pPFX.pbData =strc;
	pPFX.cbData =len;

   hStore=PFXImportCertStore(
		&pPFX,
        password,
		CRYPT_EXPORTABLE);
//	SysFreeString(szPasswordb);
	if(hStore==NULL)
	{
      	//MessageBox(NULL,"密码错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"password error");
		return S_FALSE;
	}
	int cqcacertcount=0;
	char  pszNameString[256];
	char  pszNameString1[256];
    char issuerstr[256]="CN, CHONGQING, Chongqing Certificate Authority Center CO.LTD, Chongqing  CA";
	while(pSignerCert= CertEnumCertificatesInStore(
                                      hStore,
                                      pSignerCert)) 
	{
		if(CertGetNameString(   
                        pSignerCert,   
                        CERT_NAME_RDN_TYPE,   
                        CERT_NAME_ISSUER_FLAG,
                        NULL,   
                        pszNameString,   
                        128))
		 {
			int cmp=strcmp(pszNameString,issuerstr);
			if(cmp!=0)
			{

			}
			else
			{
				if(CertGetNameString(   
                        pSignerCert,   
                        CERT_NAME_SIMPLE_DISPLAY_TYPE,   
                        0,
                        NULL,   
                        pszNameString1,   
                        128))
				{
				    cqcacertcount++;
				}
			}
		 }
	}
	if(cqcacertcount>1)
	{
		MessageBox(NULL,"初始证书错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE;
	}
	if(cqcacertcount==0)
	{
		MessageBox(NULL,"请使用****CA中心颁发的数字证书!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE;
	}
///////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
	pSignerCert=NULL;
	BSTR username=::_com_util::ConvertStringToBSTR(pszNameString1);
    if(pSignerCert=CertFindCertificateInStore( hStore, 
												  MY_ENCODING_TYPE, 
												  0,
												  CERT_FIND_SUBJECT_STR,
												  username,
												  NULL) )               // by the function.
	{  
		SysFreeString(username);

		
	}
	else
	{
        MessageBox(NULL,"查找证书错误!","提示信息",MB_OK | MB_ICONERROR);
		*rev=SysAllocString(L"sign false");
		return S_FALSE;
	}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/*long Vertime=CertVerifyTimeValidity(NULL,pSignerCert->pCertInfo );
        if(Vertime!=0)
		{
			::MessageBox(NULL,"您的数字证书未生效或已过期,不能进行数字签名","提示",MB_OK | MB_ICONSTOP);
			*rev=SysAllocString(L"sign false");
			return S_FALSE;
		}*/
			CRYPT_INTEGER_BLOB  SerialNumber2;
	   
		char* ser2=NULL;
	//	char sern2[32];//=NULL;
				if(CryptFormatObject(
							MY_ENCODING_TYPE,
							0,
							0,
							NULL,
							0,
							pSignerCert->pCertInfo ->SerialNumber .pbData ,
							pSignerCert->pCertInfo ->SerialNumber .cbData ,
							NULL,
							&SerialNumber2.cbData ))
				{
					if(SerialNumber2.pbData  = (BYTE *)malloc(SerialNumber2.cbData ))
					{
						if(CryptFormatObject(
										MY_ENCODING_TYPE,
										0,
										0,
										NULL,
										0,
										pSignerCert->pCertInfo ->SerialNumber.pbData ,
										pSignerCert->pCertInfo ->SerialNumber.cbData ,
										SerialNumber2.pbData ,
										&SerialNumber2.cbData ))
						{
                           // SerialNumber.pbData[1]="2";
							
							ser2=(char*)malloc(48);
							ser2=::_com_util::ConvertBSTRToString((BSTR)SerialNumber2.pbData);
							int n=0;
						//	MessageBox(NULL,"取序列号错误!","提示信息",MB_OK | MB_ICONERROR );
						/*	for(n;n<=22;)
							{
							  char t[2];
						      t[0]=ser[n];
							  t[1]=ser[n+1];
							  ser1[n+1]=ser[46-n];
							  ser1[n]=ser[46-n-1];
                              ser1[46-n-1]=t[0];
							  ser1[46-n]=t[1];
							  n=n+3;
							}*/
						//	::MessageBox(NULL,ser,"提示",MB_OK | MB_ICONSTOP);
						   for(n=0;n<=24;)
							{
							  char t[2];
							  t[0]=NULL;
							  t[1]=NULL;
						      t[0]=ser2[n];
							  t[1]=ser2[n+1];
							  ser2[n+1]=ser2[46-n];
							  ser2[n]=ser2[46-n-1];
                              ser2[46-n-1]=t[0];
							  ser2[46-n]=t[1];
							  n=n+3;
							}
						   	n=24;
							  char t[2];
							  t[0]=NULL;
							  t[1]=NULL;
						      t[0]=ser2[n];
							  t[1]=ser2[n+1];
							  ser2[n+1]=ser2[46-n];
							  ser2[n]=ser2[46-n-1];
                              ser2[46-n-1]=t[0];
							  ser2[46-n]=t[1];
                     //   sern2=(char*)malloc(256);
						int i=0;
                        int j=0;
						for(i=0,j=0;(j<48)&&(i<32);i++,j++)
						{
			
							if((j==2)||(j==5)||(j==8)||(j==11)||(j==14)||(j==17)||(j==20)||(j==23)||(j==26)||(j==29)||(j==32)||(j==35)||(j==38)||(j==41)||(j==44))
							{
								i=i-1;
							}
							else
							{
							    sern2[i]=ser2[j];
							}
							
						}
					//	rev1=(char*)malloc(32);
						//rev1=sern2;	
						 //  ::MessageBox(NULL,ser,"提示",MB_OK | MB_ICONSTOP);

					
						}
						else
						{
							 MessageBox(NULL,"取序列号错误!","提示信息",MB_OK | MB_ICONERROR );
							 return S_FALSE;
						}
					}
					else
					{
						 MessageBox(NULL,"取序列号错误!","提示信息",MB_OK | MB_ICONERROR );
						 return S_FALSE;
					}
				}
				else
				{
				    MessageBox(NULL,"取序列号错误!","提示信息",MB_OK | MB_ICONERROR );
					return S_FALSE;
				}
	//	*rev1=::SysAllocString(L"PLOK");
			char pszNameString2[256];
        if(CertGetNameString(   
         pSignerCert,   
         CERT_NAME_SIMPLE_DISPLAY_TYPE,   
         0,
         NULL,   
         pszNameString2,   
         128))
		   {
		//	MessageBox(NULL,ser2,"提示信息",MB_OK | MB_ICONERROR );
            // strcat(sern2,"/+/");
			// strcat(sern2,pszNameString2);
		//	*rev1=::_com_util::ConvertStringToBSTR(sern2);
			*rev=::_com_util::ConvertStringToBSTR(sern2);
			
			ser2=NULL;
//			sern2=NULL;
	    	free(ser2);
         	free(sern2);
		   }
         else
		 {
             *rev=SysAllocString(L"sign false");
			 return S_FALSE;
		 }
}		
//////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////
	if(pbSignedMessageBlob)
		free(pbSignedMessageBlob);
    if(lpWideCharStr)
		free(lpWideCharStr);
	if(pSignerCert)
		CertFreeCertificateContext(pSignerCert);
    if(base64code)
		free(base64code);
	//--------------------------------------------------------------------
	// Release keystore handle.
/*	if(hSystemStore)
	{
	CertCloseStore(
			hSystemStore, 
			CERT_CLOSE_STORE_CHECK_FLAG);//CERT_CLOSE_STORE_CHECK_FLAG

	}*/
//	MessageBox(NULL,"pas","提示信息",MB_OK | MB_ICONSTOP);
	if(hStore)
	{
	CertCloseStore(
			hStore, 
			CERT_CLOSE_STORE_CHECK_FLAG);//CERT_CLOSE_STORE_CHECK_FLAG
	}
	
	if(pPFX.pbData)
	{
		free(pPFX.pbData);
	}

	if(strc)
	{
		free(strc);
	}
    
	//--------------------------------------------------------------------
	// Release provider handle. 
	if(hCryptProv)
	{
	CryptReleaseContext(hCryptProv, 0);
			
	}
	XC_DisconnectEkey( hEkey);
	return S_OK;
}

STDMETHODIMP CGetISN::get_SerNum(BSTR *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
    *pVal=::_com_util::ConvertStringToBSTR(sern2);
//	free(rev1);
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -