ISO7816是一种接触式的读卡协议,PSAM、SAM、手机的SIM卡都是按照这个协议定制的。协议分为2个部分,复位和数据的传输。本文档主要介绍自己的理解和在调试的过程,具体协议部分的内容需要翻看ISO7816的协议文档。本文重点是带着数据对协议进行分析。适合刚接触ISO7816的人。加深对协议的理解。

一、复位

上电复位或者手动给卡复位之后,卡会发出一段数据,这段数据是代表卡本身的一些信息,如发送的格式是什么样子的,卡支持什么样的协议,卡片的号码等等。复位的结构如下:

TS…………………………………………表示正向或者反向约定,强制性在

T0…………………………………………格式字符,强制性

TA(i) TB(i) TC(i) TD(i)…………… 接口字符,可选的

T1 T2Tk…………………………………历史字符,可选的

Tck……………………………………… 检测字符,有条件的

第一个数据是TS,我个人理解是大端和小端的问题,第一个数据永远是“0X3B”或者是“0X3F”,其中“0X3B”代表正向约定,“0X3F”代表反向约定,在我见到的卡片里面,只见过“0X3B”,还没有见过“0X3F”。如果第一个数据不是这两个值,那么代表接收的时序有问题,需要查看驱动或者硬件是否有问题。

第二个数据是T0,这个数据比较重要,他决定了下面的数据代表什么意思。也就是说,从第三个数据开始,每个数据代表什么意思是不确定的。T0的结构如下。

b8

msb

b7

b6

b5

b4

b3

b2

b1

lsb

Y(1)

K

图1 — T0编码

Y(1)……接口字节存在的标记

b5=1时TA(1)存在

b6=1时TB(1)存在

b7=1时TC(1)存在

b8=1时TD(1)存在

K……历史字节的数目,从0到15

由图1 可知,第三个数据代表什么意思,是由T0的高4位决定的。T0的低4位代表是历史字节的数目,这个后面在介绍。

第三个数据是有T0决定的,下面我就举一段例子,来说明。下面是我读取到的一张卡的数据。

1

0x3b

2

0x69

3

0x00

4

0x00

5

0x45

6

0x53

7

0x41

8

0x4d

9

0x10

10

0xd3

11

0x4c

12

0x8a

13

0xe6

上面这段数据是我抓取的一张T=0协议卡的复位数据。第一个数据是“0x3B”,代表TS,是正向约定,就是小端的意思。第二个数据是0X69,代表T0,二进制“01101001”,则带表下面第三个数据是TB1,因为其b6位是1,那么顺下去,b7位也是1,则第四个数据就代表TC1,所以说TA(i) TB(i) TC(i) TD(i)是可选字符(i代表1,2,3,4、、、由于可能存在好多组TA、TB、TC、TD,所以用i来表示),也就是说他们不一定都存在,会根据T0和TD(i)来决定。至于TA(i) TB(i) TC(i) TD(i)是干什么用的,我们下面会介绍。这组数据由于T0的b8位由于没有TD1,所以就没有TA2、TB2、TC2、TD2、、、、、以及以后的数据,那么,剩下的数据代表什么意思的,剩下的从第5个开始到第13个,代表的是历史字符,也就是T1 T2Tk,我们上面说了,历史字符的个数是由T0的低4位决定的,我们这组数据中,T0为0X69,低4位是9,则说明有9个历史数据,而剩下的数据正好是9个,由于最后一个字符Tck是有条件的,也就是说不一定存在,在T=0的卡中,一般是不存在Tck的。分析到这里,这组数据和我们的复位协议也都对上了。简单的总结一下,这组数据代表了这张卡是正向约定的卡,存在TB1和TC1,有9个历史字符。那么这张卡到底是T=0的卡还是T=1的卡,根据现在的情报还没办法分析出来。下面开始介绍TA(i) TB(i) TC(i) TD(i)。

TA(1)

— FI,位b8到b5 上的时钟率转换因子的引用。

— DI,位b4到b7上波特率校正因子的引用。

这位和etu有关系,总之是和两个数据的传输间隔时间相关。这位确定了卡支持的传输速率。

TB(1)  b8=0代码处

— II,位b7 b6上最大编程电流的引用。

— PI1,位b5到b1上编程电压的值。

注:接口设备可以忽略TB(1)的位b8。

这一位我也没用到过。所以这里也就不介绍了。

TC(1)代码(见8.5.3)

