Понимание кода, лежащего в основе эмуляции хост-карты и APDU - PullRequest
0 голосов
/ 28 июня 2018

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

Я сделал несколько функциональных блоков, таких как ProcessCommandApdu и определил AID, но я не совсем понимаю, как это работает.

Пока это мой код ...

@ TargetApi (19) Открытый класс MainActivity расширяет 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
};

public static void main(String[] args) throws UnsupportedEncodingException {
    TerminalFactory terminalFactory = TerminalFactory.getDefault();
    try {
        for (CardTerminal terminal : terminalFactory.terminals().list()) {
            System.out.println(terminal.getName());
            try {
                Card card = terminal.connect("*");
                CardChannel channel = card.getBasicChannel();
                System.out.println("SelectAID ");
                CommandAPDU command = new CommandAPDU(SelectAID);
                ResponseAPDU response = channel.transmit(command);
                byte recv[] = response.getBytes();
                for (int i = 0; i < recv.length; i++) {
                    System.out.print(String.format("%02X", recv[i]));
                }
                System.out.println("");
            }
            catch (CardException e){}


        }
    }
    catch(CardException e){

    }
}

}

public class ReaderActivity {
public static byte[] SelectAID = new byte[]{(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
};

}

Что представляют собой байты, например, 0x00, 0xA4 и как я могу передать свою собственную информацию (идентификационный номер) через APDU?

Что еще мне нужно добавить?

Мой код основан на следующем уроке https://www.slideshare.net/ChienMingChou/hce-tutorialv-v1

1 Ответ

0 голосов
/ 29 июня 2018

APDU указаны в части 4 стандарта ISO 7816 - здесь вы найдете то, что представляет каждый байт (байт класса, код операции, байты параметров и т. Д.). 0xA4 например означает SELECT command.

Моя рекомендация - зайти на сайт GlobalPlatform и загрузить спецификацию карты - вам нужно зарегистрироваться, но это бесплатно. Глава 11 этой спецификации карты содержит много информации о кодировании APDU, наиболее интересных командах APDU и ответах на управление картами и т. Д. Это поможет вам начать работу и даст вам представление о том, какие команды APDU вы можете разработать для своего приложения.

...