主要参考IC卡规范第4(借贷记应用规范),5(卡片规范),6(应用终端规范)部分。
本系列后续流程同样来自 xuture的专栏
(一)总流程
应用选择
1.目录选择方法
从卡片上称为支付系统环境(PSE)的主文件[1PAY.SYS.DDF01]开始,搜索其下的树型卡片文
件结构,得到与终端匹配的候选应用列表。卡片对目录选择方法是可选的,但终端必须支持目录选择方法.
如果卡片返回的AID不在终端支持的AID列表中,交易失败直接退出。
2.AID列表方法
终端根据终端应用列表依次发SELECT命令,如果卡片也支持该应用,终端将其加入候选应用列表。 如此最终获取卡片和终端共同支持的候选应用列表。终端必须支持AID列表方法。
应用初始化 GPO
GPO返回有两个数据,AIP和AFL.
应用选择完成后,终端获取到了PDOL数据.
后面举例说明.
(二)资料解析
1.目录选择方法
- PBOC 选择
PSE【1PAY.SYS.DDF01】得到SFI[命令:00 A4 ] - QPBOC 选择的是
PPSE【2PAY.SYS.DDF01】 - 根据SFI选择到AID[命令 00 B2]
- 选择AID读取到应用信息GPO[命令 80 A8][包括9f38(PDOL)及87(应用优先指示器)]
应用选择指示器(ASI –DF01)表明终端的应用标识符须要完整匹配(长度和值都相同)还是只须要部分
匹配卡片中相关的ADF名(标签为4F)…卡片中的应用AID可以更长一些。
2.AID列表方法
依次验证终端支持的AID来判断卡片是否支持(终端支持的AID参数列表通过IC卡参数下载得到)
举例如下(通过select命令) send:14 00 A4 04 00 08 A0 00 00 03 33 01 01 06 00 rec:3 6A 82
send:14 00 A4 04 00 08 A0 00 00 03 33 01 01 01 00 rec:74 6F 45 84 08 A0 00 00 03 33 01 01 01 A5 39 50 0A 50 42 4F 43 20 44 45 42 49 54 87 01 01 9F 38 09 9F 7A 01 9F 02 06 5F 2A 02 5F 2D 02 7A 68 9F 11 01 01 9F 12 0A 50 42 4F 43 20 44 45 42 49 54 BF 0C 05 9F 4D 02 0B 0A 90 00 send:1
00 A4 04 00 08 A0 00 00 03 33 01 01 02 00 rec:3 6A 82
(三)源码片段分析
((sfi&0x1F)<<3)|0x04 // 用来偏移读取AID;
(四)常见问题及分析
1.PBOC需要根据选择PSE返回的SFI读记录获取AID,再根据AID去选择ADF,再去读数据.
QPBOC在选择PPSE之后就可以获取到AID(可能是多个),直接选择ADF了.
QPBOC不支持持卡人选择应用,所以如果有多个AID的时候,需要根据应用优先级选择优先级最高的AID.
2.Q不支持AID列表选择法,Q不支持持卡人选择应用;
3.通过SFI(88)选择到AID需要注意计算;
现在我们已经通过选择AID得到了GPO(9F38)数据了.注意这里要循环下去(增加记录号就行),直到返回68A3.
第一次发送00B2010C00 ,第二次发送00B2020C00…
4.GPO命令解析
IC卡返回的 800E7C00080102001001040118010100
解析一下: 80 0E(长度) `7C00(AIP)` 08010200 10010401 18010100(3组AFL)
AIP:
通过AIP的返回来判断用什么方式脱机数据认证 CDA > DDA > SDA(判断有顺序)
#defineAIP_SDA_Support(x) (*(x)&0x40)
#defineAIP_DDA_Support(x) (*(x)&0x20)
#defineAIP_CV_Support(x) (*(x)&0x10)
#defineAIP_TRM_Support(x) (*(x)&0x08)
#defineAIP_IA_Support(x) (*(x)&0x04)
#defineAIP_CDA_Support(x) (*(x)&0x01)
#defineAIP_MSD_Support(x) (*(x+1)&0x80)
AFL: 后续第二阶段的读取交易应用数据需要根据AFL来判断,AFL的解析就到后面来解释
扫描关注我
(转载本站文章请注明作者和出处 Undefined)