[英]javax.smartcardio case 4 APDU vanishing - 6700 response - warning
使用javax.smartcardio類進行智能卡編程時,我遇到了持續的錯誤-當代碼看起來不錯時,從卡上取回6700(無效長度)和類似的錯誤代碼。 示例代碼:
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
應該構造一個案例4 APDU。 為什么卡片會好像我丟失了什么東西一樣做出反應?
req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
應該構造一個案例4 APDU。 為什么卡片會好像我丟失了什么東西一樣做出反應?
使用aid, 0x100
代替aid, 0x00
。
那是因為Ne
和Le
之間的混淆。 Ne
是可以返回到終端的最大字節數。 Ne
是一個沒有具體表示的數字。 但是Le
是Ne
的編碼或以字節為單位的表示形式 。
現在,對於ISO / IEC 7816-4,有一個小技巧:如果沒有響應數據(RDATA)的ISO情況1或3命令,則Le
不存在(無字節)。 因此將Le = 00
定義為“無響應數據”是虛假的。 相反,7816-4使用Le = 00
表示Ne = 256
。 類似地, Le = 0000
(或Le = 000000
)表示Ne = 65536
,即2 ^ 16。 雙字節和三字節編碼僅用於擴展長度的APDU。
如您在CommandAPDU
構造函數中所見,您必須指定Ne
,而不是Le
。 因此,您指定的內容與說沒有響應數據相同。 因此,APDU無法正確解釋為ISO情況4,並且命令將失敗(在這種情況下,正確的是6700
正是您所期望的)。
因此,只需指定所需的字節數即可。 如果該值大於256,則將需要擴展長度的APDU(或命令鏈接,但這本身就是一個主題)。 當然不支持Ne < 0
或Ne > 64Ki
。
請注意, 包括Java Card API在內的許多協議描述都將 Ne
和Le
分為錯誤(順便說一句 ,這已在Java Card API v3.0.5中修復 )。 這很奇怪,因為7816-4存在許多問題,但這不是其中之一。 它被明確指定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.