📄 sdfunc.cpp
字号:
#include "StdAfx.h"
#include "SDFunc.h"
//#include "SD_MMC_Auth_API.h"
//说明:以下函数的返回值nResult如果为0表示成功,否则错误,错误码含义在SDFunc::GetSDErrMsg中。
//另,在SDFunc类中,改写了AppendChar,在VC6可以,不知到EVC里行不行。
int RemoteCallForUserData(UINT8 *UserDataBuf, UINT32 Len)
{
return 0;
}
SDFunc::SDFunc(void)
{
}
SDFunc::~SDFunc(void)
{
}
void SDFunc::AppendChar(WCHAR wchr,CString &str)
{
str+=wchr;
/*WCHAR *pstr=(WCHAR *) &str;
pstr[str.GetLength()/2]=wchr;
CString str1(pstr);
str=str1;*/
}
CString SDFunc::GetSDErrMsg(unsigned short int errNumber)
{
CString errStr=_T("");
if(0x63C0==(errNumber&0xfff0))
{
errStr.Format(_T("口令校验失败,剩余的可尝试的次数为%d"),errNumber&0xf);
}
switch(errNumber)
{
case 0x9300:
errStr=_T("卡片忙,请稍后重发该命令。卡片返回9300,说明当前卡片当前正在执行的运算没有结束。通常只有“取公钥数据”和“取私钥加密结果”这两个命令才会返回该错误码。");
break;
case 0x6983:
errStr=_T("口令已经锁定");
break;
case 0x6B00:
errStr=_T("数据参数错误");
break;
case 0x6A82:
errStr=_T("文件读写错误");
break;
case 0x6982:
errStr=_T("操作安全条件不满足(如没有校验口令)");
break;
case 0x6985:
errStr=_T("功能执行错误(包括运算错误、生成密钥错误等)");
break;
case 0x9850:
errStr=_T("预置的授权公私钥对已使用完毕(只有“生成非对称密钥对”命令才会返回该错误码)");
break;
case 0x6F00:
errStr=_T("无效的数据引用(例如:没有发生“私钥加密”指令就直接发送“取私钥加密结果”指令)");
break;
case 0x00F1:
errStr=_T("错误:返回数据长度0");
break;
case 0x00F2:
errStr=_T("错误:调用不成功");
break;
case 0x00F3:
errStr=_T("输入的加密数据的长度应为8的倍数,并且不能长度不能为0");
break;
case 0x00F4:
errStr=_T("输出的加密数据的长度不是8的倍数,请重试");
break;
case 0x00F5:
errStr=_T("输入的待解密数据的长度应为8的倍数");
break;
case 0x00F6:
errStr=_T("输出的解密后数据长度不是8的倍数,请重试");
break;
case 0x00F7:
errStr=_T("待加密的数据应为128字节数据");
break;
case 0x00F8:
errStr=_T("使用私钥加密后的数据,长度应为128字节");
break;
case 0x00F9:
errStr=_T("挑战码应为8字节");
break;
case 0x00FA:
errStr=_T("公钥的N部分为128字节,请重新输入");
break;
case 0x00FB:
errStr=_T("请输入PIN码!");
break;
case 0x00FC:
errStr=_T("使用SP的公钥加密后的数据(128字节)");
break;
default:
errStr=_T("系统出错,请重试");
}
return errStr;
}
unsigned short SDFunc::AuthPIN(CString sPIN)
{
unsigned short nResult=0xFFFF;
unsigned char Data[512];
unsigned long bRLen;
int len;
len = sPIN.GetLength ();
if( len <=0 )
return 0xFB;
Data[0]=0x8C;
SDFunc::CStringToHex(sPIN,&Data[2],len);
Data[1]=len;
bRLen=RemoteCallForUserData((byte *)Data,len+2);
if(bRLen==0)
{
nResult = 0x00F1;
}
else
{
if(Data[0]==0x8C&&0==Data[1])
{
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
char SDFunc::AscToChar( char ch1 )
{
if( ch1 <= '9' )
ch1 = ch1 - '0';
else
if( ch1 < 'a' )
ch1 = ch1 - 'A' + 0xa;
else
ch1 = ch1 - 'a' + 0xa;
return ch1;
}
void SDFunc::TrimSpace( CString &m_strTxt )
{
unsigned char ch1;
int i;
for( i=0; i<m_strTxt.GetLength(); i++ )
{
ch1 = toupper( m_strTxt.GetAt(i) );
if( !( (( ch1 >= '0' ) && ( ch1 <= '9' )) ||
(( ch1 >= 'A' ) && ( ch1 <= 'F' )) ) )
{
m_strTxt.Delete(i, 1);
i--;
}
else
m_strTxt.SetAt(i, ch1);
}
}
void SDFunc::CStringToHex( CString m_strTxt, unsigned char * hexCode, int &len )
{
unsigned char ch1, ch2;
int i;
TrimSpace(m_strTxt);
for( i=0; i<m_strTxt.GetLength()/2; i++ )
{
ch1 =AscToChar( (char)m_strTxt.GetAt(i*2) );
ch2 =AscToChar( (char)m_strTxt.GetAt(i*2+1) );
hexCode[i] = (ch1 << 4) | ch2;
}
len = i;
}
void SDFunc::CharToAsc(unsigned char ch1,char &ch2,char &ch3)//将一个字节转化为两个ASCALL码
{
ch2=ch1&0xf0;
ch2>>=4;
ch3=ch1&0x0f;
if((ch2<=0)&&(ch2>=9))
ch2+=48;
else ch2+=65;
if((ch3<=0)&&(ch3>=9))
ch3+=48;
else ch3+=65;
}
unsigned short SDFunc::GenOTP(int nOTPlen,CString &strData)
{
unsigned short nResult=0xFFFF;
unsigned char Data[512];
unsigned long bRLen;
int len;
Data[0]=0x89;
SDFunc::CStringToHex(strData,&Data[2],len);
Data[1]=len;
bRLen=RemoteCallForUserData((byte *)Data,len+2);
if(bRLen==0)
{
nResult =0xF1;
}
else
{
if(Data[0]==0x89)
{
for( int i = 0; i < Data[1] ; i ++)
{
SDFunc::AppendChar((WCHAR)Data[i+2],strData);
}
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
unsigned short SDFunc::GenerateKeys(CString &sResult) //生成密钥对
{
unsigned char Data[512]={0};
unsigned long bRLen;
char ch1,ch2;
unsigned short nResult=0xFFFF;
Data[0]=0x81;
Data[1]=0;
bRLen=RemoteCallForUserData((byte *)Data,2);
if(bRLen==0)
{
nResult =0x00F1;
}
else
{
if(Data[0]==0x81)
{
for( int i = 0; i < Data[1] ; i ++)
{
SDFunc::CharToAsc(Data[i+2],ch1,ch2);
SDFunc::AppendChar( (WCHAR)ch1,sResult);
SDFunc::AppendChar( (WCHAR)ch2,sResult);
}
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
unsigned short SDFunc::TDESEncrypt(CString strData,CString &sResult) // 3DES加密(CBC模式)
{
unsigned short nResult;
unsigned char Data[512];
unsigned long bRLen;
int len;
char ch1,ch2;
Data[0]=0x82;
//Data[1]=strData.GetLength()/4;
SDFunc::CStringToHex(strData,&Data[2],len);
Data[1]=len;
if((0!=(Data[1]%8))||(0==Data[1]))
{
nResult=0x00F3;
return nResult;
}
bRLen=RemoteCallForUserData((byte *)Data,len+2);
if(bRLen==0)
{
nResult =0x00F1;
}
else
{
if(0!=(Data[1]%8))
{
nResult=0x00F4;
return nResult;
}
if(Data[0]==0x82)
{
for( int i = 0; i < Data[1] ; i ++)
{
SDFunc::CharToAsc(Data[i+2],ch1,ch2);
SDFunc::AppendChar((WCHAR)ch1,sResult);
SDFunc::AppendChar((WCHAR)ch2,sResult);
}
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
unsigned short SDFunc::TDESDecrypt(CString strData,CString &sResult) //3DES解密(CBC模式)
{
unsigned short nResult;
unsigned char Data[512];
unsigned long bRLen;
int len;
char ch1,ch2;
Data[0]=0x83;
//Data[1]=strData.GetLength()/4;
SDFunc::CStringToHex(strData,&Data[2],len);
Data[1]=len;
if(0!=(Data[1]%8))
{
nResult=0x00F5;
return nResult;
}
bRLen=RemoteCallForUserData((byte *)Data,len+2);
if(bRLen==0)
{
nResult =0x00F1;
}
else
{
if(0!=(Data[1]%8))
{
nResult=0x00F6;
return nResult;
}
if(Data[0]==0x83)
{
for( int i = 0; i < Data[1] ; i ++)
{
SDFunc::CharToAsc(Data[i+2],ch1,ch2);
SDFunc::AppendChar((WCHAR)ch1,sResult);
SDFunc::AppendChar((WCHAR)ch2,sResult);
}
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
unsigned short SDFunc::GenerateDissymKeys(CString &sResult) //生成非对称密钥对
{
unsigned short nResult=0xFFFF;
unsigned char Data[512];
unsigned long bRLen;
Data[0]=0x84;
Data[1]=0;
bRLen=RemoteCallForUserData((byte *)Data,2);
if(bRLen==0)
{
nResult = 0x00F1;
}
else
{
if(Data[0]==0x84&&Data[2]==0x90&&Data[3]==0x00)
{
sResult=_T("开始生成密钥对");
nResult=0;
}
else if(0==(Data[0]&0xf0))
{
nResult=*((unsigned short*)(&Data[2]));
}
else
{
nResult=0xFFFF;
}
}
return nResult;
}
unsigned short SDFunc::GetPubKeyData(CString &sResult) //取公钥数据
{
unsigned short nResult;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -