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