Android Служба HCE не получает команду APDU - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать службу HCE Android, но сталкиваюсь с трудностями при маршрутизации команд APDU на эту службу.

У меня есть 3 бита оборудования:

  1. Nokia 7 Plus работает Android 9
  2. Старый Motorola Nexus работает Android 7.1.1
  3. Устройство HID Omnikey 5127CK для чтения карт

Я создал оба Android кард-ридер и служба эмуляции смарт-карт согласно многочисленным учебникам, таким как this .

Я создал приложение C# с использованием шт. c -sharp , который взаимодействует с (3) и передает команду APDU.

Когда я использую:

  • (1) в качестве смарт-карты, (2) как считыватель - все работает, команда выбора APDU направляется в мою службу HCE
  • (2) в качестве смарт-карты, (3) в качестве считывателя - как указано выше, все работает
  • ( 1) как смарт-карта, (3) как считыватель - мой сервис HCE ничего не получает, но считыватель получает ответ от устройства, 0x6 f00. Это проблема.

Служба HCE не должна быть проблемой, поскольку она работает, когда (2) является картой. Но для всех намерений и целей код можно считать таким же, как в: https://github.com/mohamdaoui/HostCardEmulator

C# фрагмент кода:

using (var rfidReader = context.ConnectReader(readerName, SCardShareMode.Shared, SCardProtocol.Any))
{
    var apdu = new CommandApdu(IsoCase.Case3Short, rfidReader.Protocol)
    {
        CLA = 0x00,
        Instruction = InstructionCode.SelectFile,
        P1 = 0x04,
        P2 = 0x00,
        Data = new byte[] { 0xF0, 0x01, 0x02, 0x03, 0x04, 0x05 }
    };

    using (rfidReader.Transaction(SCardReaderDisposition.Leave))
    {
        var sendPci = SCardPCI.GetPci(rfidReader.Protocol);
        var receivePci = new SCardPCI(); // IO returned protocol control information.

        var receiveBuffer = new byte[256];
        var command = apdu.ToArray();

        var bytesReceived = rfidReader.Transmit(
            sendPci, // Protocol Control Information (T0, T1 or Raw)
            command, // command APDU
            command.Length,
            receivePci, // returning Protocol Control Information
            receiveBuffer,
            receiveBuffer.Length); // data buffer

        var responseApdu = new ResponseApdu(receiveBuffer, bytesReceived, IsoCase.Case1, rfidReader.Protocol);
        Console.WriteLine("SW1: {0:X2}, SW2: {1:X2}\n", responseApdu.SW1, responseApdu.SW2);
    }
}

При запуске с помощью (1) считыватель получает ответ 0x6F00 от устройства, но сообщение не достигает HCE. С помощью (2) команда направляется на мой HCE, и я возвращаю 0x9000.

Фильтр ACE HCE, apduservice. xml:

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

Журнал cat of of (1) когда команда отправляется:

