Java-карта отправляет команду APDU через сервер - PullRequest
0 голосов
/ 16 мая 2018

Я создал сервер для отправки команд APDU в приложение Java-карты.

Соединение успешно установлено. Единственная проблема, с которой я сталкиваюсь, заключается в том, что я успешно отправляю команду, но приложение Java Card не получает ее.

Следующий код представляет клиента, с которого я отправляю команды:

public class Client {

public static void main(String[] args) {
    Socket sock;
    try {

        sock = new Socket("localhost", 9025);

        InputStream is = sock.getInputStream();
        OutputStream os = sock.getOutputStream();
        CadClientInterface cad = CadDevice.getCadClientInstance(CadDevice.PROTOCOL_T0, is, os);
        Apdu apdu = new Apdu();
        System.out.println("Initialized apdu !");
        byte[] installer = new byte[]{0x00, (byte) 0xA4, 0x04, 0x00, 0x09, (byte) 0xA0, 0x00, 0x00, 0x00, 0x62, 0x03, 0x01, 0x08, 0x01, 0x7F};
        System.out.println("Prepare installer of cap !");
        apdu.setDataIn(installer, installer.length);
        System.out.println("Apdu set !");


        System.out.println("Apdu sent !");
        System.out.println(apdu);
        cad.powerUp();
        System.out.println("Powered up !");

        cad.exchangeApdu(apdu);

        cad.powerDown();
        System.out.println("Powered down !");
    } catch (IOException | CadTransportException e) {
        e.printStackTrace();
        System.out.println("Fail! " + e.getMessage());
    }

}

}

Апплет java-карты - это простой апплет, созданный в среде IDE.

public class Proj extends Applet {

/**
 * Installs this applet.
 * 
 * @param bArray
 *            the array containing installation parameters
 * @param bOffset
 *            the starting offset in bArray
 * @param bLength
 *            the length in bytes of the parameter data in bArray
 */
public static void install(byte[] bArray, short bOffset, byte bLength) {
    new Proj();
}

/**
 * Only this class's install method should create the applet object.
 */
protected Proj() {
    register();
}

/**
 * Processes an incoming APDU.
 * 
 * @see APDU
 * @param apdu
 *            the incoming APDU
 */
@Override
public void process(APDU apdu) {
    //Insert your code here
}

}

В java-карте я включаю устройство и порт устанавливается. Я не знаю, почему команда успешно отправлена, а сервер карт Java не получает ее.

Edit:

Я увидел проблему о том, почему javacard не получил никаких данных. Проблема в клиенте. Когда оператор cad.powerUp(); достигает целых клиентских блоков и больше ничего не выполняется, как в случае вызова функции sleep();. Итак, теперь действительно проблема в том, почему cad.powerUp () блокирует клиента.

1 Ответ

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

Я предполагаю, что вы вставили здесь полный код апплета. Метод Applet.register() не вызывается в апплете при установке. Таким образом, апплет никогда не регистрируется в JCRE, и поэтому APDU не может быть им принят.

Фактически, он не будет доступен для выбора, потому что JCRE не имеет никакой информации об этом.

измените код следующим образом и поделитесь результатом.

public static void install(byte[] bArray, short bOffset, byte bLength) {
    new Proj();
}

protected Proj(){
    register();
}

Также обязательно установите апплет.

...