Как получить помощь для эмуляции карты на основе Хоста reader

Я пытаюсь сделать эмуляция хост-карты на устройстве Android с помощью этого пример используя ACR1281U читатель бирки NFC.

этой вид приложения, которое я хочу сделать.

в соответствии с документацией Android и примером, требуется зарегистрировать помощь в проекте Android:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

откуда я знаю какую помощь мне нужно зарегистрировать в моем приложении для Android так что читатель может прочитать приложение HCE Android?

вот еще один вопрос, который я опубликовал относительно того же:не поддерживается терминал карты не найден ARC1281U NFC Card reader

Я сослался на следующие ссылки, но не было большой помощи:

пожалуйста, помогите, так как на HCE очень мало ресурсов!

редактировать

в примере используется AID F0010203040506 в команде SELECT (by AID), но мой читатель ACR128 не смог прочитать устройство HCE.

private static final byte[] CLA_INS_P1_P2 = { 0x00, (byte)0xA4, 0x04, 0x00 };
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };

private byte[] createSelectAidApdu(byte[] aid) {
    byte[] result = new byte[6 + aid.length];
    System.arraycopy(CLA_INS_P1_P2, 0, result, 0, CLA_INS_P1_P2.length);
    result[4] = (byte)aid.length;
    System.arraycopy(aid, 0, result, 5, aid.length);
    result[result.length - 1] = 0;
    return result;
}

затем я изменил помощь на F00000000A0101 (который использовался Другим примером приложения) и использовал это в фильтре помощи также. После изменения этой помощи считыватель ACR смог обнаружить устройство HCE.

  • как СПИД (в пример это не сработало, а другое, которое использовалось в app который работал) соответствует спецификации, как я знаю, какую помощь использовать?
  • пример добавляет несколько вспомогательных средств в фильтр помощи, но отправляет только один из них в SELECT (by AID) APDU. Должен ли я также добавить множественные СПИД в фильтре помощи? В чем его польза?

1 ответов


помощь - это "имя", которое вы назначаете приложению смарт-карты (в случае HCE: приложение Android, которое эмулирует приложение Карты). Приложение для чтения использует это " имя " для обращения к приложению карты (HCE) с помощью команды SELECT (by DF name/AID) APDU (см. ISO/IEC 7816-4). Вы можете использовать любое значение, если оно соответствует ISO / IEC 7816-4.

в вашем конкретном случае пример приложения для чтения использует помощь F0010203040506

private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };

поэтому, чтобы быть совместимым с этим примером, вам нужно зарегистрировать свой сервис HCE для помощи F0010203040506.

как вы назначаете и используете помощь?

обычно вы сначала определяете " имя " для своего приложения HCE:

<host-apdu-service ...>
    <aid-group ...>
        <aid-filter android:name="F0010203040506"/>
    </aid-group>
</host-apdu-service>

позже приложения для чтения могут использовать это имя, чтобы выбрать приложение HCE и затем общаться с ним (в Java, например, с помощью Java Smart Card IO):

Card card = ...;
CardChannel c = card.getBasicChannel();

// SELECT by AID (F0010203040506)
ResponseAPDU  resp = c.transmit(new CommandAPDU(
        0x00, 0xA4, 0x04, 0x00, new byte[] { (byte)0xF0, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06 }));
assert resp.getSW() == 0x9000;

// Send application-specific command (what such a command could look like depends on your application)
resp = c.transmit(new CommandAPDU(
        0x80, 0x10, 0x00, 0x00, new byte[] { (byte)0x12, (byte)0x34 }));

как вы придумали ценность помощи?

это зависит от сценария применения.

  • в вашем сценарии замкнутого цикла, где вы находитесь под полным контролем как стороны HCE, так и стороны читателя, вы можете выбрать произвольный (обратите внимание, что там есть некоторые правила для СПИДа) помощь и назначить его для вашего приложения HCE. Позже вы можете использовать эту помощь в приложении reader для обращения к приложению HCE.

  • в реальных сценариях HCE, вы часто создавайте приложение HCE для взаимодействия с существующей инфраструктурой чтения. Следовательно, ваше приложение HCE будет реализовывать некоторую заданную спецификацию. В этом случае такая спецификация будет диктовать помощь (или помощь), которую ваше приложение HCE должно использовать, чтобы быть обнаруженным существующей инфраструктурой чтения. Примером такой спецификации является спецификация EMV для бесконтактных платежных систем.

почему некоторые приложения HCE зарегистрированы для нескольких СПИД?

иногда возникает необходимость в том, что приложение адресуется через несколько "имен" (СПИД). Причины могут быть:

  • приложение предоставляет несколько различных интерфейсов (т. е., которые имеют другой набор команд или предоставляют разные данные).
  • существуют читатели, которые используют (по какой-то причине) различные средства для решения одной и той же проблемы.

как вы выбираете помощь?

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

  • СПИД, начиная с 'A': международно зарегистрированным СПИДа
  • СПИД, начиная с 'D': на национальном уровне зарегистрированы СПИД!--36-->
  • СПИД, начиная с 'F': проприетарные пособия (без регистрации)

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

для собственных СПИДа (F...), можно использовать любое произвольное значение.

почему помощь F00000000A0101 работа в то время как F0010203040506 не работа?

я не знаю, и вы не предоставили достаточной информации для диагностики этого. Е. Г. где есть какие-либо сообщения в АБР отчет, когда вы пытались выберите F0010203040506?

в любом случае, оба СПИДа действительны и должны работать. Одна из возможностей может заключаться в том, что на вашем устройстве уже установлено другое приложение HCE, зарегистрированное для этой помощи. В этом случае два приложения прослушивали бы одно и то же имя, что невозможно.