— N,计算八位额外保护时间的引用。

—  这一位我也没用到过。所以这里也就不介绍了。

下面是重点TD1

字节TD1由两部分组成。

— 位b8到b5构成Y2);每个等于1的位指明接口字节的存在。

— 位b4到b1构成8.2中定义的参数T的值。

b8

msb

b7

b6

b5

b4

b3

b2

b1

lsb

Y(2)

T

图2 — TD(1)编码

Y(2)……接口字节存在的标记

b5=1时TA(2)存在

b6=1时TB(2)存在

b7=1时TC(2)存在

b8=1时TD(2)存在

T……协议参考和/或接口字节限制符

TD1和T0差不多,高4为代表了TA(2)TB(2) TC(2) TD(2)是否存在,低4为代表了这张卡支出什么协议,参数T的定义如下:

——T=0        异步半双工字符传输协议 在第8章中说明。

——T=1        异步半双工块传输协议 在第9章中说明。

——T=2和T=3    保留用于将来的全双工操作。

——T=4        保留用于增强的异步半双工字符传输协议。

——T=5到T=13   保留待未来使用。

——T=14       未由ISO/IEC JTC1 SC17标准化的传输协议

——T=15       不属于传输协议,仅指明了全程接口字节的类型(见8.4.3.2)

TD2、TD3的高四位定义和TD1差不多,类推一下就好了,低4位目前我没用过,反正我判断是什么协议的卡只判断TD1的低4位,TD2、TD3的低4位我直接忽略了。如果TD1不存在,则代表了该卡支持的是T=0的卡。

TA2、TB2、TC2我也没有用到,所以没有仔细研究过,如果想要了解就需要看协议的相关文档。

TA3 也是比较重要的一个值,他确定了IFSC的大小,IFSC后面会介绍,这里只要记住有这个东西,并且比较重要就好了。

TB3的值和CWT和BWT,这两个值关系到了数据传输的时间,具体看协议,我也没有了解过。

TC3的值也比较重要,他决定T=1的检验位采用什么方式,第1位是0,则采用LRC校验,第1位是1,则采用CRC校验。如果没有TC3,则代表采用LRC校验。

接下来的数据是历史字符,具体代表什么意思需要看卡片。我也没研究过。

还有最后一个数据,Tck—校验字符

TCK具有一个检验复位应答期间所发送数据完整性的值。TCK的值应使从T0到包括TCK在内的所有字

由于T=0的卡没有校验,所以没有该值,在T=1的卡中,会正常返回该值。

下面我给出一组T=1卡的复位数据,进行分析。

序号

分析

1

0x3b

TS,正向约定

2

0xff

T0,有TA1、TB1、TC1、TD1,历史数据为15个

3

0x18

TA1控制了传输的速率,详细看下面的介绍

4

0x00

TB1 我也不知道具体什么意思

5

0xff

TC1 我也不知道具体什么意思

6

0x81

TD1,有TD2,卡支持T=1协议

7

0x31

TD2,有TA3和TB3,后四位好像不是代表支持的协议

8

0xfe

TA3,代表IFSC的值为254

9

0x45

TB3 我也不知道具体什么意思

10

0x65

T1

11

0x63

T2

12

0x0d

T3

13

0xoc

T4

14

0x76

T5

15

0x01

T6

16

0x56

T7

17

0x00

T8

18

0x0d

T9

19

0x92

T10

20

0x94

T11

21

0x03

T12

22

0x00

T13

23

0x07

T14

24

0x30

T15

25

0x0a

Tck,最后的校验位

二、数据传输

1、 传输速度

卡的传输速度除了有卡本身的决定外,还由CLK的时钟决定。在ISO7816协议中规定,CLK的时钟必须1Mhz-5Mhz,CLK的时钟是由读卡器决定的,而DATA的位持续时间是由CLK和卡本身决定的,所以说,卡的传输速度是由读卡器和卡共同决定。这里有一个叫做etu的东西,我把他理解成为每一位的持续时间。在复位期间,etu的计算如下:

etu =372 / f

其中F即为CLK的时钟,假如CLK的时钟为3.6M,则

etu =372 / 3600000 = 103us

那么,在CLK为3.6M的情况下,波特率为

1 / (372 / 3600000)= 9677

