Android HCE: существуют ли правила для AID?

Я пытаюсь использовать считыватель NFC ACR122 для выбора приложения, эмулируемого в одном Nexus 5, с использованием эмуляции хоста Android Host. Однако небольшие AID не распознаются.

Моя цель – использовать трехбайтную AID, как и на карте DESfire. Моя первая цель – только выполнить команду SELECT.

Мое тестовое приложение использует следующую конфигурацию для AID:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/service_descr" android:requireDeviceUnlock="false" > <aid-group android:category="other" android:description="@string/aid_descr" > <aid-filter android:name="A0A1A2" /> <aid-filter android:name="B0B1B2B3" /> <aid-filter android:name="C0C1C2C3C4" /> <aid-filter android:name="D0D1D2D3D4D5" /> <aid-filter android:name="E0E1E2E3E4E5E6" /> </aid-group> </host-apdu-service> 

Если я запустил следующие APDU:

 00 a4 04 00 03 a0 a1 a2 00 00 a4 04 00 04 b0 b1 b2 b3 00 00 a4 04 00 05 c0 c1 c2 c3 c4 00 00 a4 04 00 06 d0 d1 d2 d3 d4 d5 00 00 a4 04 00 07 e0 e1 e2 e3 e4 e5 e6 00 

Я всегда получаю следующие ответы:

 => 00 a4 04 00 03 a0 a1 a2 00 <= 6f 00 => 00 a4 04 00 04 b0 b1 b2 b3 00 <= 6a 82 => 00 a4 04 00 05 c0 c1 c2 c3 c4 00 <= 90 00 => 00 a4 04 00 06 d0 d1 d2 d3 d4 d5 00 <= 90 00 => 00 a4 04 00 07 e0 e1 e2 e3 e4 e5 e6 00 <= 90 00 

Итак, с Android будут работать только AID длиной более 5 байт? Или я делаю что-то действительно не так?

Правила для идентификаторов приложений смарт-карт (AID) определены в ISO / IEC 7816-4. AID может состоять из 16 байт. Основываясь на первых 4 битах, AID подразделяются на разные группы. Наиболее релевантными группами, определенными в ИСО / МЭК 7816-4, являются:

  • AID, начинающиеся с 'A' : зарегистрированные на международном уровне AIDs
  • AID, начинающиеся с 'D' : зарегистрированные на национальном уровне AIDs
  • AIDs, начинающиеся с 'F' : патентованные AID (без регистрации)

Для (inter) национально зарегистрированных AID AID разделяется на две части, 5-байтовый обязательный RID (зарегистрированный идентификатор поставщика приложений) и необязательный PIX (расширение идентификатора проприетарного приложения) длиной до 11 байтов.

Для проприетарных AID ( F... ) ISO / IEC 7816-4 четко не требует каких-либо требований минимальной длины.

В дополнение к этому, когда дело доходит до HCE и маршрутизации связи эмуляции карты с контроллера NFC для защиты элементов или процессора приложений, существует спецификация NIC Forum NCI. В этой спецификации AID (используется в записях маршрутизации на основе AID) составляет от 5 до 16 байт. Btw. Такое же ограничение распространяется на смарт-карты, следуя спецификациям Java Card.

Когда дело доходит до Android, существует жестко запрограммированное требование о том, что AID, полученные в команде SELECT, состоят не менее чем из 5 байтов:

  • В методе resolveAid() в RegisteredAidCache.java в строке 142
  • В методе findSelectAid() в HostEmulationManager.java на строке 390 (что фактически приводит к нечетному поведению, что 4-байтная AID отклоняется с статусом состояния «Файл или приложение не найден» ( 6A82 ), так как проверка неправильно учитывает Le байт)

Согласно стандартам EMV, AID состоит из идентификатора зарегистрированного поставщика приложений (RID), имеющего минимум 5 байтов, а также дополнительного расширения идентификатора приложения (PIX) или запатентованного идентификатора приложения, имеющего максимальную длину 11 байтов, которые вместе образуют Идентификатор приложения (AID), поэтому идентификатор приложения никогда не может быть меньше 5 байтов. Если на карте присутствует несколько приложений, в AID будут добавлены дополнительные идентификаторы приложений, добавленные к RID, чтобы различать приложения, присутствующие на карте. Пожалуйста, ознакомьтесь с стандартами EMV на своем сайте: EMVCO и особенно их книги, Книга 1 к книге 4, чтобы понять больше в этом.