Javacard, как удалить и заново вставить карту без исключения исключения из checkState () в CardImpl.class - PullRequest
0 голосов
/ 02 мая 2018

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

Примечания о моем коде: ControlledDialog, как следует из названия, является программно контролируемым диалогом, поэтому я могу открывать и закрывать его в определенных частях кода.

Спасибо за любую помощь!

Класс My CardConnection:

package util;

import UI.MainPanel;
import UI.VerifyPanel;
import java.security.Security;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.smartcardio.CardException;
import javax.smartcardio.CardNotPresentException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
import net.sf.scuba.smartcards.CardServiceException;
import net.sf.scuba.smartcards.TerminalCardService;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jmrtd.PassportService;

public class CardConnection {

    static CardTerminal reader;
    static PassportService service;

    public static PassportService connectPassportService() throws CardException, CardServiceException {

        //Encontra-se a factory
        TerminalFactory terminal = TerminalFactory.getDefault();

        //listam-se os terminais
        List<CardTerminal> readers = terminal.terminals().list();

        if (readers.isEmpty()) {
            System.out.println("No Readers Found");
            System.exit(-1);
        }

        //escolhe-se o primeiro
        reader = readers.get(0);

        if (GlobalFlags.DEBUG) {
            System.err.println("Reader: " + reader);

            System.err.println("Por favor insira um cartão");
        }

        for (int i = 0; i < 10 && !reader.isCardPresent(); i++) {
            ControlledDialog.showMessageDialog("Por favor insira um cartão " + i, "Início");
            reader.waitForCardPresent(1000);
            System.err.println("Cartão " + (reader.isCardPresent() ? "" : "não ") + "conectado " + i);
        }
        try {
            if (reader.isCardPresent()) {

                service = new PassportService(new TerminalCardService(reader));
                service.open();
                service.sendSelectApplet(false);
                BouncyCastleProvider provider = new BouncyCastleProvider();
                Security.addProvider(provider);

            } else {
                throw new CardNotPresentException("Cartão não encontrado");
            }
        } finally {
            ControlledDialog.closeMessageDialog();
        }
        return service;
    }

    public static void closeConnection() {

        if (service == null) {
            return;
        }
        service.close();

        try {

            if (reader.isCardPresent()) {
                if (GlobalFlags.DEBUG) {
                    System.err.println("Por favor retire o cartão");
                }
                ControlledDialog.showMessageDialog("Por favor retire o cartão", "Fim");
            }

            while (reader.isCardPresent()) {
                System.out.println("Remova o cartão atual");
                reader.waitForCardAbsent(100000);
            }

            ControlledDialog.closeMessageDialog();

        } catch (CardException ex) {
            Logger.getLogger(VerifyPanel.class.getName()).log(Level.SEVERE, null, ex);
        }

        reader = null;
        service = null;

    }

}

1 Ответ

0 голосов
/ 04 мая 2018

Я действительно не знаю, как удалить вопрос, потому что здесь недостаточно информации о том, что происходило. После тщательной отладки, напечатав хеш-код объекта, вызывающего каждую функцию, я обнаружил, что причиной этой проблемы был тот факт, что я не обновил поле «service» объекта, вызывающего эти функции, и, следовательно, используя службу с отключенная карта вместо вновь созданной. Спасибо за понимание!

...