Насколько я понимаю, 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
.