复旦FM1208 CPU卡调试
2019-07-12 13:18发布
生成海报
CPU卡内部自带COS,有严格的密钥管理系统。相比M1来说,要复杂的多。我用的是复旦微电子的FM1208 CPU卡,读卡芯片用的是FM1702.FM1702有并口和SPI接口两种方式。NXP的RC500,RC531只有并口接口。用SPI接口,可以省下单片机很多IO口。
下面是开发过程中我觉得比较重要的地方,总结在下面:
1、 CPU卡的操作步骤:寻卡-防冲突-选卡-ATS,前面三步和M1操作完全一样,属于ISO14443A前面三层的操作,ATS成功后就进入ISO14443A-4协议层了,也就进入了CPU卡的操作层。
2、 PPS是可以不做的,只有RATS的返回值表明其接收能力大于PCD的发送即可。PPS用来设置通信时的波特率,通过RATS命令响应数据07 77 80 A0 02 47 56可以判断该卡仅支持106K波特率。所以PCD也没有通过PPS指令修改通信波特率的必要了。当然PPS指令重新按106K波特率设置一下也是可以的,RATS以及后续的PCD指令都需要加上CRC的。
3、 ISO14443-4只规定到PPS指令,后续的指令都需要由CPU卡内部的软件COS来解释,所以卡片完成SELECT,通过RATS和PPS指令后,必须发COS支持的指令。发COS支持的指令一般都需要加CRC的。
4、 发送取随机数命令00 84 00 00 04,根据块格式规定,除了发送这个指令外,还要发送PCB和CID,即实际发送的字符是0A 01 00 84 00 00 04,0A01这两个字节必须加在每个指令字符串的前面,并且块号不能重复,即如果你连续2次取随机数,需如下发送:0A 01 00 84 00 00 04 ,0B 01 00 84 00 00 04.即第一个字节的最后一位要不断变化。
5、 取随机数命令可取4字节或8字节。若取随机数命令下条指令为外部认证,则外部认证数据用指定的外部认证密钥解密后与该随机数进行比较。外部认证命令要求CPU卡存在用于外部认证的密钥。在满足该密钥的使用条件,且该密钥未被锁死时才能执行此命令。将命令中的数据用指定外部认证密钥解密,然后与先前产生的随机数进行比较,若一致则表示认证通过,置安全状态寄存器为该密钥规定的后续状态值,错误计数器恢复成初始值,若比较不一致则认证失败,可再试错误数减一,且不改变安全状态寄存器的值。
6、 MF文件唯一存在,CPU卡复位后,卡片自动选择MF文件为当前文件。任何一个DF在物理上和逻辑上都保持独立,都有自己的安全机制和应用数据。可以通过应用选择实现对其逻辑结构的访问。可以将单个DF文件以及其中一个或多个EF文件当做一个应用。也可以将多个DF以及其中多个EF文件当作一个应用。基本文件EF用于存放用户数据和密钥,存放用户数据的文件称为工作基本文件,在满足一定条件下用户可对文件进行相应的操作。
KEY文件称为内部基本文件,不可由外部读出,但当获得许可的权限时可在卡内进行相应的密码运算,在满足写的权限时可以修改密钥。KEY文件必须在MF/DF下最先被建立,且一个目录只能有一个KEY文件。KEY文件可以存多个口令密钥,外部认证密钥,DES运算密钥,每个密钥为一个TLV格式的可变长记录,记录的长度为密钥数据长度加8,3DES密钥长度为24字节,DES密钥记录的长度为16字节。
7、 外部认证
A、取随机数可以取4字节,也可以取8字节,如果是4字节,则在后面加上4字节0,也就是参与加密运算的随机数是8字节。
B、 外部认证所用的加密算法是DES/3DES算法
C、 密钥是指外部认证密钥
D、如果密钥的长度是8字节,则适用DES算法,如果密钥长度为16字节,则适用3DES算法。
8、 一般CPU卡提供商提供CPU卡时,已经对CPU卡进行过初始化,即CPU卡上已经建立了主文件MF及主密钥文件(MF下的KEY文件),主密钥文件中也写入了初始化CPU卡主控密钥。在对CPU卡建立特定的卡结构及写入密钥和数据之前,程序设计中的第一步应该对CPU卡进行外部认证。外部认证所使用的密钥正是初始CPU卡主控密钥。当完成外部认证后,接下来最好是擦除CPU卡上已有的结构,然后开始重新建立CPU卡结构。
9、 文件标识符是文件的标识代码,用2个字节表示,同一目录下的文件标识符必须是唯一的,MF的文件标识符是3F00。短文件标识符选择只能用5位来决定。所以可选择的最大文件标识符是31。选择文件后,只要文件存在,该文件就被置为当前文件,以后可以不用选择而直接对该文件进行操作。文件类型在建立文件时规定。
10、 删除MF文件后,选择MF会返回FA 01 01,程序要一直发送FA 01 01给1208,直到收到0A 0B开头的数据。如果MF下没有密钥文件,建立KEY文件不需外部认证。
11、 在多应用卡中,MF下通常包含多个DF,这里的MF就是一个典型的DDF,为了维护管理DDF下所有的DF,在每一个DDF下一般可以包含一个系统文件(DIR),记录所有子DF的入口,如果只有一个ADF应用,不需建立DIR文件。
12、 DF文件短标识符,当高三位为000时,为DDF,当高三位为100时,为ADF的短文件标识符,在建立目录文件时,要指定2字节文件标识符,短文件标识符,文件名。短文件标识符要在1-31之间,和文件标识符没有关系。在卡片出厂时建立MF,MF的短文件标识符应为01,因为建立MF下密钥文件使用的DF短标识符是01。所以自建一个DF,短文件标识符应定义为02或其它值。同一目录下的文件标识符必须是唯一的。
13、 密钥标识,如果该目录下某类型密钥只有一个,则其密钥标识原则上应为00,否则应从01顺序开始。
14、 增加权限:在当前目录下创建新文件的权限
激活权限:激活失效安全机制的权限
终止权限:永久终止的权限,对于MF来说,标识卡锁定,对于ADF来说,表示当前应用永久锁定,即应用失效。
读权限:对EF文件的内容的读操作权限
写权限:对EF文件内容的写操作权限
安装权限:安装密钥和密码的权限
使用权限:表示使用密钥或密码的权限
修改权限:修改密钥或密码的权限
解锁权限:解锁密码PIN的权限,此权限只有PIN才有
15、 安全机制是指安全状态的改变所采用的方法和手段以及安全属性和安全状态之间的控制关系,COS命令在执行过程中,首先要检查COS环境所处的安全状态是否符合执行命令需求的安全属性,假设当前COS所处的是安全状态A,执行COS命令安全属性要求为安全状态B,在执行COS命令前要通过安全机制涉及安全提升方法,将安全状态提升到安全状态B。
16、 内部认证是用读卡设备来认证卡,保证卡的合法性,内部认证可以防止伪造的卡在读卡设备上进行操作。
外部认证是用卡来认证外部读卡设备的合法性,外部认证可以防止恶意对卡进行操作,读取或更改卡内信息。外部认证还可以改变卡的安全状态,一般卡内存储了多个外部认证密钥,每个外部认证密钥多能改变的安全状态不一样,在进行外部认证时,必须通过密钥索引参数选择对应的外部认证密钥完成外部认证。
CPU卡和读卡设备存放吸纳沟通的密钥
外部认证步骤:
A、CPU卡产生一个8进制随机数送给读卡器,CPU卡临时保存随机数在卡内
B、 读卡器程序用密钥计算随机数,得到随机数密文
C、 读卡器程序把8字节随机数密文送给CPU卡
D、CPU卡在卡片内部解密8字节随机数得到随机数明文
E、 CPU卡在卡片内部把解密后的随机数和步骤A中临时存放的随机数对比,若相等,则外部认证密钥成功
外部认证是CPU卡认证读卡器
内部认证步骤:
A、读卡器产生一个8字节随机数,发送给CPU卡,读卡器临时保存这个随机数。
B、 CPU卡用内部认证密钥计算这个随机数,得到8字节随机数密文。
C、 CPU卡把随机数密文发给读卡器
D、读卡器解密8字节随机数密文得到随机数明文
E、 读卡器把解密后的随机数和步骤A中产生的随机数对比,若相等,则内部认证成功。
内部认证是读卡器认证CPU卡
CPU卡内部自带COS,有严格的密钥管理系统。相比M1来说,要复杂的多。我用的是复旦微电子的FM1208 CPU卡,读卡芯片用的是FM1702.FM1702有并口和SPI接口两种方式。NXP的RC500,RC531只有并口接口。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