本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

文章目录

  • USIM Demo详解
    • 文件结构
    • 核心code讲解
      • 应用层
      • 传输层

USIM Demo详解

文件结构

UICC的TLV解码目前只实现了对Application selection response的解码,后续其它命令的TLV解码都以’_tlv’结尾。

函数调用关系如下图:


核心code讲解

核心Code主要有两个函数,分别对应于应用层业务处理和传输层命令处理过程

应用层

/** Description:这个函数位于UICC应用层,用于组装APDU并发送到传输层* Params:*             usim :实例化后的USIM对象*           r_apdu_p :用于传输APDU response*/
static int _send_apdu(usim_t* usim,r_apdu_t* r_apdu_p /* out */)
{//history_pool中记录着将要发送的APDU,通过get_latest_item函数//获取将要发送的APDUapdu_t* _apdu_p = (apdu_t*)get_latest_item(usim->history_pool);//打印即将发送的APDU,用于调试目的_display_one_apdu(_apdu_p);//发送到传输层if(0 == usim->send_apdu_usim(GTE_APDU_HEAD(_apdu_p),_apdu_p->apdu_size))return 0;//根据APDU response 判断下一步的行动switch(r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-2]) //SW1{case 0x61: {//send GET RESPONSE commanduint8_t _xx = GTE_APDU_LE(_apdu_p) < r_tpdu.r_tpdu[r_tpdu.r_tpdu_size - 1]?GTE_APDU_LE(_apdu_p):r_tpdu.r_tpdu[r_tpdu.r_tpdu_size - 1];//将GET RESPONSE command放入history_poolinsert_history_item(usim->history_pool,(uint8_t *) _new_apdu_command(0x00, 0xC0,0x00, 0x00,INVALID_LC, NULL,_xx/* SW2 */),NULL);//递归执行_send_apduif (0 == _send_apdu(usim, r_apdu_p /* out */))return 0;break;}case 0x6C: {//resend previous command header//获取上一条发送的APDUapdu_t* _apdu_previous = (apdu_t*)get_latest_item(usim->history_pool);//修改Le字段,并将修改后的“previous command”插入history_poolinsert_history_item(usim->history_pool,(uint8_t *) _new_apdu_command(_apdu_previous->CLA,_apdu_previous->INC,_apdu_previous->P1,_apdu_previous->P2,INVALID_LC,NULL,r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-1]/* SW2 */),NULL);if (0 == _send_apdu(usim, r_apdu_p /* out */))return 0;break;}case 0x62:case 0x63:case 0x91:case 0x92://for Case4 (特殊情况处理,此时直接将Le置为0x00)if(_apdu_p->has_Lc == _HAS_LC &&_apdu_p->has_Le == _HAS_LE){//decode status words_decode_status_words(r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-2],r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-1]);//_display_one_apdu(_apdu_p);insert_history_item(usim->history_pool,(uint8_t *) _new_apdu_command(0x00, 0xC0,0x00, 0x00,INVALID_LC, NULL,0x00/* SW2 */),NULL);if (0 == _send_apdu(usim, r_apdu_p /* out */))return 0;break;}default://decode status words_decode_status_words(r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-2],r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-1]);//_display_one_apdu(_apdu_p);assert(r_apdu_p != NULL);memset(r_apdu_p , 0 , sizeof(r_apdu_t));r_apdu_p->r_apdu_size = r_tpdu.r_tpdu_size - 2; //substrate SW1|SW2r_apdu_p->r_apdu = (uint8_t*)malloc(r_apdu_p->r_apdu_size);assert(r_apdu_p->r_apdu != NULL);memcpy(r_apdu_p->r_apdu, r_tpdu.r_tpdu , r_apdu_p->r_apdu_size);r_apdu_p->sw1 = r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-2];r_apdu_p->sw2 = r_tpdu.r_tpdu[r_tpdu.r_tpdu_size-1];break;}return 1;
}

点击获取完整code

传输层

