Java-карта: отправить длинный ответ с T = 0 - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу отправить длинный ответ (1000+ байт) с карты на хост. Читатель имеет только T = 0. У меня есть несколько вопросов, интересно, если кто-нибудь знает:

  1. Насколько я понимаю, ExtendedLength работает только на T = 1, это правда?
  2. Если да, то есть ли лучшая практика при отправке длинного ответа при Т = 0?
  3. Одним из возможных решений является отправка данных по частям с кодом состояния 61xx. По сути, я бы вызвал APDU.sendBytesLong, а затем выдал исключение с 61xx, чтобы указать, что есть больше данных. Но кажется странным выдавать исключение, чтобы указать, что данных больше, даже если это соответствует стандарту

Всего наилучшего!

Джонни

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

1 - расширенная длина работает при T = 0, как объяснил @Maarten в своем ответе.

2 - Мне не известны какие-либо лучшие практики. Но вы можете попробовать реализовать, как описано в моем следующем ответе.

3 - Я частично согласен с этим, вы можете использовать цепочку ответов, чтобы получить все данные ответов. Хорошей новостью является то, что в зависимости от обстоятельств вам не нужно реализовывать различную обработку протокола на уровне апплета. Я предлагаю просто выполнить ту же обработку, что вы делали в T = 1, и я полагаю, что вы просто вызываете APDU.sendBytesLong. Тогда позвольте платформе делать остальное как волшебство.

На платформах javacard, с которыми я работал ранее, это приведет к следующему поведению:

Предположим, вы хотите отправить команду get Data для извлечения 1000 байтов данных:

  • Send Get Data, которая выдаст 256 байтов данных, за которыми следует 61xx
  • Отправлять APDU получения ответа (00 C0 00 00 плюс желаемое Le) столько, сколько необходимо, пока возвращаемое слово состояния не будет равно 9000, что означает, что все данные возвращаются.

Обратите внимание, что 61xx и обработка команды Get Response обрабатываются на уровне платформы, и вам не нужно ничего делать в апплете.

Вы можете попробовать и сообщить мне, работает ли он.

0 голосов
/ 09 ноября 2018

Насколько я понимаю, ExtendedLength работает только при T = 1, это правда?

Это не правда. В любом случае такое ограничение не указано в ИСО / МЭК 7816-4. Однако карта должна указывать поддержку расширенной длины в ATR / EF.ATR. Читатели могут не просто предполагать, что присутствует расширенная длина (но вы можете игнорировать это, если вы все равно обрабатываете приложение).

Если да, то есть ли лучшая практика при отправке длинного ответа на T = 0?

Существует много проблем с расширенной длиной, не все читатели поддерживают ее, Global Platform не поддерживает ее (может быть, последнюю версию я не проверял), а Java Card поддерживает только до 32Ki - 1 байт. Android только включил расширенную поддержку длины по умолчанию в последних версиях, но лучше ожидать, что телефоны с поддержкой NFC не справятся с этим правильно. ИСО / МЭК 7816-4 испортили спецификацию расширенной длины, особенно в более поздних версиях (начиная с 2015 года).

К сожалению, вы часто вынуждены использовать цепочку команд или просто выполнять несколько команд READ BINARY. Последнее определенно наименее подвержено ошибкам, но оно медленное, и обработка конца файла может быть сложной.

Одним из возможных решений является отправка данных по частям с кодом состояния 61xx. По сути, я бы вызвал APDU.sendBytesLong, а затем выдал исключение с 61xx, чтобы указать, что есть больше данных. Но кажется странным выдавать исключение, чтобы указать, что данных больше, даже если это соответствует стандарту.

Это правильное решение для цепочки команд.

Да, довольно глупо, что вы не можете указывать предупреждения, не выбрасывая исключение. Хорошо найдено. Но вы можете просто отправить данные и сгенерировать слово состояния, выдав исключение. Вероятно, лучше всего сохранить слово состояния и сгенерировать исключение в конце вашего метода process.

...