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

📄 viaccess.c

📁 在原来基础上新添加了对ST、V、I、C卡的处理
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(error == SMC_NO_ERROR)
		return via_check_status(Status);
	return false;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_prov                                          */
/*    函数功能:读取服务商信息                                       */
/*    参    数:Handle: Smart卡句柄                                  */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
static bool via_get_prov(Smart_Handle_t Handle)
{
	int iProgCount=0;
	U16 Read;
	U8 Response[254];
	U8 Status[2];
	iProgCount = 0;
	if(!via_master_file(Handle,Response,0,&Read,Status))
	{
		printf("via get prog info failed : select file failed !!\n");
		return false;
	}
	while(Status[1] == 0)
	{
		printf("ProgCount = %d\n",pstViaInfo->iPrgCount);
		if(via_request_data(Handle,Response,0,&Read,Status))
		{
			printf("Prog %d : %02x %02x %02x\n",iProgCount,Response[0],Response[1],Response[2]);
			memcpy(pstViaInfo->auPrgInfo[pstViaInfo->iPrgCount],Response,3);
			pstViaInfo->auPrgInfo[pstViaInfo->iPrgCount][2] &= 0xF0;
			pstViaInfo->iPrgCount++;
			iProgCount++;
			if(pstViaInfo->iPrgCount>MAX_VIA_PROV_COUNT)
				break;
		}
		else
		{
			printf("via get prov info failed !!\n");
			return false;
		}

		if(!via_next_file(Handle,Response,0,&Read,Status))
		{
			/*printf("select next file failed !!\n");*/
			break;
		}
	}
	if(iProgCount<=10)
		via_get_sa(Handle);
	printf("ProgCount = %d\n",pstViaInfo->iPrgCount);
	return true;
}

