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

📄 viaccess.c

📁 在原来基础上新添加了对ST、V、I、C卡的处理
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
本代码仅作为学习研究之目的使用,请您于24小时内自觉将其删除,请勿应用于商业活动或其它赢利性活动中,
否则后果自负!
*/


/******************************************************
 * 文件名:viaccess.c
 * 功  能:处理VCA命令
 * 作  者:
 * 日  期:
 *****************************************************/



#include "viaccess.h"

static unsigned char aucViaEMMBuf8E[188];
static unsigned char aucViaEMMBuf8C[188];

static Viaccess_Info_t* pstViaInfo;



static Smart_ErrorCode_t via_transfer(Smart_Handle_t Handle,
								   U8*			    ins,
								   U16			   NumberToWrite,
								   U8*			   Response,
								   U16*			   Read,
								   U8* Status);
static bool via_get_ppua(Smart_Handle_t Handle);
static bool via_get_sn(Smart_Handle_t Handle);
static bool via_get_prov(Smart_Handle_t Handle);
static Smart_ErrorCode_t via_get_sa(Smart_Handle_t Handle);
static int via_get_cw(Smart_Handle_t Handle,
  			         U8*			  pECM,
			         U8*            pCW  );
static bool via_check_status(U8* pb);


/*-------------------------------------------------------------------*/
/*    函 数 名:via_init                                             */
/*    函数功能:viaccess初始化函数                                   */
/*    参    数:Handle: Smart卡句柄                                  */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:                                                     */
/*-------------------------------------------------------------------*/
bool via_init(Smart_Handle_t Handle)
{
	pstViaInfo = &viaccess;
	memset(pstViaInfo,0,sizeof(Viaccess_Info_t));

	if(!via_get_ppua(Handle))
	{
		printf("via init : get ppua failed !!\n");
		return false;
	}

	/* 读取文件信息(有多少个文件,除主文件之外每个文件对应一个服务商) */
	if(!via_get_prov(Handle))
	{
		printf("via init : get prog info failed !!\n");
		
		return false;
	}


	if(!via_get_sn(Handle))
	{
		printf("via init : get sn failed !!\n");
		
		//return false;
	}
	

	printf("Viaccess Init OK !!\n");

	return true;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_master_file                                      */
/*    函数功能:viaccess函数,选择主文件                             */
/*    参    数:Handle: Smart卡句柄                                  */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 希望读取得响应数据长度                 */
/*              Read: 实际读取的响应数据长度                         */
/*              Status: 操作结果(含出错代码、过程字节等)             */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_next_file                                        */
/*-------------------------------------------------------------------*/
static bool via_master_file(Smart_Handle_t Handle,
									  U8* Response,
									  U16 NumberToRead,
									  U16* Read,
									  U8* Status)
{
	Smart_ErrorCode_t error;
	U8 ins[5] = {0xca, 0xa4, 0x00, 0x00, 0x00};
	pstViaInfo->iPrgIndex = 0;
	error = via_transfer(Handle,ins,5,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_next_file                                        */
/*    函数功能:viaccess ca选择下一个文件命令                        */
/*    参    数:Handle: SmartCard句柄                                */
/*              Response_p: 存放智能卡命令响应的缓冲区头指针         */
/*              NumberToRead: 希望读到的响应长度                     */
/*              Read: 实际读取得响应数据长度                         */
/*              Status: 操作状态                                     */
/*    返 回 值:成功:true                                            */
/*              失败:false                                           */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_master_file                                      */
/*-------------------------------------------------------------------*/
static bool via_next_file(Smart_Handle_t Handle,
								   U8* Response,
								   U16 NumberToRead,
								   U16* Read,
								   U8* Status)
{
	Smart_ErrorCode_t error;
	U8 ins[5] = {0xca, 0xa4, 0x02, 0x00, 0x00};
	pstViaInfo->iPrgIndex++;
	error = via_transfer(Handle,ins,5,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_select_file                                      */
/*    函数功能:文件选择命令                                         */
/*    参    数:Handle: Smart卡句柄                                  */
/*              file: 文件编号                                       */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_master_file                                      */
/*              via_next_file                                        */
/*-------------------------------------------------------------------*/
static bool via_select_file(Smart_Handle_t Handle, 
									   U8* file,
									   U8* Response,
									   U16 NumberToRead,
									   U16* Read,
									   U8* Status)
{
	Smart_ErrorCode_t error;
	U8	ins[8] = {0xca, 0xa4, 0x04, 0x00, 0x03, 0xff, 0xff, 0xff};
	int i;
	for(i=0;i<pstViaInfo->iPrgCount;i++)
	{
		if(pstViaInfo->auPrgInfo[i][0] == file[0])
			if(pstViaInfo->auPrgInfo[i][1] == file[1])
				if(pstViaInfo->auPrgInfo[i][2] == file[2])
					break;
	}
	if(i >= pstViaInfo->iPrgCount)
	{
		/* Just use 0xF0 as a tag if file not found */
		Status[0] = 0xF0;
		return false;
	}
	if(pstViaInfo->iPrgIndex==i)
	{
		Status[0] = 0xFF;
		return true;
	}
	pstViaInfo->iPrgIndex = i;
	ins[5] = file[0];
	ins[6] = file[1];
	ins[7] = file[2];
	error = via_transfer(Handle,ins,8,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_request_data                                     */
/*    函数功能:读取特定长度的数据                                   */
/*    参    数:Handle: Smart卡句柄                                  */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:                                                     */
/*-------------------------------------------------------------------*/
static bool via_request_data(Smart_Handle_t Handle,
									   U8* Response,
									   U16 NumberToRead,
									   U16* Read,
									   U8* Status)
{
	Smart_ErrorCode_t error;
	U8	ins[5] = {0xca, 0xc0, 0x00, 0x00, 0x1a};
	error = via_transfer(Handle, ins,5,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_consulation                                  */
/*    函数功能:读取数据命令,通过该命令使用不同的参数可以从卡中读取  */
/*              不同的信息,如果命令正确卡将返回一段数据,其中第2个  */
/*              字节用于给出输出数据的长度,这些响应数据可以通过CA B8 */
/*              命令读取响应数据                                     */
/*    参    数:Handle: Smart卡句柄                                  */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*    命令说明:CA AC A5 00 00: 表示读取PPUA                         */
/*              CA AC A4 00 00: 表示读取卡号                         */
/*              CA AC A7 00 00: 读取授权信息                         */
/*              CA AC 06 00 00: 读取年龄等级                         */
/*              CA AC A9 00 04: 读取授权时间                         */
/*-------------------------------------------------------------------*/
static bool via_get_consultation(Smart_Handle_t Handle, 
										   U8* Response,
										   U16 NumberToRead,
										   U16* Read,
										   U8* Status,
										   U8 code, 
										   U8 len)
{
	Smart_ErrorCode_t error;
	U8	ins[5] = {0xCA, 0xAC, 0xFF, 0x00, 0xFF};
	ins[2] = code;
	ins[4] = len;
	error = via_transfer(Handle,ins,5,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_consulation_length                               */
/*    函数功能:读取数据长度                                         */
/*    参    数:Handle: Smart卡句柄                                  */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_get_consulation                                  */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
static bool via_consultation_length(Smart_Handle_t Handle,
											  U8* Response,
											  U16 NumberToRead,
											  U16* Read,
											  U8* Status)
{
	Smart_ErrorCode_t error;
	U8 ins[5] = {0xca, 0xb8, 0x00, 0x00, 0x02};
	error = via_transfer(Handle,ins,5,Response,Read,Status);
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_consulation_answer                               */
/*    函数功能:读取数据命令                                         */
/*    参    数:Handle: Smart卡句柄                                  */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
static bool via_consultation_answer(Smart_Handle_t Handle, 
											  U8* Response,
											  U16 NumberToRead,
											  U16* Read,
											  U8* Status,
											  U8 length)
{
	Smart_ErrorCode_t error;
	U8 ins[5] = {0xca, 0xb8, 0x00, 0x00, 0xff};
	ins[4] = length;
	error = via_transfer(Handle,ins,5,Response,Read,Status);

⌨️ 快捷键说明

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