KitKat: Cómo enrutar las APDU a la tarjeta SIM

Quiero enrutar APDUs que obtengo de un lector NFC a la tarjeta SIM. De acuerdo con la documentación de HCE pensé que sería posible simplemente mediante la creación de un OffHostApduService con las entradas de encaminamiento de acuerdo (que hice).

Lamentablemente, la SIM no parece obtener ninguna APDU. SELECT-Comandos que funcionan cuando la tarjeta SIM está directamente conectada a mi estación de trabajo mediante un retorno de SIM-Reader con 6a82 (Archivo no encontrado).

En LogCat he encontrado dos interesantes bits de información:

Cada vez que disparo un comando de selección que debe ser encaminado a la tarjeta SIM, obtengo estas entradas:

01-14 10:44:18.501: D/BrcmNfcJni(1009): RoutingManager::stackCallback: event=0x17 01-14 10:44:18.501: D/BrcmNfcJni(1009): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=12 01-14 10:44:18.501: D/HostEmulationManager(1009): notifyHostEmulationData 

Creo que esto es una pista de que el enrutamiento no está establecido correctamente, ya que creo que el sistema operativo Android no debe ser consciente cuando el enrutamiento a la tarjeta SIM está activa, y un comando select u otro se envía a la tarjeta SIM.

Cada vez que quito el teléfono del campo de NFC del lector, recibo el error siguiente:

 01-14 10:46:48.791: E/BrcmNfcNfa(1009): UICC[0x0] is not activated 

He intentado rastrear la causa de este error y encontré el archivo external/libnfc-nci/src/nfa/ce/nfa_ce_act.chere que parece pertenecer al Broadcom NFC Driver.

Creo que el error es que la aplicación no puede establecer el enrutamiento correcto para las APDU ya que el controlador piensa que la SIM no está activada. En el momento en que envío los comandos, el SIM está desbloqueado (PIN-Entry), pero dudo que esto tenga algo que ver con él ya que no tengo que desbloquear el SIM antes de usarlo en el lector de tarjetas.

Yo uso un Nexus 5 para la prueba. ¿Alguien tiene experiencia y / o un ejemplo de trabajo donde las APDUs pueden ser encaminadas a la SIM en lugar de la CPU?

3 Solutions collect form web for “KitKat: Cómo enrutar las APDU a la tarjeta SIM”

Una comprobación rápida (análisis de las señales en el pin SWP de un UICC insertado en el dispositivo) reveló que el Nexus 5 no está activando el SIM como un elemento seguro NFC (ni en el arranque ni al poner el teléfono en un lector de tarjetas inteligentes).

Sin embargo, encontré dos archivos interesantes en la partición del sistema del dispositivo:

  • /system/etc/libnfc-brcm-20791b05.conf y
  • /system/etc/libnfc-brcm.conf .

Estos dos archivos parecen proporcionar la configuración para el controlador NFC (el primero una configuración de chip-sepecific y el segundo un específico de una familia de chips?).

Después de desbloquear el cargador de arranque, pude modificar esos archivos a través de adb iniciando una imagen de recuperación clockworkmod, así que hice algunos experimentos con los parámetros de configuración.

El resultado es que he logrado que el dispositivo active la UICC (UICC fue activado y registrado sus puertas CE a través de SWP?), El dispositivo a veces incluso notificó a la UICC sobre los cambios de estado de campo. Sin embargo, sin ninguna de mis configuraciones modificadas, pude conseguir que el lector descubriera suavemente la emulación de tarjetas (esto funcionaba antes, cuando sólo estaba disponible HCE en el dispositivo) ni para comunicarse con la UICC.

Los parámetros interesantes en /system/etc/libnfc-brcm.conf parecen ser:

  • NFA_MAX_EE_SUPPORTED : Actualmente se establece en 0. He intentado un valor de 3, que parece ser el valor predeterminado.
  • ACTIVE_SE : Actualmente se establece en 0 (sin SE activa). Intenté descomentar esa línea para permitir que el dispositivo use el primer SE detectado.
  • NFA_HCI_STATIC_PIPE_ID_?? : No debería ser necesario pero en fuera de GS4 esto se establece en 0x71 para ?? = F3 y F4.
  • UICC_LISTEN_TECH_MASK : Se establece en 0x00 en nuestro GS4.
  • REGISTER_VIRTUAL_SE : Dejé esto como estaba (== comentado).
  • SCREEN_OFF_POWER_STATE : No he experimentado con esto, pero en nuestro GS4 esto se establece en 3 (screen-off CE).

Los parámetros interesantes en /system/etc/libnfc-brcm-20791b05.conf parecen ser:

  • NFA_DM_START_UP_CFG : He intentado los parámetros comentados para UICC y he intentado usar la configuración de nuestro GS4. El valor comienza con un byte de longitud y está estructurado en formato TLV (un byte de etiqueta, un byte de longitud, datos de parámetros). La etiqueta relevante para la activación de UICC parece ser C2 , donde los dos bits superiores en el segundo byte de parámetro desactivan las interfaces SWP del controlador NFC si se establecen.
  • NFA_DM_PRE_DISCOVERY_CFG : Los comentarios sugieren que esto necesita ser descomentado para el apoyo de UICC.

Ha pasado un tiempo desde que jugé por última vez con la emulación de tarjetas en Android, pero AFAIK (podría estar equivocado), el acceso a elementos seguros (interno o dentro de SIM) aún no se ha abierto a todos los desarrolladores. Hay muchas cuestiones no técnicas relacionadas con el control de SE que parecen aún no resueltas (¿quién mantiene la mayor parte del pastel de los Telcos o proveedores de servicios?).

La noticia es que Google ha adoptado un enfoque diferente con KitKat y su HCE , que básicamente consiste en la implementación de un modo de emulación de tarjeta NFC sin elemento de hardware seguro . IMHO esto básicamente rompe la seguridad necesaria para las aplicaciones de modo de emulación de tarjetas interesantes: pago electrónico, ticketing, autenticación, etc Nexus 5 carece de ese elemento seguro y dudo que Google se complacerá a los transportistas facilitando el acceso a elemento seguro dentro de SIM Supongo que todavía no será posible enviar APDU a la tarjeta SIM con el firmware de stock.

Si agrega lo siguiente a /etc/libnfc-brcm.conf

 DEFAULT_ISODEP_ROUTE=0xF3 

La UICC recibirá APDU

También necesita todas las modificaciones anteriores en libnfc-brcm.conf y libnfc-brcm-20791b05.conf

Hasta Jelly Bean 4.3, la forma normal es utilizar nfc_extras y su método CardEmulationRoute (<route>, <nfcEe>) para encaminar el UICC al RF. Pero en KITKAT, esta modificación brutal a través de DEFAULT_ISODEP_ROUTE es suficiente para que UICC Card Emulation esté habilitada.

  • Edición de la funcionalidad de la emulación de la tarjeta de host en Android
  • Lectura de una etiqueta emulada en el teléfono Android con CPR Lector 40.30-USB: "Tipo de Transpondedor Incorrecto"
  • Etiqueta NFC / Codificación de etiquetas
  • Escribir en una etiqueta Mifare con Android NFC?
  • Emparejamiento Bluetooth sin confirmación del usuario
  • Detección de NFC en dispositivos Android
  • ¿Es posible usar Android Beam entre un dispositivo Android y otro dispositivo NFC?
  • Habilitación de CardEmulation en Android ICS con NFC_EXTRAS
  • Desbloquear la etiqueta mifare con android
  • Cómo arreglar el error setBeamPushUris?
  • Escribir etiquetas NFC para que funcione con Android y Windows Phone8
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.