“STM32 ISO7816 智能卡”的DEMO中,其CLK的时钟输出就是3.6M,所以其波特率为9677。而我在调试过程中,将STM32的主频修改为8M,那么,CLK无论怎么分频都无法输出3.6M,所以我只能将CLK设置为2M,那么相应的波特率也改为了5376。

而复位的信息中包含了时钟率转换因子(FI)和波特率矫正因子(DI),那么etu的计算就变成了:

etu =FI / (DI * f)

FI和DI由TA决定,一般情况下,FI=372,DI=1,所以,一般情况下,复位完成后无需重新设置波特率,如果有遇到特殊的卡,在复位完成之后还需要对波特率进行重新设置。

2、 传输协议

卡支持不同的协议,传输方式也不同,目前最常见的就是T=0的卡和T=1的卡,他们的传输都是通过APDU格式进行传输,协议的内容我就不介绍了。

其中T=0叫字符传输,T=1叫块传输。说白了就是T=0的卡没有校验,你不知道还剩下多少个数据。也不知道传输过来的数据对不对。T=1的卡就不一样了,分为头域、信息域、尾域。其中,头域代表了传输的地址、命令以及信息域的长度,信息域代表的意思和头域有关,如果发送的是I块,那么信息域就是APUD数据,如果发送的S块,那么信息域代表了控制信息,R块的信息域为0,我们上面说的IFSC指的就是信息域的大小,刚刚那组数据中,IFSC的值为254,那么代表传输过程中,信息域最大的长度就是254。尾域的作用就是校验接收的数据是否正确。

T=0的卡百度也有很多现成的代码,直接搜“STM32 ISO7816 智能卡 代码”应该就能找得到。可以做一些参考。T=1的卡百度代码较少。可以在美信的官网上找一下智能卡相关的内容,应该可以找得到源码,或者在下面的连接下载也可以。

https://www.maximintegrated.com/cn/design/tools/appnotes/4200/an4200_sw.zip

这个代码支持T=0和T=1的卡,可以用作参考。

另外需要注意的就是,T=1的卡复位完成之后,必须先发一个S块,应该是规定好的。

下面给出一组T=0的卡传输过程中的数据分析。

序号

收发

分析

1

0x00

CLA 指令类别 根据卡的文档决定

2

0x84

INS 指令类别 0x84代表获取随机数

3

0x00

P1

4

0x00

P2

5

0x04

LE(没有LC,则没有DATA),希望得到4个数据

6

0x84

INS,卡回应INS,则代表相应了这个命令

7

0x86

DATA1

8

0x91

DATA2

9

0xd3

DATA3

10

0x48

DATA4

11

0x90

SW1 和SW2一起表示正常结束

12

0x00

这支持一个简单的测试卡是否可以正常通信的命令。该支持的意思是获取4个随机数。其实每个代表什么意思,还需要看卡的文档。

下面给出一组T=1的卡传输过程中的数据分析,举一个I块的例子。

序号

收发

分析

1

0x00

NAD 节点地址,一般都是0

2

0x00

PCB 协议控制字节 b0=1代表是I块,b7=0代表是第1组数据,b6=0代表是最后一个块,剩下的字节保留

3

0x05

LEN 长度,代表信息域的长度为5

4

0x00

信息域,其实内容和T=0一样的

CLA 指令类别 根据卡的文档决定

5

0x84

INS 指令类别 0x84代表获取随机数

6

0x00

P1

7

0x00

P2

8

0x04

LE(没有LC,则没有DATA),希望得到4个数据

9

0x85

EDC 校验位,前面所有数据的异或值

10

0x00

NAD 节点地址,和发送的一样

11

0x00

PCB 协议控制字节 b0=1代表是I块,b7=0代表是第1组数据,b6=0代表是最后一个块,剩下的字节保留

12

0x20

LEN 长度,代表信息域的长度为2

13

0x67

SW1 0x67代表长度错误

14

0x00

15

0x1e

EDC 校验位,前面所有数据的异或值

我特意选了一组带有错误值,发送的数据和T=0的卡一样,是一个希望得到4个随机数的指令,而返回的只有SW1和SW2,没有DATA的值,SW1为0X67代表数据的长度错误,后来才发现,我手里的这张T=1的卡只支持获取8个随机数的指令,所以,把LE改成8之后,接收的数据就正确了。

