Карта не возвращает слово состояния, когда извлекаемые данные превышают 256 байт - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю с картой в протоколе T = 0 :

  • Я посылаю на карту команду, которая запрашивает ответ с данными.
  • Предполагается, что используемый мной апплет ответит данными, потенциально более 256 байтов , поэтому в команде Le установлено значение '00'
  • Сначала карта отвечает с 61 XX где 'XX '- количество считываемых байтов (от 1 до 256).
  • Затем я получаю данные, отправляя команду GET RESPONSE:

    00 C0 00 00 XX

Ожидание:

Что касается ISO7816-3, я ожидал, что Карта ответит:

Procedure byte | Data | SW1 SW2

И если SW1 == 0x61, я отправлю:

00 C0 00 00 SW2

И так далее, пока в конечном итоге яget 90 00.

Реальность:

Тем не менее, это то, что у меня есть (уровень TPDU):

> Command
< 61 00

> 00 C0 00 00 00
< C0 (procedure byte)
< Data (256)
No Status Word, no procedure byte (timeout)

> 00 C0 00 00 00
< C0 (procedure byte)
< Data (256)
No Status Word, no procedure byte (timeout)

[...]

> 00 C0 00 00 00
< 61 39 (status word)

Я должен повторно отправить GET RESPONSE с P3= 00 (256), прочитайте 256 байтов и не получите слово состояния, пока карта не предупредит меня о том, что на самом деле осталось менее 256 байтов.

Я не могу найти ту часть спецификации, которая позволяетКарточка для «пропуска» слова состояния или как обращаться с ответами длиннее 256 байт.Есть указатель?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я понял: это была проблема синхронизации .

На карте есть Слово состояния для отправки, однако мой процесс между операциями чтения былслишком долго, поэтому к тому времени, когда я его запросил, его уже не было в карточке.

Я должен был подчеркнуть, что сам разрабатываю читательскую часть.

0 голосов
/ 10 декабря 2018

В протоколе T = 0 невозможно иметь данные более 256 байтов.

В вашем случае это может быть ошибка (или неправильное понимание) протокола вашего приложения, который после получения 256 байтовон по-прежнему отправляет 61XX назад.

На самом деле в вашем журнале неясно, что представляет собой Слово состояния вашей команды GET RESPONSE, и если оно равно 9000, то все в порядке и больше никаких обсуждений.В этом случае, если вы повторите команду GET RESPONSE, вы можете снова получить самые последние данные!

Просто чтобы ответить на ваши конкретные вопросы:

Я не могу найти ту часть спецификации, котораяпозволяет карте «пропустить» слово состояния

Вы можете просто проигнорировать это!

Я имею в виду, если карта сообщает, что у нее есть некоторые доступные данные (61 XX), и вы нене посылать команду GET RESPONSE, кроме другой команды, тогда данные будут потеряны.

или как обращаться с ответами длиннее 256 байт.Любой указатель?

В протоколе T = 0 это невозможно.Вместо этого лучше использовать протоколы T = 1 или T = 15.

Или вы можете как-то обойти его с помощью немного расширенного протокола, а затем вам следует переписать приложение, чтобы оно поддерживалось (если оно ваше), и оно можетбольше не будь стандартом!

...