无法使用扩展长度 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 从卡中读取大数据的主要内容,如果未能解决你的问题,请参考以下文章
Braintree 可以在没有账单信息的情况下从卡中收取费用吗?
使用 ISO 7816-4 APDU 的 DESFire 卡中的外部身份验证