📄 viaccess.c
字号:
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 + -