无法使用扩展长度 APDU 从卡中读取大数据

Posted

技术标签:

【中文标题】无法使用扩展长度 APDU 从卡中读取大数据【英文标题】:Unable to read large data from the Card using Extended Length APDU 【发布时间】:2016-07-22 07:36:44 【问题描述】:

我正在尝试使用扩展长度 APDU 将长度为 0x2CF0 字节的数据写入卡上,它工作正常。但是我无法使用扩展长度的 apdu 从卡中读取相同数量的数据。

我收到以下错误, “sun.security.smartcardio.PCSCException:未知错误 0x4d3”。

当我尝试加载大小为 0x1af0 字节的相对较小的数据时,我能够使用扩展长度的 apdu 从卡中成功写入和读取。

在扩展长度 apdu 中从卡中读取数据是否有任何限制?有没有不使用命令链的解决方法?

PS:我使用的是 JCOP 2.4.2 R2 卡。

【问题讨论】:

【参考方案1】:

典型的智能卡将要发送到读卡器的数据存储在 RAM 中。 (除其他外,这更容易确保不会发送来自非易失性存储器的秘密数据)。智能卡芯片的 RAM 有限,您会感到幸运,您的较小尝试(超过 6 k)仍然有效。

不幸的是,在 ATR 中,卡只能表明它完全支持扩展长度的 APDU,但不能达到哪个边界(如果输出经过安全消息处理,这也可能会有所不同)。

典型的方法是,为命令提供某种内部分区,例如。 G。在基于文件系统的文件中,使用了二进制文件的概念,该命令可以指定起始偏移量,参见this question。

链接通常无济于事;因为对于 MAC 计算,整个数据都需要存在,架构通常也会在所有其他情况下强制执行此操作。

【讨论】:

最新的 ISO 7816 应该能够指示缓冲区大小,即使对于特定的 AID 等也是如此。当然,如果没有客户端/读卡器和智能卡支持,这可能并不重要。 嗨 Guidot,是否可以使用 .apdu.setOutgoing() 从卡中读取如此大的数据; apdu.setOutgoingLength(); apdu.sendBytesLong() 命令组合?我可以将输出长度设置为 0x2CF0 并调用多个 apdu.sendBytesLong() 吗?? @Narasimha:不,你必须检查你的卡,它支持的最大输出大小,并使用相应的起始偏移增量进行循环。 @guidot,如果我使用扩展长度 APDU,我的卡支持 8090 字节。如果我尝试使用 4096 字节调用 apdu.SendBytesLong 3 次,我仍然会得到 PCSC 异常。如果我在增量循环中一次发送 255 个字节,我仍然会得到 PCSC 异常。您是否有使用多个 SendBytesLong 调用返回大数据的示例代码? 仅供参考,如果我尝试使用 pyapdutool 或使用 JCShell 中的 SCComm 终端读取数据,它工作正常。它仅在 java SmartCardIO 库和 PCSC 终端中失败。

以上是关于无法使用扩展长度 APDU 从卡中读取大数据的主要内容,如果未能解决你的问题,请参考以下文章

智能卡读卡器插件(插入卡)事件

支持扩展长度 APDU 的要求是啥?哪些智能手机支持它?

Braintree 可以在没有账单信息的情况下从卡中收取费用吗?

使用 ISO 7816-4 APDU 的 DESFire 卡中的外部身份验证

APDU MIFARE Classic 4K 读取特定扇区/块的值

从 emv 卡中获取 IBAN 号码