首页 文章

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

提问于
浏览
3

我想通过NFC(类 IsoDep )向Java Card智能卡发送长度为1699字节的APDU . 我收到了错误

java.io.IOException:收发长度超过支持的最大值

我的手机是三星Galaxy S7 .

我在卡片上的小程序中使用了扩展长度 . 我已经确认该卡支持扩展长度 . 我通过发送一个4000字节的APDU到卡上通过pyapdutool进行了测试 .

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

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

我的清单中有这个:

<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?

1 回答

  • 3

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

    您已经发现 IsoDep 在您的设备上没有"support"扩展长度的APDU(即 isoDep.isExtendedLengthApduSupported() 返回 false ) . 实际上这确实是 not 意味着您无法通过 IsoDep 对象发送扩展长度的APDU . 它实际上只意味着 IsoDep 对象不会跨两个以上的ISO-DEP块正确地分割扩展长度的APDU,因此假定长度超过261字节的APDU超过发送缓冲区大小 . 您仍然可以发送大小<= 261字节的扩展长度APDU .

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

    你可以做的就是不要使用 IsoDep 对象,而是在 NfcA 对象上手动实现ISO-DEP(ISO / IEC 14443-4传输协议)(如果你的卡基于NFC-A / ISO / IEC 14443类型A)或 NfcB 对象(如果您的设备支持通过 NfcB 对象交换数据,则表示您的卡基于NFC-B / ISO / IEC 14443类型B and ) . 然后,您可以将扩展长度的APDU分成ISO-DEP块,这些块足够小,可用于NFC控制器的收发缓冲区(通常为253字节,包括头字节,不包括CRC字节) . 但是,自己处理ISO-DEP协议也意味着你必须处理正确的ISO-DEP激活,处理块编号,阻止确认,超时,等待时间扩展等 . 这是相当复杂的,特别是超时是由于Android NFC堆栈的延迟,不容易观察 .

相关问题