📄 viaccess.c
字号:
/*
本代码仅作为学习研究之目的使用,请您于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 + -