ISO7816 调试心得相关推荐

  1. AT91RM9200+pcf8563在linux2.6.20下的调试心得

    这两天调试了AT91RM9200+pcf8563在linux2.6.20下的驱动,记录一下我的调试过程以及调试心得,呵呵      在linux2.6.20/drivers/rtc目录下面已经有了pc ...

  2. 浅谈四轴PID调试心得

    以下内容转自阿莫论坛,写得很详细,是调试大四轴的.小四轴调试也可参照着调. PID调试心得 本人不是自动化出身,也没有受过专业训练,都是自己摸索,在这里浅述一下自己的PID参数整定心得.所言之物皆由实 ...

  3. 调试心得plc做主站(客户端)

    ##调试心得plc做主站(客户端) 调试软件,西门子博图15,PLC采用1200,协议抓包采用Wireshark抓包工具 发协议工具采用网络助手,绿色是PLC给我发的请求数据,蓝色我发的报文格式, 1 ...

  4. Ti ub954/953 Sensor调试心得

    Ti ub954/953 Sensor调试心得 前言 TI以及美信的串行器以及接串器是目前车载领域用的比较多的厂家,目前最近一直再用TI的954以及953进行双目sensor的调试,下面就简单记录下调 ...

  5. 阻容压降电路调试心得

    阻容压降电路调试心得 阻容压降电通常用于LED灯电源,智能电表等对成本要求较高的产品中.先说一下LED电源,L线进来后,串联0.39微法油铁电容,后面是全桥整流,然后是滤波,电容容量越大,电路输出的电 ...

  6. 记spi nor flash的调试心得

    flash 调试心得 前言 调试目的 调试步骤 检查 驱动 flash操作 改写 复位 访问模式 tips 内核下相关 文件系统 nor和nand的区别 前言 在工作中或者在开发板上或多或少都会遇到n ...

  7. NXP新出的Cortex-M7核单片机imx.rt1050调试心得

    感谢琳的出现,陪我度过开心的每一天.开心的日子总是过得很快,离上次写博客已经快两个月了.历经一年半的阴云密布,终于迎来了久违的万丈阳光,希望未来的岁月带来的是更多美好甜蜜,开心认真过好每一天. 乘着周 ...

  8. Linuxcnc-Ighethercat 调试心得

    Linuxcnc-Ighethercat调试心得 一.前言 如果想通过linuxcnc和ighethercat来实现对伺服电机的控制.那就要搞明白你需要经过哪几个步骤才能实现伺服控制. ① Linux ...

  9. JLINK在ADS中的调试心得

    JLINK在ADS中的调试心得 分类: ARM2010-01-03 19:39 138人阅读 评论(0) 收藏 举报 [分享]JLINK在ADS下调试心得 前两天一个客户用jlink在ADS来调试LP ...

最新文章

  1. 英伟达A100可达V100的3.5倍?
  2. Maven私服安装及配置——(十二)
  3. splunk 索引过程
  4. sql sum嵌套查询+ group by
  5. 职高计算机专业可以考本科吗,职业高中和普通高中的区别 职业高中能考本科吗...
  6. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
  7. python中什么最重要_Python 3中被忽视了的三大重要功能
  8. oracle的等保,3.Oracle 检查(部分)
  9. boost 容器tuple 信号signal2测试
  10. 将MfgTool工具改造为自己的烧写工具
  11. Android 使用 TableLayout 布局拉伸宽度
  12. php中几个操作函数参数的函数func_num_args() func_get_args() func_get_arg($i)php
  13. RDKit | 基于RDKit 的化合物预处理
  14. DSP 6678的NETCP
  15. Bootstrap可视化布局系统需要引入的静态资源
  16. HTTP协议之chunk介绍
  17. Markdown pad2 使用本地图片
  18. STM32 无法使用IAR下载程序问题
  19. jxl操作合并单元格复杂表头
  20. 开美容院是否要选择加盟?

热门文章

  1. 【每日新闻】阿里云成中国唯一全面提供IPv6服务 | 区块链技术可以促进数据的共享以改进流程...
  2. 每日一句api Android,Android 图文数据JSON解析,金山词霸每日一句API的调用
  3. 使用uniapp编写词霸每日一句页面
  4. python小模块----cookie
  5. Django源码cookie解读:关于中文cookie会被吞掉并截断的问题。
  6. android使用fir.im实现版本更新
  7. 【JS30-Wes Bos】实时显示的时钟网页 02
  8. oracle查看表空间物理路径,oracle查看表空间物理文件的名称,路径及大小
  9. maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile
  10. syzkaller--->syscalldescription语法