接上一篇,上次基本上卡在了选择ADF之后的操作,选择完ADF之后根据Response的数据,需要做获取处理选项GPO,但是对PDOL这个东西一直搞不明白,GPO指令的数据域是PDOL,PBOC规范上对GPO的指令写的也是很模糊,只说了没有PDOL的发8300,有PDOL项的发PDOL,但是泛泛的浏览PBOC规范,对选择应用之后返回的数据中PDOL的内容也没有细说,折腾了半天才反应过来PDOL的格式,仔细对照规范对PDOL的解析如下。
+-----------+----------+-------------------+----+---------+----+--------------+-----+
| PDOL的Tag | PDOL长度 | 电子现金指示器Tag | |授权金额 | | 交易货币代码 | |
+-----------+----------+-------------------+----+---------+----+--------------+-----+
| 9F38 | 09 | 9F7A | 01 | 9F02 | 06 | 5F2A | 02 |
+-----------+----------+-------------------+----+---------+----+--------------+-----+
下面发送GPO指令,这个PBOC3.0规范上关于GPO的APDU的描述Lc固定值写为0,不知道这一部分是哪个单位的人写的,Lc明显不能写成0啊,开始我还老老实实的写0,仔细想,即使没有PDOL,Data域也要发8300,Lc也得为2的,如果符合了PBOC3.0的规范,那就跟7816规范矛盾了,必须是起草者写错了。下面对GPO命令报文按我自己的修正后的说明一下以防又有人跟我已经糊里糊涂的。
| 取值说明 |
| 80 |
| A8 |
| 00 |
| PBOC3.0规范上写的是0,实际应该是数据域长度 |
| |
| 0 |
下面发送GPO指令
7.GPO
APDU:80A800000B 83099F7A019F02065F2A02
SW1SW2:6114
8.GET RESPONSE
APDU:00C0000014
RETURN:80127C000801010010010301 1007070018010400
SW1SW2:9000
规范中说GPO的Reaponse数据中应该是一个BER-TLV编码的数据对象,有两种格式一种是标签为‘80’,一种是标签为‘77’,这个明显是标签为‘80’的。数据对标表示了AIP和AFL。AIP列出了交易在处理过程中执行的功能;AFL列出交易需要读出的数据存放的短文件标识符、记录号、记录个数以及脱机数据认证需要的静态签名数据的存放位置。
下面对报文进行解析,在规范上没有看太明白,一边baidu一边看规范进行解析的。
80是Tag,12是长度,7C00是AIP.
7C00按照规范是
| |
| |
| 支持SDA |
| 支持DDA |
| 支持持卡人认证 |
| 执行终端风险管理 |
| 支持发卡行认证 |
| 0=RFU |
| 不支持CDA |
| RFU=0 |
后面4字节08010100应该就是AFL了。
08-短文件标示符,01-第一个要读出的记录号,01-最后一个要读出的记录号,00-存放用于脱机数据认证的数据的连续记录个数,字节2指出的是第1条要读的记录号。
下面要根据AFL的指示读取SFI指向的文件,文件号格式是SFI左移3位,右边补100,字节0x80中表示SFI的是bit8~bit4,所以0000 1000中只有0000 1是SFI,按前面的规则处理后文件号格式就是01100就是0x0C,所以构造APDU读一下记录。
9.READ RECORD
APDU:00B2010C00
SW1SW2:6C3C
调整一下Le重新下发APDU
10.READ RECORD
APDU:00B2010C3C
RETURN:703A5 后面跟了58字节数据涉及我自己隐私就不发出来了
SW1SW2:9000
数据等价二磁道数据,包含了持卡人姓名,证件号码,证件类型等信息
继续往后读下一个文件
11.READ RECORD
APDU:00B2011400
SW1SW2:6C44
调整一下Le重新发指令
12.READ RECORD
APDU:00B2011444
RETURN:一堆私人数据
SW1SW2:9000
13.READ RECORD
APDU:00B2021400
SW1SW2:6CBA
14.READ RECORD
APDU:00B20214BA
RETURN:一堆私人数据 稍后分析。
SW1SW2:9000