使用 javax.smartcardio 时 DESfire EV1 为 PPS 命令包装 APDU 的问题

Posted

技术标签:

【中文标题】使用 javax.smartcardio 时 DESfire EV1 为 PPS 命令包装 APDU 的问题【英文标题】:Issue with DESfire EV1 wrapped APDU for PPS command while using javax.smartcardio 【发布时间】:2014-02-06 20:41:55 【问题描述】:

我正在用 Java 编写一个软件,在阅读器端与 MiFare DESfire EV1 卡进行通信。 我正在使用这个javax.smartcardio。我设法创建了一个通道并发送了本机 DESfire 命令的包装 APDU。例如,我设法读取文件甚至进行身份验证。

最近几天我一直在努力解决的问题是尝试在 4 级发送 PPS 命令,以便能够设置读卡器和卡之间的波特率。

原生PPS命令如下:

DESFIRE command code 0xD0
DESFIRE command parameter 0x11 0x0A 

如果我与我之前构建 ISO 7816-4 包装 APDU 的技术一致,那么它应该看起来像这样 0x90 0xD0 0x00 0x00 0x2 0x11 0x0A 0x00

这是该命令的响应:

SW1 : 0x91
DESFIRE response data : 0x1C
SW2 : none

0x1C 代表ILLEGAL_COMMAND_CODE;语法对我来说似乎是正确的,为什么我不能发送这个命令?

【问题讨论】:

【参考方案1】:

使用 APDU 包装,您只能包装 DESFire 命令。 PPS 命令是底层 ISO 14443-4 层的一部分。事实上,PPS 命令是 ISO 14443-4 传输协议初始化阶段的一部分。但是,一旦您可以传输 APDU,就已经建立了 ISO 14443-4 传输协议 (ISO-DEP / T=CL)。所以此时您无法使用 PPS 命令更改任何协议参数。

一般情况下,您不能通过javax.smartcardio 更改这些参数,除非智能卡读卡器实现了某些特定接口以重新激活具有不同数据速率的卡。

【讨论】:

感谢Michael的回答,我想我可以在4级发送PPS。什么样的智能卡读卡器实现了重新激活卡设置的接口?我正在和 SpringCard 的读者一起玩。他们提供了一个接口,但我无法达到 848 kbauds。 Springcard 的 Prox'n'Roll PC/SC 应该没问题。查阅读者手册并检查它是否提供任何配置寄存器来设置自动波特率握手。

以上是关于使用 javax.smartcardio 时 DESfire EV1 为 PPS 命令包装 APDU 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Open JDK 11(Redhat)上找不到 javax.smartcardio.*

通过 javax.smartcardio 连接到 micro SD

使用 javax.smartcardio 读取 NFC Mifare Ultralight 卡

如何在 Android 上使用 javax.smartcardio 包?

在 Android 上使用 javax.smartcardio 包?

getATR() 不会在 javax.smartcardio 中重置智能卡