Emulación de tarjeta basada en host con identificación de tarjeta fija

Android 4.4 introdujo Emulación de tarjeta basada en host (HCE). Como usted sabe, todas las tarjetas NFC vienen con una identificación de tarjeta fija ( NfcAdapter.EXTRA_ID ).

El acceso a la puerta de mi oficina generalmente detecta la identificación de la tarjeta NFC para la autorización. Después de actualizar mi teléfono a KitKat, traté de escanear mi teléfono con el lector de acceso. Pero siempre que la pantalla se apaga y enciende de nuevo, obtengo una identificación de tarjeta diferente.

Intenté mantener la pantalla del teléfono encendida y registrar la identificación de la tarjeta emulada en el sistema de acceso de la puerta. Logró otorgar el acceso para abrir la puerta. Pero esto no funcionará después de que la pantalla se apague y vuelva a encender.

Desde que KitKat introdujo el modo HCE, he estado tratando de emular mi tarjeta de acceso a la puerta usando mi teléfono.

¿Alguna idea para hacer que la identificación de la tarjeta emulada por teléfono sea corregida?

Esto es (al menos con la API oficial) imposible:

En la primera parte del intercambio, el dispositivo HCE presentará su UID; Se debe suponer que los dispositivos HCE tienen un UID aleatorio. Esto significa que en cada toque, el UID que se presenta al lector será un UID generado aleatoriamente. Debido a esto, los lectores NFC no deben depender del UID de los dispositivos HCE como una forma de autenticación o identificación.

( http://developer.android.com/guide/topics/connectivity/nfc/hce.html#ProtocolParams )

De acuerdo con uno de los desarrolladores de Google responsables de HCE:

Lo siento, me doy cuenta de que muchas personas querían esto, pero no es posible en la versión oficial. (Por supuesto, podrías hacerlo con algunos hacks AOSP). La razón es que HCE está diseñado en torno a la operación de fondo. Si permitimos que las aplicaciones configuren el UID, cada aplicación posiblemente quiera establecer su propio UID, y no hay forma de resolver el conflicto. Esperamos que con HCE, la infraestructura NFC se mueva a niveles más altos de la stack de protocolos para realizar la autenticación en lugar de confiar en el UID (que se clona fácilmente de todos modos).

Al menos, el controlador NFC de Broadcom (utilizado, por ejemplo, en el Nexus 5) admite el establecimiento de valores arbitrarios para el identificador anticolisión (UID), el ATQA y el byte SAK. Sin embargo, no hay API para cambiarlos, por lo que la única forma sería modificar la biblioteca libnfc-nci.

El código relevante para NFC-A está en el archivo nfa_dm_discover.c (comenzando en la línea 322):

 UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); UINT8_TO_STREAM (p, 0x04); UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); UINT8_TO_STREAM (p, platform); UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); UINT8_TO_STREAM (p, sens_info); 

Este código establece actualmente el ATQA (combinación de la plataforma de valores y 0x04) y el byte SAK (valor de sens_info).

Para cambiar el UID utilizado durante la anticolisión de NFC-A, puede agregar el parámetro de adición NFC_PMID_LA_NFCID1:

 UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); UINT8_TO_STREAM (p, 4); // length of NFCID1 in bytes UINT8_TO_STREAM (p, 0x12); UINT8_TO_STREAM (p, 0x34); UINT8_TO_STREAM (p, 0x56); UINT8_TO_STREAM (p, 0x78); 

Puede encontrar una versión más personalizable de libnfc-nci aquí (aún trabajo en progreso).