Как определить APDU для STORE DATA для эмуляции хост-карты? - PullRequest
0 голосов
/ 05 июля 2018

Я искал в спецификации глобальной платформы, как определить APDU для моего приложения, которое будет использовать эмуляцию хост-карты (HCE). Предполагается, что в моем приложении один телефон ведет себя как тег NFC через HCE, а другой - в качестве считывателя NFC. Произвольные данные, которые я пытаюсь передать между телефонами, представляют собой простую строку, содержащую идентификационный номер, но я не совсем уверен, как применить его в коде. Я посмотрел, что означают различные байтовые команды, но я действительно не уверен, как их применять.

Я думаю, что мне нужно использовать команду STORE DATA, но я не уверен, как это сделать интуитивно, и не совсем понимаю. Сейчас я смотрю на HCE, а не на читателя.

Это мой код для HCE

public class SecondaryActivity extends HostApduService {

@Override
public void onDeactivated(int reason) {

}

@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    String inboundApduDescription;
    byte[] responseApdu;

    if (Arrays.equals(AID_SELECT_APDU, commandApdu)) {
        inboundApduDescription = "Application selected";
        Log.i("HCEDEMO", inboundApduDescription);
        byte[] answer = new byte[2];
        answer[0] = (byte) 0x90;
        answer[1] = (byte) 0x00;
        responseApdu = answer;
        return responseApdu;

    }
    return commandApdu;
}

private static final byte[] AID_SELECT_APDU = {
        (byte) 0x00,
        (byte) 0xA4,
        (byte) 0x04,
        (byte) 0x00,
        (byte) 0x07,
        (byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
        (byte) 0x00
};

private static final byte[] STORE_DATA = {
        (byte) 0x00,
        (byte) 0xA4,
        (byte) 0x04,
        (byte) 0xA5, // forproprietary data according to the spec
        (byte) 0xE2,
        (byte) 0x66, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
        (byte) 0x00
};

private static final byte[] INSTALL = {
        (byte) 0x00,
        (byte) 0x00,
};

}

Как отправить данные с телефона HCE на телефон считывателя? Чего мне не хватает? Что нужно сделать?

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете определить практически любую команду APDU для HCE. Требуется только начальная команда SELECT (по AID). После этого вы можете создать свой собственный набор команд (или попытаться следовать командам ISO / IEC 7816-4), если вы подчиняетесь правилам ISO / IEC 7816 для структуры APDU команды / ответа и придерживаетесь действительных CLA, INS, и значения слова состояния.

Поскольку вы хотите передать только идентификатор, вы можете отправить этот идентификатор непосредственно в ответ на команду SELECT:

private static final String ID = "1234567890"

@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    byte[] responseApdu = new byte[] { (byte)0x6F, (byte)0x00 };

    if ((commandApdu != null) && (commandApdu.length >= 4)) {
        if ((commandApdu[0] == (byte)0x00) && (commandApdu[1] == (byte)0xA4) && (commandApdu[2] == (byte)0x04) && (commandApdu[3] == (byte)0x00)) {
            Log.i("HCEDEMO", "Application selected");

            byte[] id = ID.getBytes(Charset.forName("UTF-8"));
            responseApdu = new byte[id.length + 2];
            System.arraycopy(id, 0, responseApdu, 0, id.length);
            responseApdu[id.length] = (byte)0x90;
            responseApdu[id.length + 1] = (byte)0x00;
        }
    }
    return responseApdu;
}
...