EMV内核在使用上会因为调用不当引发的许多问题,本文旨在基于内核LOG(也就是与IC卡交互的指令LOG)的基础上,对一些常见问题做初步的分析与解答,方便不熟悉EMV规范的同窗参考。算法
本文的前提是你已经获得了一份与IC卡交互的指令LOG,好比服务器
发送:00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
接收:6F 24 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 12 88 01 01 5F 2D 08 7A 68 65 6E 66 72 64 65 9F 11 01 01 90 00spa
发送:00 B2 01 0C 00
接收:6A 83ci
AID与公钥通常是POS机第一次与后台签到的时候自动下发的,数量会比较多,若是中途出现失败,十之八九是通信异常,好比modem、gprs通信断了等缘由,与EMV内核没什么关系。it
根据规范,如今终端都要支持目录选择方法。若是给IC卡发送第一条的指令不是选择PSE,也就是table
发送:00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00后台
那么就是终端参数没设置好。基础
若是找不到GPO指令,也就是终端
发送:80 A8 00 00 …….(以80 A8开头的)下载
那么就是终端没有AID参数,或者终端没有这张IC卡的AID。
那么如何知道这张IC卡的AID呢?若是IC卡是支持选择PSE的话,是能够知道的,若是不支持就没法知道。好比
发送:00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
接收:6F 24 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 12 88 01 01 5F 2D 08 7A 68 65 6E 66 72 64 65 9F 11 01 01 90 00
发送:00 B2 01 0C 00
接收:70 2A 61 28 4F 07 A0 00 00 03 33 01 01 50 0B 50 42 4F 43 20 43 72 65 64 69 74 9F 12 0F 43 41 52 44 20 49 4D 41 47 45 20 30 30 33 35 90 00
查找4F标签,它的值就是IC卡支持的AID,可能会有多个。
若是能找到GPO指令,也就是
发送:80 A8 00 00 …….(以80 A8开头的)
那么表示应用已经初始化了,可是GPO命令会把一些数据发给IC卡,好比交易金额、货币代码等等,要确保这些数据与发往服务器的55域数据一致。
那么如何解析GPO指令里的数据呢?先得看它的前一条指令:选择AID
发送:00 A4 04 00 08 A0 00 00 03 33 01 01 02 00
接收:6F 58 84 08 A0 00 00 03 33 01 01 02 A5 4C 50 0B 50 42 4F 43 20 43 72 65 64 69 74 87 01 01 5F 2D 04 7A 68 65 6E 9F 11 01 01 9F 12 0D 49 43 42 43 20 50 62 6F 63 43 61 72 64 9F 38 0C 9F 7A 01 9F 02 06 5F 2A 02 DF 69 01 BF 0C 0F D1 02 31 32 C2 04 49 43 42 43 9F 4D 02 0B 0A 90 00
查找9F38标签,它的值叫PDOL,根据PDOL才能组出GPO的数据。
假如GPO指令是这样的
发送:80 A8 00 00 0C 83 0A 00 00 00 00 25 89 63 01 56 00 00
那么从第8个字节开始就是根据PDOL组出来的数据,解析以下:
TAG |
名称 |
长度 |
值 |
9F7A |
电子现金终端支持指示器 |
01 |
00 |
9F02 |
受权金额(数值型) |
06 |
00 00 00 25 89 63 |
5F2A |
交易货币代码 |
02 |
01 56 |
DF69 |
SM2算法支持指示器 |
01 |
00 |
经常使用的判断规则是:
标签9F7A,若是是电子现金消费,则必须为01
标签9F02,必须与用户输入的交易金额一致
标签5F2A,国内都是01 56
标签DF69,支持国密就为01
读记录步骤在GPO命令以后,就是一大堆的00 B2开头的指令,从中查找标签8C,它的值叫CDOL1,后面判断的时候要用到
假设CDOL1的值为9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 21 03 9F 4E 14
查找第一条80 AE开头的指令,好比
发送:80 AE 80 00 34 00 00 00 25 89 63 00 00 00 00 00 00 01 56 00 80 04 00 00 01 56 13 07 03 00 59 4F 0D E3 19 15 27 53 75 6E 79 61 72 64 20 45 4D 56 20 54 65 73 74 20 6D 65 72 00
注意第3个字节,若是是电子现金消费则是40,若是是标准借贷记则是80,若是是其它值就说明有错误。
从第6个字节开始就是根据CDOL1组出来的数据,解析以下:
TAG |
名称 |
长度 |
值 |
9F02 |
受权金额(数值型) |
06 |
00 00 00 25 89 63 |
9F03 |
其余金额(数值型) |
06 |
00 00 00 00 00 00 |
9F1A |
终端国家代码 |
02 |
01 56 |
95 |
终端验证结果TVR |
05 |
00 80 04 00 00 |
5F2A |
交易货币代码 |
02 |
01 56 |
9A |
交易日期 |
03 |
13 07 03 |
9C |
交易类型 |
01 |
00 |
9F37 |
不可预知数 |
04 |
59 4F 0D E3 |
9F21 |
交易时间 |
03 |
19 15 27 |
9F4E |
商户名称 |
14 |
53 75 6E 79 61 72 64 20 45 4D 56 20 54 65 73 74 20 6D 65 72 |
经常使用的判断规则是:
标签9F02,必须与用户输入的交易金额一致,必须与GPO命令一致
标签9F03,国内都是6字节00
标签9F1A,国内都是01 56,不然是奇怪的值就是终端参数没设置好
标签95,每一个bit位的说明以下
字节1 bit8 未进行脱机数据认证(标签9F33错误,终端参数没设置好)
字节1 bit7 脱机静态数据认证SDA失败(没有公钥)
字节1 bit6 IC卡数据缺失
字节1 bit5 卡片出如今终端异常文件中(黑名单)
字节1 bit4 脱机动态数据认证DDA失败(没有公钥)
字节1 bit3 复合动态数据认证CDA/应用密文生成失败
字节1 bit2 执行了脱机静态数据认证SDA(没有公钥)
字节2 bit8 IC卡和终端应用版本不一致(AID参数不对)
字节2 bit7 应用已过时(查看终端日期)
字节2 bit6 应用还没有生效(查看终端日期)
字节2 bit5 卡片不容许所请求的服务
字节2 bit4 新卡
字节3 bit8 持卡人验证失败
字节3 bit7 未知的CVM
字节3 bit6 PIN重试次数超限(IC卡脱机PIN被锁)
字节3 bit5 要求输入PIN,但密码键盘不存在或工做不正常(没有输密码)
字节3 bit4 要求输入PIN,密码键盘存在,但未输入PIN(输入空密码)
字节3 bit3 输入联机PIN
字节4 bit8 交易超过最低限额
字节4 bit7 超过连续脱机交易下限
字节4 bit6 超过连续脱机交易上限
字节4 bit5 交易被随机选择联机处理
字节4 bit4 商户要求联机交易
字节5 bit8 使用缺省TDOL
字节5 bit7 发卡行认证失败
字节5 bit6 最后一次 GENERATE AC 命令以前脚本处理失败
字节5 bit5 最后一次 GENERATE AC 命令以后脚本处理失败
括号里是可能的错误缘由,根据实际95的值比对着查找缘由。
标签5F2A,国内都是01 56
标签DF69,支持国密就为01
标签9A,格式必须正确
标签9F21,格式必须正确
发送的数据检查无误后,还要检查55域数据是否与上述数据一致,这步相当重要,若是数据不一致后台就会报做弊卡。
若是最后一条命令是GPO命令(就是80 A8开头的),那么通常是IC卡余额不足而转联机了。
若是最后一条命令是读记录(就是00 B2开头的),而IC卡的钱被扣了而终端提示交易失败,基本是没有公钥致使的。