Разрыв соединения JavaCard при длительных процессах - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу апплет JavaCard 2.2.1, который выполняет тяжелую математическую обработку входных данных и возвращает результат на компьютер.В моем коде много циклов for и while.Проблема в том, что когда я вызываю карту с ПК, соединение с картой не ждет, пока карта завершит весь процесс, и возвращается с ошибкой протокола PC / SC.Я использую PCSC библиотеку в C # для связи с картой с ПК и получаю эту ошибку: Обнаружена ошибка связи со смарт-картой.

Для воспроизведения проблемы я подготовилтестовый апплет с некоторыми фиктивными вычислениями:

package my.testapplet;

import javacard.framework.*;

public class TestApplet extends Applet
{

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    {
        new TestApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu)
    {
        if (selectingApplet())
        {
            return;
        }

        byte[] buf = apdu.getBuffer();
        short result = 0;
        if (buf[ISO7816.OFFSET_CLA] == ISO7816.CLA_ISO7816) {
            switch (buf[ISO7816.OFFSET_INS])
            {
            case (byte)0x00:
                {
                    short temp1 = 0;
                    short temp2, temp3 = 0;
                    while(temp1 < 30000) {
                        temp1++;
                        temp2 = 0;
                        while(temp2 < 30000) {
                            temp2++;
                            if(temp2 > 0) {
                                temp3 = (short)(temp1 * 2 + 1);
                            }
                        }
                    }
                    result = 100;
                }
                break;
            default:
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            }

            buf[0] = (byte) (result & 0xff);
            buf[1] = (byte) (result >>> 8);

            apdu.setOutgoingAndSend((short) 0, (short) 2);
        } else {
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

Я протестировал этот апплет на 3 разных моделях Java-карт (от разных поставщиков), все с одинаковым результатом.Также я должен отметить, что нет проблем при запуске кода в симуляторе java-карты.Проблема возникает на реальной физической карте Java.Кажется, что виртуальная машина на java-карте false обнаруживает некоторые циклы в выполняемом коде как бесконечный цикл и разрывает соединение.

Я понятия не имею по этой проблеме.У кого-нибудь похожий опыт с Java-картой?Любая идея о том, почему такое поведение происходит на Java-карте и как ее решить?Есть ли какая-либо специальная инструкция / конфигурация на java-карте, чтобы отключить это поведение и подождать, пока java-карта подготовит и вернет результат?

1 Ответ

0 голосов
/ 02 февраля 2019

WTX (увеличение времени ожидания) необходимо для информирования читателя о том, что ему придется ждать, так как ответа пока нет, в противном случае он действительно отключится.WTX не виден на уровне APDU, так как он работает на нижних уровнях T = 0, T = 1 и T = CL.Видно, что он играет роль, аналогичную сердцебиению TLS или другому сообщению, чтобы поддерживать живые транспортные уровни.Стандартное время ожидания может быть настроено через ATR, между прочим.

Более новые карты обычно могут автоматически обрабатывать WTX, даже если эта функциональность не требуется для реализации .На старых картах, как правило, расширения WTX включены только для определенных вызовов API, что может занять больше времени, чем завершено.Очевидно, что генерация пары ключей RSA здесь является основным нарушителем, но другие операции, такие как сборка мусора при запуске и установка апплетов, также могут использовать WTX.

Если у вас более длительный метод, вам, возможно, придется выполнитьWTX себя на регулярной основе.Вы хотите выпускать WTX в течение относительно небольших периодов, чтобы обеспечить более точный контроль - если вы можете правильно оценить время, которое требуется.Предпочтительно ваш протокол также состоит из мелкозернистых APDU, так что WTX используется как можно меньше.Как выяснил М. Махдипур, выпуск WTX может привести к тому, что считыватель карт будет ждать вечно, так что это не совсем без риска (см. Комментарии ниже вопроса).

В любом случае, метод создания JavaКарта отправляет низкоуровневое сообщение WTX статическим методом APDU.waitExtension () .

...