/** Description : 将TPDU发送到数据链路层并根据数据链路层的反馈信息进行相应的处理* Params:*             apdu_p:应用层commnad*           apdu_size:command长度*/
int send_apdu_usim(uint8_t* apdu_p , uint8_t apdu_size)
{uint8_t enable_usim = 0;//random valueuint32_t  data_size = 0;uint8_t *data=NULL;uint8_t response_data[260]={0};uint32_t res_size=0;uint8_t hasLe=0;uint8_t hasLc=0;//send command header size to usimfpga_write(apdu_p , 5/*in Byte*/); //CLS INS P1 P2 P3//get response(data size and data)fpga_read(response_data, &res_size);re_decode://对应协议中“INS [Le Bytes of data] SW1 SW2”的Caseif(res_size > 3) {hasLe = 0;//判断APDU中是否存在Le字段if(apdu_size > 4){if(hasLc == 1){if((apdu_size-5-apdu_p[4]) == 1) hasLe = 1;else hasLe = 0;}elsehasLe = 1;}//if apdu_size > Le , return Le bytes of dataif(hasLe && (apdu_p[apdu_size-1] != 0)&& (res_size-2-1)>apdu_p[apdu_size-1]) r_tpdu.r_tpdu_size = apdu_p[apdu_size-1]+2;elser_tpdu.r_tpdu_size = res_size-1;memset(r_tpdu.r_tpdu , 0 , sizeof(r_tpdu.r_tpdu));memcpy(r_tpdu.r_tpdu,response_data+1,r_tpdu.r_tpdu_size);}else if(res_size == 1 && response_data[0]==apdu_p[1]) // return INS{hasLc = 1;//send data part of APDUfpga_write(apdu_p+5 , apdu_p[4]/*in Byte*/);//get response(data size and data)fpga_read(response_data, &res_size);goto re_decode;}else if(res_size == 2) //only SW1 SW2{r_tpdu.r_tpdu_size = res_size;memset(r_tpdu.r_tpdu , 0 , sizeof(r_tpdu.r_tpdu));//拷贝数据,将结果反馈给应用层memcpy(r_tpdu.r_tpdu,response_data,r_tpdu.r_tpdu_size);}else{printf("Error:undefined action.\n");return 0;}return 1;
}

点击获取完整code


返回系列目录

UICC 之 USIM 详解全系列——USIM Demo详解相关推荐

  1. UICC 之 USIM 详解全系列——USIM App关键流程介绍与命令详解

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 文章目录 USIM App关键流程介绍与命令详解 USIM ...

  2. UICC 之 USIM 详解全系列——USIM App文件结构

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 文章目录 USIM App文件结构 USIM中的文件 US ...

  3. UICC 之 USIM 详解全系列——常用命令详解与实例说明

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 文章目录 常用命令详解与实例说明 SELECT命令 REA ...

  4. UICC 之 USIM 详解全系列——USIM鉴权函数说明以及鉴权向量结构

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 文章目录 USIM鉴权函数说明以及鉴权向量结构 一.USIM鉴权函数说明 二.USIM鉴权向量结构 AUTN

  5. UICC 之 USIM 详解全系列——UICC基础知识介绍

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. UICC 之 USIM 详解全系列--UICC(TS102 ...

  6. UICC 之 USIM 详解全系列——UICC协议层结构

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. UICC 之 USIM 详解全系列--UICC协议层结构 ...

  7. UICC 之 USIM 详解全系列——背景与系列介绍

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. UICC 之 USIM 详解全系列--背景与系列介绍 文章 ...

  8. React Native按钮详解|Touchable系列组件使用详解

    转载自:http://www.devio.org/2017/01/10/React-Native按钮详解-Touchable系列组件使用详解/ 在做App开发过程中离不了的需要用户交互,说到交互,我们 ...

  9. UICC 之 USIM 详解全系列

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 一.项目背景介绍与系列介绍 1.1 项目背景 1.2 US ...

最新文章

  1. 重置 microsoft visual studio窗口
  2. 中农植保-昆虫进化与基因组诚聘博后及科研助理-三亚中国农业大学研究院
  3. 网络安全:HTTP Host 头攻击相关知识介绍
  4. linux 查看端口 程序,linux开发:Linux下查看端口占用
  5. 警示:强制关闭OGG进程触发bug致abended,详述处理过程
  6. 信号学习第一课--基础知识
  7. 韦东山: 作为一个初学者,怎样学习嵌入式Linux?
  8. 客户答谢晚宴策划案例合集(共20份)
  9. win7开启不了Aero
  10. Kettle (1) - 读取 CSV 文件
  11. 廊坊金彩教育:如何提高店铺评分
  12. C#实现发送短信到手机
  13. linux 目录权限上下文,谢烟客---------Linux之文件安全上下文及特殊权限位
  14. C语言画直线~Bresenham方法
  15. 2021年施工员-装饰方向-岗位技能(施工员)免费试题及施工员-装饰方向-岗位技能(施工员)复审考试
  16. winform使用多线程时跨线程访问控件
  17. Nvidia GPU的浮点计算能力(FP64/FP32/FP16)
  18. mysql实操《学生表》
  19. 如何在Linux上部署web程序
  20. Baidu Apollo代码解析之Planning的结构与调用流程(1)

热门文章

  1. 插入法排序c语言程序,C语言直接插入排序算法
  2. 数字图像处理--冈萨雷斯第4版--第一章 绪论
  3. 如何为SharePoint文档库、文件夹、文件单独设置权限
  4. RocketMQ(七)RocketMQ消息生产及消息储存机制
  5. 如何在统信UOS系统中设置tomcat开机启动
  6. Could not write JSON: Infinite recursion (StackOverflowError) (through reference chain:
  7. 柠檬班性能测试day3_性能测试基础知识(0521)
  8. 卸载工具Android,教你轻松卸载/删除Android手机内置游戏/软件
  9. 二进制转四进制计算机,二进制换算(进制转换计算器)
  10. Dlib模型实现人脸识别