Команда APDU ISO 7816-4 Выбрать файл и записать запись
Я пытаюсь установить связь между PN532 и HCE на Android с помощью команды ISO 7816-4, я успешно выбираю AID (DF), но когда я выбираю EF под этим DF (этот EF не существует, поэтому я предполагаю, что Select Команда создаст этот EF), а затем запишет записи в этот EF, но он будет отображаться так:
inList passive target
write: 4A 1 0
read: 4B 1 1 0 4 60 4 8 23 5A 4D 5 75 80 70 2
write: 40 1 0 A4 4 0 7 F0 1 2 3 4 5 6 0
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21
Successfully hehe
48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 Hello Desktop!
write: 40 1 0 A4 2 C 1 1 0
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21
Not enough space
write: 40 1 0 D2 0 0 7 42 41 4F 47 49 41 40 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30
Not enough space
write: 40 1 0 D2 0 2 4 44 4F 41 4E 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 31
Not enough space
write: 40 1 0 B2 0 0 7 42 41 4F 47 49
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 32
Not enough space
write: 40 1 0 B2 0 2 4 44 4F 41 4E 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 33
Not enough space
Я не знаю, что я делаю не так здесь?
На Android лог выглядит так:
04-15 09:36:54.024: D/HostEmulationManager(929): notifyHostEmulationData
04-15 09:36:54.024: W/System.err(17710): [B@41ed5970
04-15 09:36:54.024: I/HCEDEMO(17710): Received: ???????BAOGI
04-15 09:36:54.024: D/HostEmulationManager(929): Sending data
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x17
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=10
04-15 09:36:54.164: D/HostEmulationManager(929): notifyHostEmulationData
04-15 09:36:54.164: W/System.err(17710): [B@41ed5e20
04-15 09:36:54.164: I/HCEDEMO(17710): Received: ?????DOAN??
04-15 09:36:54.174: D/HostEmulationManager(929): Sending data
04-15 09:36:54.885: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x19
04-15 09:36:54.885: D/HostEmulationManager(929): notifyHostEmulationDeactivated
04-15 09:36:54.885: I/HCEDEMO(17710): Deactivated: 0
04-15 09:36:54.885: D/HostEmulationManager(929): Unbinding from service ComponentInfo{de.grundid.hcedemo/de.grundid.hcedemo.MyHostApduService}
04-15 09:36:54.895: E/BrcmNfcNfa(929): UICC[0x0] is not activated
Он показывает, что может принимать некоторые данные, но пропускает некоторые элементы, которые я хочу передать, но из PN532, когда я использую прочитанные записи, он не отображает эти данные?
1 ответ
Команды, которые ваше приложение эмуляции смарт-карты Android HCE понимает и обрабатывает, полностью зависят от вас (при условии, что они отформатированы как действительные APDU ISO 7816-4).
В вашем случае, ваш сервис Android HCE, очевидно, обрабатывает APDU SELECT (по имени DF),
00 A4 04 00 07 F0010203040506 00
и дает это как ответ:
48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII)
(Обратите внимание, что этот ответ не является действительным APDU ответа в соответствии с ISO 7816-4, поскольку в нем отсутствует слово состояния.)
Следующая отправленная вами команда - недопустимая команда SELECT (EF):
00 A4 02 0C 01 01 00
Для этой команды Lc должно быть 2, а идентификатор EF должен состоять из двух байтов, если следует ISO 7816-4. В ответ на это ваш сервис Android HCE снова отправляет
48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII)
(Обратите внимание, что этот ответ не является действительным APDU ответа в соответствии с ISO 7816-4, поскольку в нем отсутствует слово состояния.)
Так что я думаю, что ваш сервис Android HCE выполняет такую проверку:
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
if (apdu[1] == (byte)0xA4) {
return "Hello Desktop!".getBytes("US-ASCII");
}
}
Следующая отправляемая вами команда - это неверно сформированная команда WRITE RECORD, которая пытается записать "BAOGIA@" в первую запись выбранного в данный момент файла (неправильно сформированная, поскольку команда WRITE RECORD обычно не имеет поля Le):
00 D2 00 00 07 42 41 4F 47 49 41 40 00
В ответ ваш сервис Android HCE отправляет:
4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30 ("Message from android: 0" when interpreted as ASCII)
(Обратите внимание, что этот ответ снова не является действительным APDU ответа в соответствии с ISO 7816-4, поскольку в нем отсутствует слово состояния.)
Затем вы повторяете команду WRITE RECORD с другой полезной нагрузкой записи, после чего отправляете две некорректные команды READ RECORD:
00 D2 00 02 04 44 4F 41 4E 00
00 B2 00 00 07 42 41 4F 47 49
00 B2 00 02 04 44 4F 41 4E 00
В ответ ваш сервис Android HCE отправляет:
4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 xx ("Message from android: X" when interpreted as ASCII)
Где xx - это цифра ASCII X, которая увеличивается для каждой полученной команды.
Так что я думаю, что ваш сервис Android HCE выглядит так:
private int mCommandCounter = 0;
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
String response;
if (apdu[1] == (byte)0xA4) {
response = "Hello Desktop!";
} else {
response = "Message from android: " + Integer.toString(mCommandCounter);
++mCommandCounter;
}
return response.getBytes("US-ASCII");
}
Итак, подведя итог, ваша служба Android HCE будет понимать и обрабатывать только те команды, которые вы (или тот, кто разрабатывает), реализуют. Так что вам решать, какие команды вы можете отправить на устройство HCE. За этим нет файловой системы. ISO 7816-4 предлагает только схему файловой системы для приложений смарт-карт.