Эмулированная карта HCE будет понимать именно те команды, которые обрабатывает служба APDU вашего приложения HCE. Так, например, если метод обратного вызова processCommandApdu()
службы HCE выглядит следующим образом:
final static byte[] SW_NO_ERROR = new byte[]{ (byte)0x90, (byte)0x00 };
final static byte[] SW_INCORRECT_P1P2 = new byte[]{ (byte)0x6A, (byte)0x86 };
final static byte[] SW_INS_NOT_SUPPORTED = new byte[]{ (byte)0x6D, (byte)0x00 };
final static byte[] SW_ERR_UNKNOWN = new byte[]{ (byte)0x6F, (byte)0x00 };
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
if (apdu.length >= 4) {
if ((apdu[1] == (byte)0xA4) && (apdu[2] == (byte)0x04)) {
// SELECT APPLICATION
return SW_NO_ERROR;
} else if ((apdu[1] == (byte)0xCA) && (apdu[2] == (byte)0x02)) {
// GET DATA (SIMPLE TLV)
switch (apdu[3] & 0x0FF) {
case 0x001:
return new byte[]{ apdu[3], (byte)0x02, (byte)0x01, (byte)0x00, (byte)0x90, (byte)0x00 };
case 0x002:
return new byte[]{ apdu[3], (byte)0x02, (byte)0x12, (byte)0x34, (byte)0x90, (byte)0x00 };
case 0x003:
return new byte[]{ apdu[3], (byte)0x06, (byte)0xAA, (byte)0xBB, (byte)0xCC, (byte)0xDD, (byte)0xEE, (byte)0xFF, (byte)0x90, (byte)0x00 };
default:
return SW_INCORRECT_P1P2;
}
} else {
return SW_INS_NOT_SUPPORTED;
}
}
return SW_ERR_UNKNOWN;
}
Ваше приложение HCE будет понимать следующие командные APDU:
ВЫБЕРИТЕ ПРИЛОЖЕНИЕ (по AID)
00 A4 04 xx ...
ПОЛУЧИТЬ ДАННЫЕ для объекта данных 0201
00 CA 02 01 00
ПОЛУЧИТЬ ДАННЫЕ для объекта данных 0202
00 CA 02 02 00
ПОЛУЧИТЬ ДАННЫЕ для объекта данных 0203
00 CA 02 03 00
Другие команды приведут к различным ошибкам.
person
Michael Roland
schedule
20.05.2014