📄 getisn.cpp
字号:
// 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 + -