Código de autenticación de mensajes
Los flujos de mensajes se usan para configurar el cambio de audio. Consulta Mensajes de cambio de audio. Para estas configuraciones importantes, el proveedor debe asegurarse de que el mensaje se envíe a través de GMSCore (módulo de Vinculación rápida) y no de ninguna otra app en el buscador.
Genera un MAC (código de autenticación de mensajes)
El buscador de FP agrega un código de autenticación de mensajes para los mensajes de configuración del dispositivo con HMAC-SHA256. El MAC del mensaje consta de los primeros 8 bytes de:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
en el que
- K se genera con concat(clave de la cuenta, 48 bytes de CEROS).
- message son los datos adicionales del flujo de mensajes.
- nonce se genera con concat(session_nonce, message_nonce); session nonce y message nonce se definen en la siguiente sección.
- opad son 64 bytes de relleno externo, que constan de bytes repetidos con el valor
0x5C. - ipad son 64 bytes de relleno interno, que constan de bytes repetidos con el valor
0x36.
Nonce de sesión y nonce de mensaje
Para evitar un ataque de reproducción, el proveedor debe asegurarse de que no se repita un nonce. Dado que mantener la sincronización del reloj o del contador en el proveedor y el buscador no es sencillo, el proveedor genera el nonce de sesión (por conexión), que se comparte con todos los mensajes durante la conexión, mientras que el buscador genera el nonce de mensaje (por mensaje), que se genera de forma aleatoria para cada mensaje. El nonce para generar el MAC de cada mensaje es la combinación de nonce de sesión y nonce de mensaje, es decir, concat(session_nonce, message_nonce).
Agregamos un nonce de sesión al grupo de eventos de información del dispositivo:
| Nombre del grupo de mensajes | Valor |
|---|---|
| Evento de información del dispositivo | 0x03 |
| Nombre del código de mensaje | Valor |
|---|---|
| Nonce de sesión | 0x0A |
El nonce de sesión se debe generar y enviar al buscador cuando se conecta el flujo de mensajes:
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 | uint8 | Evento de información del dispositivo | 0x03 |
| 1 | uint8 | Nonce de sesión | 0x0A |
| 2 - 3 | uint16 | Longitud de datos adicionales | 0x0008 |
| 4 - 11 | Nonce de sesión | varía |
Para enviar un mensaje cuando se requiere un MAC, el buscador enviará un nonce de mensaje y el MAC junto con el mensaje.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 | uint8 | Grupo de mensajes | varía |
| 1 | uint8 | Código de mensaje | varía |
| 2 - 3 | uint16 | Longitud de datos adicionales(longitud de datos adicionales + 16) | varía |
| 4 - n | Datos adicionales | varía | |
| n + 1 - n + 8 | Nonce de mensaje | varía | |
| n + 9 - n + 16 | Código de autenticación de mensajes | varía |
Verifica el MAC (código de autenticación de mensajes)
Al recibir un mensaje con el código de autenticación de mensajes, el proveedor debe verificarlo con la misma función que la función de generación. Es decir, el MAC recibido debe ser igual a los primeros 8 bytes de
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
Donde:
- K se genera con
concat(account key, 48-byte ZEROs), y el proveedor debe recorrer todas las claves de la cuenta almacenadas para verificar el MAC. - message son los datos adicionales (sin incluir el nonce de mensaje y el MAC) de el flujo de mensajes.
Si el MAC es correcto, el proveedor debe seguir la instrucción del mensaje. De lo contrario, el proveedor debe enviar un NAK con el motivo del error, 0x3, que indica que no se permite debido a un código de autenticación de mensajes incorrecto.