android - 使用 Android NFC 向 Java Card 发送超过 261 个字节

标签 android nfc javacard apdu contactless-smartcard

我想通过 NFC(类 IsoDep)将长度为 1699 字节的 APDU 发送到 Java Card 智能卡。我得到错误

java.io.IOException: Transceive length exceeds supported maximum

我的手机是三星 Galaxy S7。

我在卡上的小程序中使用了扩展长度。我已经验证该卡支持扩展长度。我通过 pyapdutool 向卡发送一个 4000 字节的 APDU 对此进行了测试。

我发现当我写这段代码时,结果是false:

final Tag t = (Tag) tag;
myTag = IsoDep.get(t);
boolean result = myTag.isExtendedLengthApduSupported();

我的 list 中有这个:

<activity
        android:name=".test"
        android:label="@string/title_test"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" >
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    </intent-filter>
</activity>

如何通过 Android NFC 发送 1699 字节(或任何长度大于 261​​ 字节)的 APDU?

最佳答案

简短的回答:你不能轻易做到这一点。

您已经发现 IsoDep 不“支持”设备上的扩展长度 APDU(即 isoDep.isExtendedLengthApduSupported() 返回 false).事实上,这意味着您不能通过IsoDep 对象发送扩展长度的APDU。它实际上只意味着 IsoDep 对象不会将扩展长度的 APDU 正确地拆分到两个以上的 ISO-DEP block 中,因此长度超过 261 字节的 APDU 将被假定为超过传输缓冲区尺寸。您应该仍然能够发送大小 <= 261 字节的扩展长度 APDU。

所以 isoDep.isExtendedLengthApduSupported() 实际上表明您是否可以在一个 ISO-DEP 收发器中发送超过 261 个字节。

要克服这个问题,您可以做的是完全不使用 IsoDep 对象,而是在NfcA 对象(如果您的卡基于 NFC-A/ISO/IEC 14443 Type A)或 NfcB 对象(如果您的卡基于 NFC-B/ISO/IEC 14443 B 类 如果您的设备支持通过NfcB 对象交换数据)。然后,您可以将扩展长度的 APDU 拆分为足够小的 ISO-DEP block ,以供 NFC Controller 的收发缓冲区使用(通常为 253 字节,包括 header 字节,不包括 CRC 字节)。然而,自己处理 ISO-DEP 协议(protocol)也意味着你必须注意适当的 ISO-DEP 激活,处理 block 编号、 block 确认、超时、等待时间延长等。这是相当复杂的,尤其是超时是由于 Android NFC 堆栈的延迟,不容易观察到。

关于android - 使用 Android NFC 向 Java Card 发送超过 261 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40366099/

相关文章:

java - 在依赖于 Android 插件的自定义 Gradle 插件的单元测试中模拟应用程序变体

android - 使用Android的NFC Mifare Ultralight C认证超时

gsm - 如何使用 SIM 卡(安装小程序)

smartcard - Java 卡本地固定大小数组可变内存存储位置

android - setFragmentResult 在单击监听器上不起作用

javascript - 如果从短信中的链接打开站点,则在触摸之前不会触发 beforeinstallprompt

android - android中MVP的优势

android - 我如何使用 ADT 在我的笔记本电脑上测试 Android HCE?

android - 为什么Android HCE 不支持Mifare Classic 类型?

gradle - Gradle/javacard插件是否支持在多项目gradle构建中构建两个applet依赖项?