Расширенные APDU и T=0/1 протоколы связи

У меня есть 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));
    }

}

В 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. Почему карта не работает нормально с командами 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?

  1. A T=1 совместимый картридер
  2. A T=1 совместимая смарт-карта
  3. Апплет, который реализовал ExtendedLength интерфейс

Это правильно?

Я действительно запутался в расширенной совместимости и T=0/1 совместимость в смарт-картах. Любой свет будет оценен.

Обратите внимание, что я могу успешно отправить расширенные APDU в вышеупомянутый апплет с T=1 протокол!

3 ответа

Решение

Q1: изменение протокола возможно. Информация о том, какие протоколы поддерживает карта, передается через ATR/ATS. Затем терминал может решить, какой из них использовать. Так что это зависит от вашей терминальной оболочки, если протоколы выбираются или нет. Для JCOP Shell это /change-protocol, Однако не рекомендуется использовать T=0 в целом.

В2: Если вы запускаете карту через отправку ATR / ATS, активен диспетчер карт, который поддерживает только команды Глобальной платформы. Global Platform не поддерживает Extended Length, как никогда. Посылая команду Select (которая должна быть простой длины из-за этого), апплет выбирается, и что фактические команды Select также направляются в ваш апплет. process() метод (и может быть обнаружен selectingApplet() метод). Теперь, когда вы находитесь в своем апплете, вы можете отправлять столько команд расширенной длины, сколько захотите. Вы можете обойти начальный Non-Extended-Length-Select, установив ваш апплет как выбранный по умолчанию.

Это не тот случай, когда каждая ISO-совместимая карта может отправлять и получать расширенные APDU. Это очень дополнительная функция. Какую версию JCOP использует ваша карта?

Что касается T=0 против T=1: когда карта указывает на поддержку обоих протоколов, именно карт-ридер решает, какой из них использовать. Если это кардридер PC/SC, вы ничего не можете с этим поделать.

Обновлено для добавления: Теперь вы говорите, что можете успешно отправлять расширенные APDU в вышеупомянутый апплет. Таким образом, похоже, что карта поддерживает расширенные APDU. Но, возможно, встроенная команда SELECT не позволяет им, если Le отсутствует, потому что для них нет варианта использования.

Сама Java-карта уже обрабатывает определенные команды T=0, поэтому APDU T=0 / T=1 будет выглядеть практически так же для программиста. Конечно, есть различия, но они довольно хорошо объяснены в классе APDU.

T=0 - это протокол, основанный на байтах, в то время как T=1 использует кадры внизу. Большинство карт с T=0 не поддерживают расширенную длину. Обратите внимание, что для получения расширенной функциональности javacardx.apdu.ExtendedLength интерфейс тегирования должен быть реализован.

Карты JCOP могут быть настроены на использование T=0/T=1/T=CL и других. Однако вам необходимо иметь доступ к карте (и, возможно, к руководству пользователя) для настройки карт. API-интерфейс Java Card не содержит команд для изменения поддержки протоколов или параметров транспортного протокола в холодном или теплом ATR.

Вы правы в отношении требований к увеличенной длине. Обратите внимание, что кард-ридеры, не способные к T=1, вероятно, будет трудно найти сейчас. Т = 0 - старый протокол, Т = 1 должен быть предпочтительным.

Другие вопросы по тегам