static Smart_ErrorCode_t via_get_sa(Smart_Handle_t Handle)
{
	int iProgIndex;
	U16 Read;
	U8 Response[254],len;
	U8 Status[2] = {0,0};
	iProgIndex = 0;
	if(!via_master_file(Handle,Response,0,&Read,Status))
	{
		printf("via get prog info failed : select file failed !!\n");
		return false;
	}
	while(Status[1] == 0)
	{
		/* Read SA */
		if(via_get_consultation(Handle,Response,0,&Read,Status,0xA5,0x00))
		{
			if(via_consultation_length(Handle,Response,0,&Read,Status))
			{
				len = Response[1];
				if(via_consultation_answer(Handle,Response,0,&Read,Status,len))
				{
					printf("SA : %02x %02x %02x %02x\n",Response[0],Response[1],Response[2],Response[3]);
					memcpy(pstViaInfo->auSA[iProgIndex],Response,4);
					pstViaInfo->ucViaSCCustWp = Response[5];
				}
			}
		}
		iProgIndex++;
		if(!via_next_file(Handle,Response,0,&Read,Status))
			break;
	}
	return SMC_NO_ERROR;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_df_info                                      */
/*    函数功能:读取某个文件的某个信息(调用CA AC命令实现)            */
/*    参    数:Handle: Smart卡句柄                                  */
/*              param: 命令参数                                      */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:                                                     */
/*-------------------------------------------------------------------*/
static bool via_get_df_info(Smart_Handle_t Handle,
									   U8* param,
									   U8* Response,
									   U16* Read,
									   U8* Status)
{
	int length;
	bool bRet;
	int tmplen=0;
	if((param[0]==0)&&(param[1]==0)&&(param[2]==0))
	 	bRet = via_master_file(Handle,Response,0,Read,Status);
	else
		bRet = via_select_file(Handle,param,Response,0,Read,Status);
	if(bRet == false)
	{
		printf("via get info failed : select file failed !!\n");
		return false;
	}
	if(!via_get_consultation(Handle,Response,0,Read,Status,param[3],param[4]))
	{
		printf("via get consulation failed !!\n");
		return false;
	}
	if(!via_consultation_length(Handle,Response,0,Read,Status))
	{
		printf("via get consulation length failed !!\n");
		return false;
	}
	length = Response[1];
	tmplen = length;
	{
		if(via_consultation_answer(Handle,Response,0,Read,Status,tmplen-1))
		{
			if(!via_consultation_answer(Handle,Response+tmplen-1,0,Read,Status,1))
			{
				printf("via get consulation answer failed !!\n");
				return false;
			}
		}else
		{
			printf("via get consulation answer failed !!\n");
			return false;
		}
	}
	return true;
}
/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_sn                                           */
/*    函数功能:读取卡号                                             */
/*    参    数:Handle: Smart卡句柄                                  */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
bool via_get_sn(Smart_Handle_t Handle)
{
	U8 param[5];
	U8 Response[254];
	U16 Read;
	U8 Status[2];
	memset(param,0,5);
	param[3] = 0xA4;
	if(!via_get_df_info(Handle,param,Response,&Read,Status))
	{
		printf("via get sn failed !!\n");
		return false;
	}
	pstViaInfo->uCardNumber = (Response[1] << 24) + (Response[2] << 16) + (Response[3] << 8) + Response[4];
	printf("SN = %u\n",pstViaInfo->uCardNumber);
	return true;
}

bool via_get_ppua(Smart_Handle_t Handle)
{
	unsigned char insac[] = { 0xca, 0xac, 0x00, 0x00, 0x00 }; /* select data */
	unsigned char insb8[] = { 0xca, 0xb8, 0x00, 0x00, 0x02 }; /* read selected data */
	unsigned char Response[256];
	U16 Read;
	U8 Status[2] = {0,0};
	if(!via_master_file(Handle,Response,0,&Read,Status))
	{
		printf("get via ppua failed : select file failed !!\n");
		return false;
	}
	insac[2] = 0xA4;
	Status[0] = Status[1] = 0;
	if(via_transfer(Handle,insac,5,Response,&Read,Status) != SMC_NO_ERROR)
	{
		printf("via get ppua send command failed  !!\n");
		return false;
	}
	if(!via_check_status(Status))
	{
		printf("PB Words failed !!\n");
		return false;
	}
	insb8[4] = 0x02;
	via_transfer(Handle,insb8,5,Response,&Read,Status);
	if(!via_check_status(Status))
	{
		printf("PB Words failed !!\n");
		return false;
	}
	insb8[4] = Response[1];
	{
		int tmplen=0;		
		tmplen = Response[1];
		insb8[4] = tmplen-1;
		via_transfer(Handle,insb8,5,Response,&Read,Status);
		insb8[4] = 1;
		via_transfer(Handle,insb8,5,Response+tmplen-1,&Read,Status);		
	}
	if(!via_check_status(Status))
	{
		printf("PB Words failed !!\n");
		return false;
	}
	memcpy(pstViaInfo->uCardUA,Response,5);
	printf("Card UA : %02x %02x %02x %02x %02x\n",pstViaInfo->uCardUA[0],
								pstViaInfo->uCardUA[1],pstViaInfo->uCardUA[2],
								pstViaInfo->uCardUA[3],pstViaInfo->uCardUA[4]);
	return true;
}

/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_df_time                                      */
/*    函数功能:读取授权时间信息                                     */
/*    参    数:Handle: Smart卡句柄                                  */
/*              param: 命令参数                                      */
/*              Response: 响应数据缓冲区                             */
/*              NumberToRead: 期望读取的数据长读                     */
/*              Read: 实际读取的数据长度                             */
/*              Status: 操作结果,(含错误代码和过程字节)              */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
static bool via_get_df_time(Smart_Handle_t Handle,
							 U8* param,
							 U8* Response,
							 U16* Read,
							 U8* Status)
{
	int len;
	U8 ins[9] = {0xCA,0xAC,0xA9,0x00,0x04,0x00,0x21,0xFF,0x9F};
	if(!via_select_file(Handle,param,Response,0,Read,Status))
	{
		printf("via get df time failed : select file failed !!\n");
		return false;
	}
	if(via_transfer(Handle,ins,9,Response,Read,Status) != SMC_NO_ERROR)
	{
		printf("via get df time failed : send command failed !!\n");
		return false;
	}
	if(!via_consultation_length(Handle,Response,2,Read,Status))
	{
		printf("via get df time failed : get consulation length failed !!\n");
		return false;
	}
	len = Response[1];
	{
		int tmplen=len;
		if(via_consultation_answer(Handle,Response,0,Read,Status,tmplen-1))
		{
			if(!via_consultation_answer(Handle,Response+tmplen-1,0,Read,Status,1))
			{
				printf("via get df time failed : get consulation answer failed !!\n");
				return false;
			}
		}else
		{
			printf("via get df time failed : get consulation answer failed !!\n");
			return false;
		}
	}
	return true;
}


/*-------------------------------------------------------------------*/
/*    函 数 名:via_get_df_des                                       */
/*    函数功能:读取指定文件信息                                     */
/*    参    数:Handle: Smart卡句柄                                  */
/*              file: 文件参数                                       */
/*    返 回 值:                                                     */
/*    全局变量:                                                     */
/*    调用模块:                                                      */
/*    备    注:                                                     */
/*    相关函数:via_consulation_length                               */
/*              via_consulation_answer                               */
/*-------------------------------------------------------------------*/
void via_get_df_des(Smart_Handle_t Handle,U8* file)
{
	U8 Response[254];
	U16 Read;
	U8 Status[2];
	int len;
	via_select_file(Handle,file,Response,0,&Read,Status);
	via_get_consultation(Handle,Response,0,&Read,Status,0xA7,0x00);
	via_consultation_length(Handle,Response,0,&Read,Status);
	len = Response[1];

	{
		U8 tmplen=Response[1];

⌨️ 快捷键说明

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