簡體   English   中英

使用APDU命令獲取卡的某些信息

[英]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支付系統的各種規范,這些規范定義了這些卡的數據結構和特定於應用程序的命令。

關於您的具體問題:

APDU總是至少包含5個字節嗎?

不,當然不是。 命令APDU至少包含4個字節(標頭字節)。 這些是

+-----+-----+-----+-----+
| CLA | INS | P1  | P2  |
+-----+-----+-----+-----+

這種4字節的APDU稱為“情況1”。 這意味着命令APDU不包含發送到卡的數據字段,並且不期望卡生成響應數據字段。 因此,響應APDU應僅包含響應狀態字:

+-----+-----+
| SW1 | SW2 |
+-----+-----+

命令APDU的第5個字節是什么?

第5個字節是長度字段(或者在擴展長度APDU的情況下長度字段的一部分,我將在本文中不再進一步解釋)。 根據具體情況,此長度字段可能有兩個含義:

  1. 如果命令APDU沒有數據字段,則該長度字段指示響應數據字段的預期長度(Ne):

    \n + ----- + ----- + ----- + ----- + ----- +\n |  CLA |  INS |  P1 |  P2 |  樂|\n + ----- + ----- + ----- + ----- + ----- +\n
    • Le = 0x01 .. 0xFF:這意味着預期的響應數據長度Ne是1,2,... 255字節(即恰好是Le的值)。
    • Le = 0x00:這意味着預期的響應數據長度Ne是256字節。 這通常用於指示卡為您提供盡可能多的字節(最多256個字節)。 因此,即使Le設置為0x00,您也不會總是從卡中獲得256個字節。
  2. 如果命令APDU本身具有數據字段,則該長度字段指示命令數據字段的長度(Nc):

    \n + ----- + ----- + ----- + ----- + ----- + ----------------- +\n |  CLA |  INS |  P1 |  P2 |  Lc |  DATA(Nc字節)|\n + ----- + ----- + ----- + ----- + ----- + ----------------- +\n
    • Lc = 0x01 ... 0xFF:這意味着命令數據長度Nc是1,2,... 255字節(即恰好是Lc的值)。
    • Lc = 0x00:這用於指示擴展長度APDU。
  3. 如果存在命令數據字段並且該命令期望生成響應數據,則該命令APDU可以再次跟隨Le字段:

    \n + ----- + ----- + ----- + ----- + ----- + ----------------- +  - ---- +\n |  CLA |  INS |  P1 |  P2 |  Lc |  DATA(Nc字節)|  樂|\n + ----- + ----- + ----- + ----- + ----- + ----------------- +  - ---- +\n

命令00 CA 00 5A是否正確?

可能不是,原因有以下幾點:

  1. 由於您希望卡提供響應數據字段(即數據對象0x5A),因此您需要指定Le字段。 因此,有效的格式將是

    \n + ------ + ------ + ------ + ------ + ------ +\n |  CLA |  INS |  P1 |  P2 |  樂|\n + ------ + ------ + ------ + ------ + ------ +\n |  0x00 |  0xCA |  0x00 |  0x5A |  0x00 |\n + ------ + ------ + ------ + ------ + ------ +\n
  2. 您將收到狀態字6E 00以響應該命令。 此狀態字的含義是“ class not supported ”。 這表示當前狀態不支持CLA字節設置為0x00的命令。 對於某些卡,這也僅僅意味着不支持CLA和INS( 00 CA )的這種組合,盡管這與ISO / IEC 7816-4中的定義相矛盾。

    總的來說,您可以假設您的卡在其當前執行狀態下不支持此命令。

  3. 假設您正在與EMV支付卡進行交互,通常需要先選擇一個應用程序。 你的問題並不表明你是否已經這樣做了,所以我想,你現在不這樣做。 通過發送SELECT(通過AID)命令來選擇應用程序:

    \n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n |  CLA |  INS |  P1 |  P2 |  樂|  數據|  樂|\n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n |  0x00 |  0xA4 |  0x04 |  0x00 |  0xXX |  應用程序AID |  0x00 |\n + ------ + ------ + ------ + ------ + ------ + -------------- --- + ------ +\n

    當然,應用程序AID的值取決於卡應用程序,可以通過遵循EMV規范中定義的發現過程來獲得。

  4. 即使在應用程序選擇之后,EMV應用程序的GET DATA APDU命令也在專有類中定義。 因此,CLA字節必須設置為0x80:

    \n + ------ + ------ + ------ + ------ + ------ +\n |  CLA |  INS |  P1 |  P2 |  樂|\n + ------ + ------ + ------ + ------ + ------ +\n |  0x80 |  0xCA |  0x00 |  0x5A |  0x00 |\n + ------ + ------ + ------ + ------ + ------ +\n
  5. 最后,即便如此,我也不知道任何卡允許您通過GET DATA命令檢索PAN的方案。 通常,PAN只能通過基於文件/記錄的訪問來訪問。 由於您沒有透露卡的具體類型/品牌,因此無法確定您的卡可能或可能不支持的卡。

在開始

標准ISO 7816包括幾個部分。 當終端設備供應商注意到ISO 7816時,他們只是確認公共物理特性(第1部分),維度和聯系人(第2部分)和傳輸協議(第3部分)已應用於設備讀取器。

ISO 7816第4部分中定義的APDU命令和響應(以及其他一些部分)是通用定義,您的智能卡可能不完全支持。

您需要了解與您的卡類型相關的卡終端交互層:

  • EMV是支付卡的ISO 7816的定制版本。
  • Global Card Brands使用基於EMV和ISO 7816的自定義規格。樣品Amex“AEIPS”,Diners“D-PAS”,MasterCard“M / Chip”,Visa“VIS”等。它們幾乎相同,差異很小與支持的命令,流和標​​簽列表相關。

不幸的是,大多數支付卡不應該使用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規范,標簽數據的格式可以是變量:

  • HEX (或二進制 )用於數字標簽的樣本,如金額;
  • BCD用於日期/時間的樣本或某些數字(如貨幣)。 PAN也是BCD編碼器;
  • 用於持卡人姓名,應用程序名稱的樣本的不同字符集(ASCII,Unicode,...)中的字符串。
  • 等等

標簽0x5A - 應用主帳號(PAN)編碼為BCD,並且在奇數PAN長度的情況下可以用0xF填充。

回答如何解讀您的特定標簽數據,因為APDU和應用程序狀態行為已經得到解答。 在SELECT應用程序之后,您可以啟動GET PROCESSING OPTIONS。 這是交易的實際開始。 在這里,您將返回一個名為AFL(應用程序文件定位器)的標簽。 您需要解析此元素並執行多個READ RECORDS,直到找到數據。 AFL是一組四字節數據(如果有兩組SFI,則會有8字節數據)。

  • 第一個字節表示SFI(5個最重要的字節是READ RECORD的P2的輸入)。 第二個字節表示要讀取的第一個記錄(輸入到READ RECORD的P1)。 第三個字節表示要讀取的最后一個記錄。(需要多次循環READ RECORD)第四個字節表示離線數據認證中涉及的記錄數。

在您解析時,您將找到所需的數據。 如果您不確定如何解析,請在此處嘗試復制十六進制數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM