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

📄 sdfunc.cpp

📁 基于ppc的PKI_SD的一个小模块
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -