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

时间:2015-03-04 13:39:22

标签: smartcard javacard smartcard-reader globalplatform pyscard

我有一个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:\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?如果我们要将Extended SELECT APDU命令发送到安全域,SD必须实现ExtendedLength接口吗?

对于扩展APDU传输有哪些要求?

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

    是不是?

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

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

3 个答案:

答案 0 :(得分:8)

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

Q2:如果您通过发送ATR / ATS启动卡,则卡管理器处于活动状态,仅支持全局平台命令。全球平台不支持扩展长度。通过发送Select命令(因此必须是简单的长度),applet被选中,实际的Select命令也被转发到Applet的process()方法中(并且可以通过selectingApplet()方法检测) 。现在您已进入Applet,可以根据需要发送尽可能多的扩展长度命令。您可以通过将applet安装为默认选项来绕过初始非扩展长度选择。

答案 1 :(得分:5)

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

对于T = 0对比T = 1:当卡表示支持两种协议时,读卡器决定使用哪种协议。如果它是PC / SC卡读卡器,那么你无能为力。

已更新以添加:现在您说您可以成功将扩展APDU发送到上述小程序。所以看起来该卡确实支持扩展的APDU。但也许内置的SELECT命令在Le不存在的情况下不允许它们,因为它们没有用例。

答案 2 :(得分:3)

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不包含任何更改冷或热ATR内协议或传输协议参数支持的命令。

关于延长长度的要求,你是对的。请注意,现在可能很难找到不具备T = 1的读卡器。 T = 0是旧协议,T = 1应该是首选。