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

📄 getisn.cpp

📁 某CA中心电子签章插件(.dll)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GetISN.cpp : Implementation of CGetISN
#include "stdafx.h"
#include "GetSN.h"
#include "GetISN.h"
#include "SelDlg.h"
#include <comutil.h>
#include <wincrypt.h>
#include "xcos_eclib.h"
#include "xcos_eclibf.h"
#include "xcos_eclibt.h"
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "kernel32.lib")
#include "stdio.h"
char ByteToBase64(char code);
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH  0x00800000
#define ENCRYPT_ALGORITHM CALG_RC4 
/////////////////////////////////////////////////////////////////////////////
// CGetISN
//BSTR* rev1;
//BSTR* rev1;
STDMETHODIMP CGetISN::GetISNMethod(BSTR certctrl, BSTR *rev)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	HCRYPTKEY hKey; 
    HCRYPTHASH hHash; 
	HCRYPTPROV hCryptProv;
//	HCERTSTORE hSystemStore=NULL;
	PCCERT_CONTEXT pSignerCert = NULL;
	CRYPT_SIGN_MESSAGE_PARA  SigParams;
	DWORD cbSignedMessageBlob;
	BYTE  *pbSignedMessageBlob;
//	const BYTE* MessageArray[] = {(const unsigned char *)signedcontent};
	DWORD MessageSizeArray[1];
//	DWORD cbMessage=SysStringByteLen(signedcontent);
//	MessageSizeArray[0] = cbMessage;
	unsigned int i=0,j=0;
	char* base64code;
	char base;
	int cchWideChar;		// number of characters in string
	unsigned short*   lpWideCharStr=NULL;	// address of buffer for new string
    PCHAR szPassword;
    szPassword="plok5818";
	CRYPT_DATA_BLOB pPFX;
	HCERTSTORE hStore=NULL;
	byte* strc;
	BSTR password;
	password=certctrl;
//////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
	int disk=0;
	 CFile fp;
	 int r= fp.Open("a:/cqca.cde",CFile::modeRead);
     if(r==0)
	{
	   r= fp.Open("b:/cqca.cde",CFile::modeRead);
	   if(r==0)
	   {
          //MessageBox(NULL,"没有插入证书软盘!","提示信息",MB_OK | MB_ICONERROR );
		 // *rev=SysAllocString(L"sign false");
		  disk=0;
	     // return S_FALSE;
	   }
	}
	 if(r!=0)
	 {
		 disk=1;
	 }
///////////////////////////////////////////////////////////////////////////////////////////////
	char* pbData;
	HEKEY hEkey=NULL;	
	DWORD dwParam=EP_SERIAL_NUMBER;
    DWORD pdwDataLen=0;
	int ek=0;
	for(int n=0;n<=8;n++)
	{
       DWORD dwPort=n; 
	   DWORD state=0;
	   state=XC_ConnectEkey(dwPort,&hEkey);
	  
       if(state==0)
	   {
		  // 	MessageBox(NULL,"没有插入USB电子令牌或数字证书软磁盘!","提示信息",MB_OK | MB_ICONSTOP);
		    ek=1;
   			break;
	   }
	   if(n==8)
	   {
	        ek=0; 
		    if(disk==0)
			{
				MessageBox(NULL,"没有插入USB电子令牌或数字证书软磁盘!","提示信息",MB_OK | MB_ICONSTOP);
               *rev=SysAllocString(L"sign false");
			   return S_FALSE;
			}
	    	
	   }
	}
	
