簡體   English   中英

與Mifare DESFire EV1進行Android NFC通信

[英]Android NFC communication with Mifare DESFire EV1

使用Nexus 4和最新的Android API級別18與Mifare DESFire EV1 AES標簽進行通信讓我頭疼。 遵循NXP本機協議以編寫和讀取此類型的標記,必須遵循以下步驟:

  1. 選擇申請
  2. 認證
  3. 寫或讀

為此,我使用Android的IsoDep類,它提供對ISO 14443-4屬性和I / O操作的訪問。 關於它的一個非常奇怪的事情是,一旦我發送選擇應用程序本機命令,我得到一個意外的響應。 想象一下,我有AID F4013D所以我發送:

-> 5AF4013D
<- 6E00

所有可能的響應必須是一個字節長度(成功0x00或error_code),而不是兩個或更多。 因此,成功響應之前的0x6E絕對是意外的。 它並不總是發生,當它沒有並且工作正常時,選擇的應用程序和身份驗證過程可以正常工作。 但是,一旦經過身份驗證,寫入命令就沒有正確的行為,所有寫入命令0xAF以PICC的0xAF結束而不是成功0x00 似乎PICC不應該期待一些額外的數據(我發送正確長度的有效載荷)。 如果我發送任何其他命令,我會得到一個0xCA (命令中止)錯誤代碼。

-> 5AF4013D
<- 00 /*Success*/
-> AA01
<- AFA8394ED57A5E83106B4EE72FD2BB0CC4
-> AF148F525E1DDE0AD6AB60B4B615552475C91F2E8D89B8523E4465113DD5BD19C6 
<- 0066D255C93F2F492AFE3715C88964F1BD /*Authentication success*/
-> 3D02000000030000222222 /*Write 3 bytes to file nº2*/
<- AF /*Unexpected, 0x00 was expected*/

正常情況下,如果我使用個人閱讀器(非Android NFC)發送這些類型的命令,它總能正常工作。 似乎Android NFC API中的某些內容很奇怪,它應該只是一個從不解釋或修改數據的原始數據傳輸器。

我也嘗試了ISO 7816-4 APDU結構,結果相同。 作為一個好奇心,Galaxy Nexus不會發生選擇應用程序奇怪的響應,但是一直是寫命令。

(1)關於狀態代碼6E00的第一部分:

6E 00不是“奇怪的字節0x6E +成功狀態碼0x00 ”。 相反,它是響應APDU狀態字6E 00 (“不支持類”)。 這表示先前使用基於APDU的訪問與卡進行了通信(例如,Android本身嘗試將卡讀取為類型4標簽,之后沒有重置連接)。 因此,該卡將期望所有進一步的通信都在ISO 7816-4 APDU中。 在這種情況下(即如果您收到ISO 7816-4狀態代碼,如6E 00 ),您可以通過簡單地包裝本機命令繼續使用DESFire APDU包裝的命令。

編輯:事實上,這在NFC設備上有些預期的行為。 這個想法是NFC設備將自動掃描檢測到的NDEF消息標簽。 在DESFire卡的情況下,NFC設備將檢測到卡作為潛在的Type 4標簽。 因此,NFC設備將發送ISO 7816-4 APDU,因為它將發送到任何其他類型4標簽。 因此,如果NFC設備在將檢測到的標簽交給應用程序之前沒有重置與標簽的通信,則應用程序只能使用ISO 7816-4 APDU進行通信。 但請注意,我認為這只是在同一設備上進行某些激活時才會發生的錯誤。 在我看來, 一個特定設備模型上的行為應該是一致的。

編輯:雖然我不認為這種行為是一個錯誤,但它實際上是由Android的NFC堆棧中的已知錯誤( #58773 )引起的,這些錯誤適用於具有Broadcom NFC控制器的設備。 在受影響的設備上,自動存在檢查以定時間隔發送ISO 7816-4 APDU,導致DESFire卡切換到ISO 7816-4 APDU模式。


(2)關於(意外)響應代碼0xAF的第二部分:

可能是您的文件的通信設置是為“通過MACing保護的普通通信”還是“完全加密的通信”設置的? 在這種情況下,僅發送三個數據字節是不夠的。 相反,您需要發送普通數據加MAC或填充,CRC化和加密數據。 因此, 0xAF表示該卡期望進一步的數據。

編輯:所以總結下面的評論。 在發送了更多字節后(每個接收到的0xAF狀態代碼一次一個字節: AF FF ),結果證明該卡預計還有8個字節。 8個字節正好是AES身份驗證的CMAC大小。 因此,通信設置被設置為“通過MACing保證的普通通信”。

您可以在這里找到一個包含一些示例的好庫: https//github.com/grundid/nfctools

另外還有一些例子: https : //code.google.com/p/ismb-npp-java/

我希望這有助於您的目的!

暫無
暫無

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

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