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



我有一个JCOP V2.4.2 R3 java卡,它在数据表中提到"该卡支持T=1T=0通信协议"

我还有一个ACR38智能卡读卡器,它支持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:PythonXLibsite-packagessmartcardCardConnectionDecorator.py", line 54, in connect
    self.component.connect(protocol, mode, disposition)
  File "D:PythonXLibsite-packagessmartcardpcscPCSCCardConnection.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
>>> 

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

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

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

  1. 一个T=1兼容的读卡器
  2. 一个T=1兼容的智能卡
  3. 实现ExtendedLength接口的小程序

对吗?

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

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

Q1:可以更改协议。hte卡支持哪些协议的信息通过/ATS进行收发。然后,终端可以决定使用哪一个。因此,协议是否可选取决于终端外壳。对于JCOP Shell,这是/change-protocol。但是,一般情况下不建议T=0。

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

并非每个ISO兼容卡都可以发送和接收扩展的APDU。这在很大程度上是一个可选功能。您的卡实现了什么版本的JCOP?

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

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

Java Card本身已经处理了T=0特定的命令,因此T=0/T=1 APDU对程序员来说几乎是一样的。当然也有差异,但这些差异在APDU课程中得到了很好的解释。

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

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

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

相关内容

  • 没有找到相关文章

最新更新