ISO7816.SW_BYTES_REMAINING_00 возвращает статус 9000 в javacard

У меня проблема, которая смутила меня на пару дней. Я хочу отправить данные размером более 255 байт со смарт-карты в хост-приложение. Я видел блок кода на каком-то сайте. этот код выглядит следующим образом:

private void sendData(APDU apdu) {
        // work out how many bytes to send this time and how many will be left
        BUF_IN_OFFSET[0] = 0;

        short remain = (short) ((short)372 - BUF_IN_OFFSET[0]);
        boolean chain = remain > MAX_APDU;
        short sendLen = chain ? MAX_APDU : remain;
        Util.arrayCopy(data, (short) 0, apdu.getBuffer(), (short) 0, sendLen);
        // Get ready to send
        apdu.setOutgoing();
        apdu.setOutgoingLength((short)sendLen);
        apdu.sendBytesLong(apdu.getBuffer(), BUF_IN_OFFSET[0], sendLen);

         // Check to see if there are more APDU's to send
        if (chain) {
            BUF_IN_OFFSET[0] += sendLen; // count the bytes sent
            remain -=sendLen;
            ISOException.throwIt((short)((ISO7816.SW_BYTES_REMAINING_00) + remain));

        } else {
            BUF_IN_OFFSET[0] = 0; // no more bytes to send
        }


    }

Когда я отправляю apdu на карту в симуляторе netbeans, он отправляет 6100 правильно. но когда я отправляю его на реальную карту (smartcafe 3.2). мне прислали 9000. значит в симуляторе работает, а на реальной карте не работает. Я предполагаю, что это связано с протоколом T=0 или T=1. Я не нашел кода для T=1. выше код для T = 0.

заранее спасибо.


person Mohsen Gorgani    schedule 22.10.2013    source источник
comment
Не проще ли позволить хост-приложению сохранять информацию о смещении? (Т.е. предоставить инструкцию GET LENGTH и инструкцию READ BINARY с параметром смещения.)   -  person martijno    schedule 23.10.2013
comment
В некоторых случаях ваш комментарий верен, например, когда вам нужен поток байтов. но в некоторых случаях апплет делает все, например, читает объект, созданный на карте.   -  person Mohsen Gorgani    schedule 23.10.2013


Ответы (1)


«6100» звучит как противоречие в терминах. Он говорит читателю получить некоторые данные, при этом доступная длина равна нулю. Я считаю, что настоящая карта на самом деле превратит это в 9000, что является правильным кодом состояния выполнения, когда данные недоступны.

person takumar    schedule 22.10.2013
comment
спасибо за ответ takumar. Я согласен с вами, если в карте нет данных, но у меня больше данных. согласно приведенному выше коду все данные хранятся в переменной данных длиной 372 байта. Я читаю 255 байт в первой команде и отправляю (ISO7816.SW_BYTES_REMAINING_00 + оставшиеся байты) на хост, чтобы сказать, что есть еще данные и какова их длина. затем хост отправляет команды ответа на чтение оставшихся данных. - person Mohsen Gorgani; 22.10.2013
comment
Почему бы просто не отправить весь блок данных в ОС карты для управления и позволить ей генерировать для вас коды 61xx? На мой взгляд, это не должно быть закодировано на уровне приложения, потому что это общий транспортный механизм. - person takumar; 23.10.2013
comment
Вы имеете в виду, что я отправляю целых 372 байта в ответ apdu, следуя приведенному ниже коду: apdu.setOutgoingLength((short)372); apdu.sendBytesLong (данные, (короткое) 0, (короткое) 372); но я пробовал это раньше, и это не сработало, и я отправил слово состояния 6F00. - person Mohsen Gorgani; 24.10.2013