///////////////////////////////////////////////////////////////////////////////////////////////
if((disk==1)&&(ek==1))
{
	CSelDlg dlgsel;
//	int cout=0;
    int res=dlgsel.DoModal();
		if(res==IDCANCEL)
			 {
			     *rev=SysAllocString(L"user cancel");
				 return S_FALSE;
			 }
	LPCWSTR szstr=dlgsel.m_selstr.m_str;
	char *selstr=::_com_util::ConvertBSTRToString((unsigned short *)szstr);
//	MessageBox(NULL,selstr,"提示信息",MB_OK | MB_ICONSTOP);
	int w=strcmp(selstr,"diskok");
	if(w==0)
	{
      // MessageBox(NULL,"disk","提示信息",MB_OK | MB_ICONSTOP);
		ek=0;
	}
	else
	{ 
       //MessageBox(NULL,"ek","提示信息",MB_OK | MB_ICONSTOP);
		disk=0;
	}
    // return S_FALSE;
}
///////////////////////////////////////////////////////////////////////////////////////////////
if((disk==0)&&(ek==1))
{
   BYTE* pas=(BYTE*)::_com_util::ConvertBSTRToString(password);
  // MessageBox(NULL,"pas","提示信息",MB_OK | MB_ICONSTOP);
   DWORD plen=::SysStringByteLen(password);
   DWORD pn=XC_VerifyPin(hEkey,pas,plen,PF_USER);
   if(pn==XCR_OK)
   {
	  DWORD dwContainerNo=0;
	  HCONTAINER phContainer;
	  DWORD stat1;
	  stat1=XC_SetCurContainer(
	     hEkey,
	     dwContainerNo,
	     &phContainer);

      BYTE *pbPubKey;
	  DWORD pdwPubKeyLen;
      DWORD dwKeySpec=1;
	  DWORD stat;
	  stat=XC_ReadRSAPubKey(
	                    phContainer,
	                    NULL,	//standard DER
						&pdwPubKeyLen,
						RK_EXCHANGE_KEY
 	  );
      pbPubKey=new BYTE[pdwPubKeyLen];
      XC_ReadRSAPubKey(
					phContainer,
					pbPubKey,	//standard DER
					&pdwPubKeyLen,
					RK_EXCHANGE_KEY
					);
	  
	  	if(!CryptAcquireContext(
		&hCryptProv, 
		NULL, 
		"Microsoft Enhanced Cryptographic Provider v1.0",//"FTSafe ePass1000 RSA Cryptographic Service Provider",//"Microsoft Enhanced Cryptographic Provider v1.0"
		PROV_RSA_FULL, 
		0 ))
	{
		if(!CryptAcquireContext(
		   &hCryptProv, 
		   NULL, 
		   "Microsoft Enhanced Cryptographic Provider v1.0",//"FTSafe ePass1000 RSA Cryptographic Service Provider",//"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;
		}
		//return Error(_T("Shape must have between 3 and 100 sides"));
	}

	//-------------------------------------------------------------------
	// Open the MY system store using CertOpenStore.
	hStore = CertOpenStore(
		CERT_STORE_PROV_SYSTEM, // The system store will be a 
                             // virtual store.
		0,                      // Encoding type not need with this PROV.
		hCryptProv,                   // Accept the default HCRYPTPROV. 
		CERT_STORE_NO_CRYPT_RELEASE_FLAG|CERT_SYSTEM_STORE_CURRENT_USER,
                             // Set the system store location in the
                             // registry.
		L"MY");                // Could have used other predefined 
                             // system stores
                             // including Trust, CA, or Root.
	if(!hStore)
	{
		*rev=SysAllocString(L"sign false");
		return S_OK;
	}
	CERT_PUBLIC_KEY_INFO cpk;
    cpk.Algorithm.Parameters.cbData =NULL;
	cpk.Algorithm.pszObjId =szOID_RSA;
	cpk.PublicKey.cbData=pdwPubKeyLen;
	cpk.PublicKey.pbData=pbPubKey;
	//-------------------------------------------------------------------
	// Get a certificate that has the string "Microsoft" in its subject. 
	if(pSignerCert=CertFindCertificateInStore(  hStore, 
												  MY_ENCODING_TYPE, 
												  0,
												  CERT_FIND_PUBLIC_KEY,
												  &cpk,
												  NULL) )               // by the function.
	{  
		
	/*	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  SerialNumber;
	   
		char* ser;
		char* sern;
				if(CryptFormatObject(
							MY_ENCODING_TYPE,
							0,
							0,
							NULL,
							0,
							pSignerCert->pCertInfo ->SerialNumber .pbData ,
							pSignerCert->pCertInfo ->SerialNumber .cbData ,
							NULL,
							&SerialNumber.cbData ))
				{
					if(SerialNumber.pbData  = (BYTE *)malloc(SerialNumber.cbData ))
					{
						if(CryptFormatObject(
										MY_ENCODING_TYPE,
										0,
										0,
										NULL,
										0,
										pSignerCert->pCertInfo ->SerialNumber .pbData ,
										pSignerCert->pCertInfo ->SerialNumber .cbData ,
										SerialNumber.pbData ,
										&SerialNumber.cbData ))
						{
                           // SerialNumber.pbData[1]="2";
							
							ser=(char*)malloc(48);
							ser=::_com_util::ConvertBSTRToString((BSTR)SerialNumber.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]=ser[n];
							  t[1]=ser[n+1];
							  ser[n+1]=ser[46-n];
							  ser[n]=ser[46-n-1];
                              ser[46-n-1]=t[0];
							  ser[46-n]=t[1];
							  n=n+3;
							}
						   	n=24;
							  char t[2];
							  t[0]=NULL;
							  t[1]=NULL;
						      t[0]=ser[n];
							  t[1]=ser[n+1];
							  ser[n+1]=ser[46-n];
							  ser[n]=ser[46-n-1];
                              ser[46-n-1]=t[0];
							  ser[46-n]=t[1];
                        sern=(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
							{
							    sern[i]=ser[j];
							}
							
						}
						//	rev1=sern;
						 //  ::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;
				}
		char pszNameString[256];
        if(CertGetNameString(   
         pSignerCert,   
         CERT_NAME_SIMPLE_DISPLAY_TYPE,   
         0,
         NULL,   
         pszNameString,   
         128))
		   {
            // strcat(sern,"/+/");
		//	 strcat(sern,pszNameString);
			*rev=::_com_util::ConvertStringToBSTR(sern);
			sern=NULL;
			ser=NULL;
	    	free(ser);
         	free(sern);
		   }
         else
		 {
             *rev=SysAllocString(L"sign false");
			 return S_FALSE;
		 }

	}
   }
   else
   {
       MessageBox(NULL,"PIN码错误!","提示信息",MB_OK | MB_ICONSTOP);
	   *rev=SysAllocString(L"sign false");
	   return S_FALSE;
   }

}

///////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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