У меня есть java-карта JCOP V2.4.2 R3, которая упоминается в ее техническом описании «Карта поддерживает протоколы связи T=1
и T=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));
}
}
На стороне САПР я использовал скрипты 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- Почему карта не работает нормально с командами Select APDU в расширенной форме по протоколу T = 1:
Скрипт на 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=1
и T=0
!
Может ли каждая T=1
совместимая смарт-карта отправлять и получать расширенные APDU? и мы не можем отправлять и получать расширенные APDU по T=0
протоколам? Если мы хотим отправлять расширенные команды SELECT APDU в домен безопасности, SD должен реализовывать ExtendedLength
интерфейс?
Каковы требования для передачи расширенного APDU?
- Картридер, совместимый с A T = 1
- Смарт-карта, совместимая с T = 1
- Апплет, реализующий
ExtendedLength
интерфейс
Это правильно?
Меня действительно смущает расширенная совместимость и T=0/1
совместимость смарт-карт. Любой свет будет оценен по достоинству.
Обратите внимание, что я могу успешно отправить расширенные APDU в указанный выше апплет с протоколом T=1
!