[英]Use APDU commands to get some information for a card
我有一個終端,它有自己的API來固定和發送芯片和終端之間的命令,有一個功能,它發送APDU命令並以字節數組返回答案。
例如,如果想要讀取標簽5A(應用程序PAN),我發送以下命令:
byte[] byteArrayAPDU = new byte[]{(byte)0x00, (byte)0xCA, (byte)0x00, (byte)0x5A};
int nResult = SmartCardInterface.transmit(nCardHandle, byteArrayAPDU, byteArrayResponse);
變量byteArrayResponse
獲取對APDU命令的響應。
當我將byteArrayAPDU
的值轉換為十六進制數字字符串時,這給了我: 00 CA 00 5A
。 並且對該命令的響應是6E 00
(不支持類)。
我的設備使用ISO 7816作為技術規格。 我發送APDU命令的方式是否正確? 我問這個是因為我已經讀過APDU命令至少必須有5個值,但我不知道在第五個參數中要發送什么。 我不知道答案的長度是什么。
您能舉例說明如何在APDU命令中獲取標簽5A或其他內容嗎?
如果命令正確,取代我此刻看到的6E 00
,我會在投射到字符串時將信息看作純文本嗎?
您在問題中顯示的輸入和輸出值表明您使用方法transceive()
是正確的,即第二個參數是命令APDU,第三個參數用響應APDU填充:
resultCode = SmartCardInterface.transmit(cardHandle, commandAPDU, ResponseAPDU);
您關於APDU命令的格式和有效性的問題相當廣泛。 通常,APDU的格式和一組基本命令在ISO / IEC 7816-4中定義。 由於您使用emv標記了問題並提及了應用程序主帳號,因此您可能正在與某種形式的EMV支付卡進行交互(例如,來自其中一個主要方案的信用卡或借記卡)。 在這種情況下,您可能希望研究EMV支付系統的各種規范,這些規范定義了這些卡的數據結構和特定於應用程序的命令。
關於您的具體問題:
不,當然不是。 命令APDU至少包含4個字節(標頭字節)。 這些是
+-----+-----+-----+-----+ | CLA | INS | P1 | P2 | +-----+-----+-----+-----+
這種4字節的APDU稱為“情況1”。 這意味着命令APDU不包含發送到卡的數據字段,並且不期望卡生成響應數據字段。 因此,響應APDU應僅包含響應狀態字:
+-----+-----+ | SW1 | SW2 | +-----+-----+
第5個字節是長度字段(或者在擴展長度APDU的情況下長度字段的一部分,我將在本文中不再進一步解釋)。 根據具體情況,此長度字段可能有兩個含義:
如果命令APDU沒有數據字段,則該長度字段指示響應數據字段的預期長度(Ne):
\n + ----- + ----- + ----- + ----- + ----- +\n | CLA | INS | P1 | P2 | 樂|\n + ----- + ----- + ----- + ----- + ----- +\n
如果命令APDU本身具有數據字段,則該長度字段指示命令數據字段的長度(Nc):
\n + ----- + ----- + ----- + ----- + ----- + ----------------- +\n | CLA | INS | P1 | P2 | Lc | DATA(Nc字節)|\n + ----- + ----- + ----- + ----- + ----- + ----------------- +\n
如果存在命令數據字段並且該命令期望生成響應數據,則該命令APDU可以再次跟隨Le字段:
\n + ----- + ----- + ----- + ----- + ----- + ----------------- + - ---- +\n | CLA | INS | P1 | P2 | Lc | DATA(Nc字節)| 樂|\n + ----- + ----- + ----- + ----- + ----- + ----------------- + - ---- +\n
00 CA 00 5A
是否正確? 可能不是,原因有以下幾點:
由於您希望卡提供響應數據字段(即數據對象0x5A),因此您需要指定Le字段。 因此,有效的格式將是
\n + ------ + ------ + ------ + ------ + ------ +\n | CLA | INS | P1 | P2 | 樂|\n + ------ + ------ + ------ + ------ + ------ +\n | 0x00 | 0xCA | 0x00 | 0x5A | 0x00 |\n + ------ + ------ + ------ + ------ + ------ +\n
您將收到狀態字6E 00
以響應該命令。 此狀態字的含義是“ class not supported ”。 這表示當前狀態不支持CLA字節設置為0x00的命令。 對於某些卡,這也僅僅意味着不支持CLA和INS( 00 CA
)的這種組合,盡管這與ISO / IEC 7816-4中的定義相矛盾。
總的來說,您可以假設您的卡在其當前執行狀態下不支持此命令。
假設您正在與EMV支付卡進行交互,通常需要先選擇一個應用程序。 你的問題並不表明你是否已經這樣做了,所以我想,你現在不這樣做。 通過發送SELECT(通過AID)命令來選擇應用程序:
\n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n | CLA | INS | P1 | P2 | 樂| 數據| 樂|\n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n | 0x00 | 0xA4 | 0x04 | 0x00 | 0xXX | 應用程序AID | 0x00 |\n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n
當然,應用程序AID的值取決於卡應用程序,可以通過遵循EMV規范中定義的發現過程來獲得。
即使在應用程序選擇之后,EMV應用程序的GET DATA APDU命令也在專有類中定義。 因此,CLA字節必須設置為0x80:
\n + ------ + ------ + ------ + ------ + ------ +\n | CLA | INS | P1 | P2 | 樂|\n + ------ + ------ + ------ + ------ + ------ +\n | 0x80 | 0xCA | 0x00 | 0x5A | 0x00 |\n + ------ + ------ + ------ + ------ + ------ +\n
最后,即便如此,我也不知道任何卡允許您通過GET DATA命令檢索PAN的方案。 通常,PAN只能通過基於文件/記錄的訪問來訪問。 由於您沒有透露卡的具體類型/品牌,因此無法確定您的卡可能或可能不支持的卡。
在開始
標准ISO 7816包括幾個部分。 當終端設備供應商注意到ISO 7816時,他們只是確認公共物理特性(第1部分),維度和聯系人(第2部分)和傳輸協議(第3部分)已應用於設備讀取器。
ISO 7816第4部分中定義的APDU命令和響應(以及其他一些部分)是通用定義,您的智能卡可能不完全支持。
您需要了解與您的卡類型相關的卡終端交互層:
不幸的是,大多數支付卡不應該使用GET DATA APDU命令返回Tag 0x5A值。 通常您需要遵循付款程序。 至少從SFI卡記錄中選擇SELECT卡應用程序和READ標記值。
根據EMV GET DATA P1 P2值應該用於標簽0x9F36,0x9F13,0x9F17或0x9F4F。
回答你的問題:
在第五個參數中發送什么? 響應的長度是多少?
第五個字節稱為“Le” - 期望數據的長度。 您可以嘗試使用Le =“ 00 ”。 如果卡支持APDU命令,則可以將SW1SW2作為0x“ 6Cxx ”,其中xx是所請求數據的十六進制長度。 當您可以使用正確的Le值重復相同的命令。
如需樣品,請閱讀PIN計數器
Get Data (Tag = '9F 17')
Request : 80 CA 9F 17 00
Response: 6C 04
SW1 SW2: 6C 04 (SW_Warning Wrong length(Le))
Get Data (Tag = '9F 17')
Request : 80 CA 9F 17 04
Response: 9F 17 01 00 90 00
Data : 9F 17 01 03 // Tag + Length + Value
Tag 9F 17: Personal Identification Number (PIN) Try Counter : 03
SW1 SW2 : 90 00 (SW_OK)
如果命令在令人滿意的地方看到6E 00在投下字符串的答案的那一刻我會將信息看作純文本?
使用BYTE編碼的APDU命令和響應。 根據提供的終端API示例,您將獲得字節數組。
作為開發人員,您可以將字節轉換為所需格式或按原樣使用。 請記住,根據EMV規范,標簽數據的格式可以是變量:
標簽0x5A - 應用主帳號(PAN)編碼為BCD,並且在奇數PAN長度的情況下可以用0xF填充。
回答如何解讀您的特定標簽數據,因為APDU和應用程序狀態行為已經得到解答。 在SELECT應用程序之后,您可以啟動GET PROCESSING OPTIONS。 這是交易的實際開始。 在這里,您將返回一個名為AFL(應用程序文件定位器)的標簽。 您需要解析此元素並執行多個READ RECORDS,直到找到數據。 AFL是一組四字節數據(如果有兩組SFI,則會有8字節數據)。
在您解析時,您將找到所需的數據。 如果您不確定如何解析,請在此處嘗試復制十六進制數據
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.