Чтение большого файла из апплета javacard

Пишу апплет, который хранит 3 файла разного размера 5 Кб, 7 Кб и 11 Кб. У меня нет проблем с хранением файлов внутри апплета. Но когда я пытаюсь прочитать их обратно, я могу прочитать только первые два (файлы меньшего размера). Третий файл выдает исключение:

javax.smartcardio.CardException: Could not obtain response
at sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source)
at sun.security.smartcardio.ChannelImpl.transmit(Unknown Source)

Я попытался выяснить проблему, и я узнал, что это связано с размером файла. Поэтому я создал тестовый файл размером 7 Кб и постепенно увеличивал этот файл. Это работало, пока я не достиг 7905 байт. Это означает, что 7905 байт — это максимальное количество байтов, которое я могу прочитать из апплета. Я связываю ответ, используя пример кода:

public void readFile(APDU apdu, short[] offset, short selectedFile, short MAX_APDU_SEN,       byte OFFSET_SENT) {
    byte[] file = getFile(selectedFile); 
    if (file == null) {
    + ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);+
    }
    // work out how many bytes to send this time and how many will be left
    short remain = (short) (file.length - offset[OFFSET_SENT]);
    boolean chain = remain > MAX_APDU_SEN;
    short sendLen = chain ? MAX_APDU_SEN : remain;
    apdu.setOutgoing();
    apdu.setOutgoingLength(sendLen);
    apdu.sendBytesLong(file, offset[OFFSET_SENT], sendLen);
    // Check to see if there are more APDU's to send
    if (chain) {
    +offset[OFFSET_SENT] = sendLen; // count the bytes sent
    ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); // indicate there are more bytes     to come
    } else {+
    offset[OFFSET_SENT] = 0; // no more bytes to send
    }
}

Я пробовал карты двух разных типов, то есть карты, совместимые с JC 2.2.1 (36 КБ) и JC 2.2.2 (80 КБ), но все они ведут себя одинаково.

Любая помощь, пожалуйста?


person ally    schedule 26.03.2013    source источник


Ответы (1)


Чтение файла обычно не выполняется с помощью цепочки, поскольку хост-приложение может удобно указать начальное смещение в P1/P2 — по крайней мере, в команде READ BINARY, как указано в ISO 7816-4. Я предполагаю, что даже для связанного ответа карта хочет подготовить данные в буфере, ограниченный размер которого, как я полагаю, является причиной вашей проблемы.

person guidot    schedule 27.03.2013
comment
Спасибо, гидо. Я убрал цепочку и заставил свое хост-приложение считывать небольшие куски по 256 байт, и каждый раз увеличивать смещение на 256. Работает нормально. Я даже пытался читать файл размером 20 Кб, и результаты были положительными. Поэтому я предполагаю, что цепочка не может выдержать очень большие файлы. Я могу ошибаться в любом случае. - person ally; 28.03.2013
comment
Вы все еще можете попробовать APDU увеличенной длины, чтобы получить более крупные фрагменты, но поддерживаемый предел зависит от карты. Меньшее количество отправляемых команд означает меньшие накладные расходы, поэтому вы можете сэкономить некоторое время, что может быть заметно для файла размером 20 кбайт. - person guidot; 28.03.2013
comment
@ally, можете ли вы поделиться со мной кодом? Я новичок в Java-карте, и у меня такая же проблема с сохранением файла большего размера. - person Suraj; 23.07.2014