2020-02-04 09:39:01.144 794-4075/? D/NxpTml: PN54X - I2C Read successful.....len = 4
2020-02-04 09:39:01.144 794-4075/? D/NxpTml: PN54X - Posting read message.....
2020-02-04 09:39:01.144 794-4075/? D/NxpNciR: len =   4 <= 600701A1
2020-02-04 09:39:01.144 794-4078/? D/NxpHal: read successful status = 0x0
2020-02-04 09:39:01.146 3529-3990/? I/BrcmNfcNfa: NFC received ntf gid:0
2020-02-04 09:39:01.146 3529-3990/? I/BrcmNfcNfa: nci_proc_core_ntf opcode:0x7
2020-02-04 09:39:01.146 3529-3990/? I/BrcmNfcNfa: nfa_dm_nfc_response_cback () NFC_GEN_ERROR_REVT(0x500d)
2020-02-04 09:39:01.147 794-4075/? D/NxpTml: PN54X - Read requested.....
2020-02-04 09:39:01.147 794-4075/? D/NxpTml: PN54X - Invoking I2C Read.....
2020-02-04 09:39:01.400 794-4075/? D/NxpTml: PN54X - I2C Read successful.....len = 4
2020-02-04 09:39:01.400 794-4075/? D/NxpTml: PN54X - Posting read message.....
2020-02-04 09:39:01.400 794-4075/? D/NxpNciR: len =   4 <= 600701A1
2020-02-04 09:39:01.400 794-4078/? D/NxpHal: read successful status = 0x0
2020-02-04 09:39:01.401 3529-3990/? I/BrcmNfcNfa: NFC received ntf gid:0
2020-02-04 09:39:01.401 3529-3990/? I/BrcmNfcNfa: nci_proc_core_ntf opcode:0x7
2020-02-04 09:39:01.401 3529-3990/? I/BrcmNfcNfa: nfa_dm_nfc_response_cback () NFC_GEN_ERROR_REVT(0x500d)
2020-02-04 09:39:01.401 794-4075/? D/NxpTml: PN54X - Read requested.....
2020-02-04 09:39:01.401 794-4075/? D/NxpTml: PN54X - Invoking I2C Read.....
2020-02-04 09:39:01.430 794-4075/? D/NxpTml: PN54X - I2C Read successful.....len = 4
2020-02-04 09:39:01.430 794-4075/? D/NxpTml: PN54X - Posting read message.....
2020-02-04 09:39:01.430 794-4075/? D/NxpNciR: len =   4 <= 600701A1
2020-02-04 09:39:01.430 794-4078/? D/NxpHal: read successful status = 0x0
2020-02-04 09:39:01.431 3529-3990/? I/BrcmNfcNfa: NFC received ntf gid:0
2020-02-04 09:39:01.431 3529-3990/? I/BrcmNfcNfa: nci_proc_core_ntf opcode:0x7
2020-02-04 09:39:01.431 3529-3990/? I/BrcmNfcNfa: nfa_dm_nfc_response_cback () NFC_GEN_ERROR_REVT(0x500d)
2020-02-04 09:39:01.431 794-4075/? D/NxpTml: PN54X - Read requested.....
2020-02-04 09:39:01.431 794-4075/? D/NxpTml: PN54X - Invoking I2C Read.....
2020-02-04 09:39:02.575 794-4075/? D/NxpTml: PN54X - I2C Read successful.....len = 4
2020-02-04 09:39:02.575 794-4075/? D/NxpTml: PN54X - Posting read message.....
2020-02-04 09:39:02.575 794-4075/? D/NxpNciR: len =   4 <= 600701A1
2020-02-04 09:39:02.575 794-4078/? D/NxpHal: read successful status = 0x0
2020-02-04 09:39:02.577 3529-3990/? I/BrcmNfcNfa: NFC received ntf gid:0
2020-02-04 09:39:02.577 3529-3990/? I/BrcmNfcNfa: nci_proc_core_ntf opcode:0x7
2020-02-04 09:39:02.577 3529-3990/? I/BrcmNfcNfa: nfa_dm_nfc_response_cback () NFC_GEN_ERROR_REVT(0x500d)
2020-02-04 09:39:02.581 794-4075/? D/NxpTml: PN54X - Read requested.....
2020-02-04 09:39:02.581 794-4075/? D/NxpTml: PN54X - Invoking I2C Read.....
2020-02-04 09:39:03.310 794-4075/? D/NxpTml: PN54X - I2C Read successful.....len = 4
2020-02-04 09:39:03.310 794-4075/? D/NxpTml: PN54X - Posting read message.....
2020-02-04 09:39:03.310 794-4075/? D/NxpNciR: len =   4 <= 61070100
2020-02-04 09:39:03.310 794-4078/? D/NxpHal: read successful status = 0x0
2020-02-04 09:39:03.311 3529-3990/? I/BrcmNfcNfa: NFC received ntf gid:1
2020-02-04 09:39:03.311 3529-3990/? I/BrcmNfcNfa: nfc_ncif_proc_rf_field_ntf
2020-02-04 09:39:03.311 3529-3990/? I/BrcmNfcNfa: nfa_dm_nfc_response_cback () NFC_RF_FIELD_REVT(0x5007)
2020-02-04 09:39:03.311 3529-3990/? D/BrcmNfcJni: nfaDeviceManagementCallback: enter; event=0x5
2020-02-04 09:39:03.311 3529-3990/? D/BrcmNfcJni: checkforTranscation: enter; event=0x3 transaction_data.current_transcation_state = 0x0
2020-02-04 09:39:03.311 3529-3990/? D/BrcmNfcJni: checkforTranscation: exit; event=0x3 transaction_data.current_transcation_state = 0x0
2020-02-04 09:39:03.311 3529-3990/? D/BrcmNfcJni: nfaDeviceManagementCallback: NFA_DM_RF_FIELD_EVT; status=0x0; field status=0
2020-02-04 09:39:03.311 3529-3990/? D/BrcmNfcJni: SecureElement::notifyRfFieldEvent: enter; is active=0
2020-02-04 09:39:03.313 3529-3990/? D/BrcmNfcJni: setCLState: Entry setCLState 
2020-02-04 09:39:03.313 3529-3990/? D/BrcmNfcJni: setCLState: Exit setCLState = 0
2020-02-04 09:39:03.313 3529-3990/? D/BrcmNfcJni: SecureElement::notifyRfFieldEvent: exit
2020-02-04 09:39:03.313 3529-3529/? D/NfcService: SE FIELD DEACTIVATED
2020-02-04 09:39:03.313 3529-3990/? D/BrcmNfcJni: transactionEnd: Transaction ended : RF_FIELD_EVT 
2020-02-04 09:39:03.314 794-4075/? D/NxpTml: PN54X - Read requested.....
2020-02-04 09:39:03.314 794-4075/? D/NxpTml: PN54X - Invoking I2C Read.....
2020-02-04 09:39:03.315 3529-3529/? D/NfcService: NFCINTENT sendNfcEeAccessProtectedBroadcast
2020-02-04 09:39:03.318 3529-3529/? D/NfcService: SE FIELD DEACTIVATED
2020-02-04 09:39:03.319 3529-24247/? D/BrcmNfcJni: Inside transactionAbortTimerCb
2020-02-04 09:39:03.319 3529-24247/? D/BrcmNfcJni: lastRequestResume
2020-02-04 09:39:03.320 3529-24248/? D/BrcmNfcJni: enableThread: enter
2020-02-04 09:39:03.320 3529-24248/? D/BrcmNfcJni: get_lastScreenStateRequest: 0
2020-02-04 09:39:03.320 3529-3529/? D/NfcService: NFCINTENT sendNfcEeAccessProtectedBroadcast
2020-02-04 09:39:03.320 3529-24248/? D/BrcmNfcJni: transactionTerminate: Enter. Requested by : exec_pending_req 
2020-02-04 09:39:03.321 3529-24248/? D/BrcmNfcJni: transactionTerminate: Transaction terminated : exec_pending_req 
2020-02-04 09:39:03.321 3529-24248/? D/BrcmNfcJni: No request pending
2020-02-04 09:39:03.321 3529-24248/? D/BrcmNfcJni: enableThread: exit

Есть идеи? Он направляется в SE или что-то для обработки?

...