扩展 APDU 和 T=0/1 通信协议

Extended APDUs and T=0/1 communication protocols

我有一张 JCOP V2.4.2 R3 java 卡,其数据表中提到了它 "The card support both T=1 and T=0 communication protocols"

我还有一张 ACR38 智能卡 reader,它支持 T=0 和 T=1 协议。 (我已经T=0与一张卡通信成功,T=1与这张卡通信成功。)

我编写了以下程序并将其上传到卡上以发送和接收扩展 APDU:

package extAPDU;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacardx.apdu.ExtendedLength;

public class ExAPDU extends Applet implements ExtendedLength {

    private ExAPDU() {
    }


    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new ExAPDU().register();
    }

    public void process(APDU arg0) throws ISOException {
        short number = arg0.setIncomingAndReceive();
        arg0.setOutgoingAndSend((short)0, (short)(number+7));
    }

}

在 CAD 端,我使用 python 脚本向卡发送不同的 APDU。问题是:

1-为什么我不能用T=0协议开始通信(虽然说网卡支持这个协议):

python 脚本:

from smartcard.scard import *
import smartcard.util
from smartcard.System import readers
from smartcard.CardConnection import CardConnection

r=readers()
print r
connection =r[0].createConnection()
connection.connect(CardConnection.T0_protocol)

normalCommand=[0x00,0xa4,0x04,0x00,0x06,0x01,0x02,0x03,0x04,0x05,0x06]
data,sw1,sw2=connection.transmit(normalCommand)
print "SW for Normal Command:"
print data,hex(sw1),hex(sw2)

输出:

>>> ================================ RESTART ================================
>>> 
['ACS CCID USB Reader 0']

Traceback (most recent call last):
  File "C:\extAPDU.py", line 13, in <module>
    connection.connect(CardConnection.T0_protocol)
  File "D:\PythonX\Lib\site-packages\smartcard\CardConnectionDecorator.py", line 54, in connect
    self.component.connect(protocol, mode, disposition)
  File "D:\PythonX\Lib\site-packages\smartcard\pcsc\PCSCCardConnection.py", line 118, in connect
    raise CardConnectionException('Unable to connect with protocol: ' + dictProtocol[pcscprotocol] + '. ' + SCardGetErrorMessage(hresult))
CardConnectionException: Unable to connect with protocol: T0. The requested protocols are incompatible with the protocol currently in use with the smart card. 
>>> 

2- 为什么网卡在 T=1 协议扩展形式的 Select APDU 命令下不能正常工作:

python 脚本:

from smartcard.scard import *
import smartcard.util
from smartcard.CardConnection import CardConnection
from smartcard.System import readers

r=readers()
print r
connection =r[0].createConnection()
connection.connect(CardConnection.T1_protocol)

normalCommand=[0x00,0xa4,0x04,0x00,0x00,0x00,0x06,0x01,0x02,0x03,0x04,0x05,0x06]
data,sw1,sw2=connection.transmit(normalCommand)
print "SW for Normal Command:"
print data,hex(sw1),hex(sw2)

输出:

>>> ================================ RESTART ================================
>>> 
['ACS CCID USB Reader 0']
SW for Normal Command:
[] 0x67 0x0
>>> 

我想我误解了这个概念,我混淆了扩展 APDU 与 T=1T=0 协议!

每个 T=1 兼容的智能卡都可以发送和接收扩展 APDU 吗?我们不能通过 T=0 协议发送和接收扩展 APDU?如果我们想向安全域发送扩展SELECT APDU命令,SD必须实现ExtendedLength接口?

对于扩展 APDU 传输有什么要求?

  1. 一张T=1兼容卡reader
  2. 一张 T=1 兼容智能卡
  3. 实现了ExtendedLength接口的小程序

对吗?

我对智能卡的扩展兼容性和 T=0/1 兼容性感到很困惑。任何光线都会受到赞赏。

请注意,我可以使用 T=1 协议将扩展 APDU 成功发送到上述小程序!

并非所有兼容 ISO 的卡都可以发送和接收扩展 APDU。这是一个非常可选的功能。您的卡执行哪个版本的 JCOP?

至于 T=0 与 T=1:当一张卡表示支持两种协议时,由卡 reader 决定使用哪一个。如果是 PC/SC 卡 reader,你对此无能为力。

更新补充:现在你说你可以成功发送扩展APDU到上面的小程序。所以看起来该卡确实支持扩展的 APDU。但是如果 Le 不存在,内置的 SELECT 命令可能不允许它们,因为它们没有用例。

Q1:可以更改协议。 hte卡支持哪些协议的信息通过ATR/ATS收发。然后终端可以决定使用哪一个。因此,是否可选择协议取决于您的终端shell。对于 JCOP Shell,这是 /change-protocol。 但是一般不推荐T=0。

Q2: 如果您通过发送 ATR/ATS 启动卡片,则卡片管理器处于活动状态,它仅支持全球平台命令。 Global Platform 从来不支持扩展长度。通过发送 Select 命令(因此必须是简单的长度)小程序被选中并且实际的 Select 命令也被转发到您的小程序的 process() 方法中(并且可以被检测到selectingApplet() 方法)。现在您已经在您的 Applet 中,您可以根据需要发送任意数量的扩展长度命令。您可以通过将小程序安装为默认选择来绕过初始的 Non-Extended-Length-Select。

Java 卡本身已经处理了 T=0 特定命令,因此 T=0/T=1 APDU 对程序员来说看起来几乎相同。当然存在差异,但这些差异在 APDU class.

中得到了很好的解释

T=0 是基于字节的协议,而 T=1 使用下面的帧。大多数 T=0 的卡不支持扩展长度。请注意,要获得扩展长度功能,需要实现 javacardx.apdu.ExtendedLength 标记接口。

JCOP 卡可以配置为使用 T=0/T=1/T=CL 等。但是,您需要访问卡(可能还有用户手册)才能配置卡。 Java 卡 API 不包含任何更改冷或热 ATR 中协议或传输协议参数支持的命令。

关于加长长度的要求,您是正确的。请注意,现在可能很难找到不支持 T=1 的读卡器。 T=0 是旧协议,T=1 应该是首选。