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 00
發送:00 B2 01 0C 00
接收:6A 83
一、 下載AID、公鑰、黑名單參數
AID與公鑰一般是POS機第一次與后台簽到的時候自動下發的,數量會比較多,如果中途出現失敗,十之八九是通訊異常,比如modem、gprs通訊斷了等原因,與EMV內核沒什么關系。
二、 選擇PSE
根據規范,現在終端都要支持目錄選擇方法。如果給IC卡發送第一條的指令不是選擇PSE,也就是
發送: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
六、 生成第一次應用密文GENERATR AC
查找第一條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域數據是否與上述數據一致,這步至關重要,如果數據不一致后台就會報作弊卡。
七、 QPBOC相關
如果最后一條命令是GPO命令(就是80 A8開頭的),那么一般是IC卡余額不足而轉聯機了。
如果最后一條命令是讀記錄(就是00 B2開頭的),而IC卡的錢被扣了而終端提示交易失敗,基本是沒有公鑰導致的。