Características
Servicio de Vinculación rápida
El proveedor de Vinculación rápida debe tener el siguiente servicio GATT.
| Servicio | UUID |
|---|---|
| Servicio de Vinculación rápida | 0xFE2C |
Este servicio tendrá las siguientes características.
| Característica del servicio de Vinculación rápida | Encriptado | Permisos | UUID |
|---|---|---|---|
| ID de modelo | No | Leer | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Vinculación basada en claves | No | Escribe y notifica | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Llave de acceso | No | Escribe y notifica | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| Clave de cuenta | No | Escritura | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Servicio de información del dispositivo
El proveedor de Vinculación rápida también debe admitir el servicio de información del dispositivo.
| Servicio | UUID |
|---|---|
| Servicio de información del dispositivo | 0x180A |
Vinculación rápida Seeker usa las siguientes características.
| Nombre | Encriptado | Permisos | UUID |
|---|---|---|---|
| Revisión de firmware | No | Leer | 0x2A26 |
Característica: ID del modelo
Esta característica permite que el buscador lea el ID del modelo según sea necesario, fuera de los momentos en que el dispositivo está anunciando en modo detectable. Siempre debe devolver los siguientes datos:
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 a 2 | uint24 |
ID de modelo | varía |
Característica: Vinculación basada en claves
Esta característica controla el procedimiento de vinculación basada en claves. En este procedimiento, se establece un cierto nivel de confianza verificando que tanto el buscador como el proveedor posean una clave precompartida. La clave es diferente en cada caso:
Caso 1: La clave precompartida se basa en el par de claves pública/privada anti-suplantación y en el par de claves pública/privada propio del buscador, que cambiará en cada intento de vinculación.
- El proveedor está en modo de vinculación.
- El buscador verifica que el proveedor posea la clave privada contra suplantación.
Ten en cuenta que, cuando está en modo de vinculación, el proveedor también puede vincularse de la manera habitual, por ejemplo, para vincularse con un dispositivo que no admite la vinculación basada en claves de la Vinculación rápida.
Caso 2: La clave precompartida es una de las claves de la cuenta.
- Por lo general, el proveedor no está en modo de vinculación. (Pero esto no es un requisito: el proveedor debe admitir el uso de una clave de cuenta incluso en el modo de vinculación).
- El buscador y el proveedor verifican que el otro tenga la clave de la cuenta.
Dado que ambos casos son extremadamente similares, excepto por la clave precompartida que se usa, se combinan en el procedimiento.
Formato de datos
Consulta el procedimiento para saber cómo se usa cada formato.
| Octeto | Tipo de datos | Descripción | Valor | ¿Es obligatorio? |
|---|---|---|---|---|
| 0 a 15 | uint128 |
Solicitud encriptada | varía | Obligatorio |
| 16 a 79 | Clave pública | varía | Opcional |
Tabla 1.1: Solicitud encriptada, escrita en la característica por el buscador.
| Octeto | Tipo de datos | Descripción | Valor | ¿Es obligatorio? |
|---|---|---|---|---|
| 0 | uint8 |
Tipo de mensaje | 0x00 = Solicitud de vinculación basada en claves |
Obligatorio |
| 1 | uint8 |
Marcas
|
varía | Obligatorio |
| 2 - 7 | uint48 |
Una de estas opciones:
|
varía | Obligatorio |
| 8 a 13 | uint48 |
Dirección BR/EDR del buscador | varía | Solo está presente si se configura el bit 1 o 3 de las marcas. |
| n - 15 | Valor aleatorio (salt) | varía | Obligatorio |
Tabla 1.2.1: Solicitud sin procesar (tipo 0x00). Se desencriptó de la solicitud encriptada en la Tabla 1.1.
| Octeto | Tipo de datos | Descripción | Valor | ¿Es obligatorio? |
|---|---|---|---|---|
| 0 | uint8 |
Tipo de mensaje | 0x10 = Solicitud de acción |
Obligatorio |
| 1 | uint8 |
Marcas
|
varía | Obligatorio |
| 2 - 7 | uint48 |
Una de estas opciones:
|
varía | Obligatorio |
| 8 | uint8 |
Enviar mensaje al grupo | varía | Obligatorio si se configura el bit 0 de las marcas |
| 9 | uint8 |
Código del mensaje | varía | Obligatorio si se configura el bit 0 de las marcas |
| 10 | uint8 |
Depende de las marcas:
|
varía | Obligatorio si se configura el bit 0 o 1 de las marcas |
| 11 - n | Datos adicionales | varía | Opcional | |
| n - 15 | Valor aleatorio (salt) | varía | Obligatorio |
Tabla 1.2.2: Solicitud sin procesar (tipo 0x10). Se desencriptó de la solicitud encriptada en la Tabla 1.1.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 | uint8 |
Tipo de mensaje | 0x01 = Respuesta de vinculación basada en claves |
| 1 a 6 | uint48 |
Dirección pública del proveedor (BR/EDR) | varía |
| 7 a 15 | Valor aleatorio (salt) | varía |
Tabla 1.3: Respuesta sin procesar. Se encripta para producir la respuesta encriptada en la Tabla 1.4.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 a 15 | uint128 |
Respuesta encriptada | varía |
Tabla 1.4: Respuesta encriptada, enviada por el proveedor al buscador a través de una notificación.
Característica: Llave de acceso
Esta característica se usa durante el procedimiento de vinculación basada en claves.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 a 15 | uint128 |
Bloque de llave de acceso encriptada | varía |
Tabla 2.1: Bloque de clave de acceso encriptada. Consulta el procedimiento de vinculación basado en claves para obtener información sobre el uso.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 | uint8 |
Tipo de mensaje | Uno de los siguientes:
|
| 1 - 3 | unit32 |
Llave de acceso de 6 dígitos | varía |
| 4 a 15 | Valor aleatorio (salt) | varía |
Tabla 2.2: Bloque de llave de acceso sin procesar. Versión desencriptada de la Tabla 2.1.
Característica: Clave de cuenta
Después de la vinculación, el buscador de Vinculación rápida escribirá una clave de cuenta en el proveedor de Vinculación rápida.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 a 15 | uint128 |
Clave de cuenta (encriptada) | varía |
Cuando recibe una solicitud de escritura, el proveedor de Vinculación rápida debe hacer lo siguiente:
- Descifra la clave de la cuenta con el secreto compartido generado en el paso 4 del procedimiento.
- Para los proveedores que requieren una fianza (común):
- Antes de desencriptar, verifica que se haya usado el secreto compartido para desencriptar la solicitud de llave de acceso del paso 12. Si este paso no se superó con este secreto, ignora esta escritura y sal.
- En este punto, el secreto compartido (K en el procedimiento) no se volverá a usar para este vinculación. Se deben rechazar las solicitudes que lleguen encriptadas con esta clave sin reiniciar el procedimiento.
- Para los proveedores que requieren una fianza (común):
- Verifica que el valor desencriptado comience con
0x04o0xFF. Si no es así, ignora esta escritura y sal.- Si el valor es
0x04:- Verifica si la lista de claves de la cuenta persistente tiene espacio para el valor nuevo.
- De lo contrario, borra el valor menos usado recientemente de la lista.
- Agrega el valor nuevo a la lista.
- Si el valor es
0xFF:- Considera esto como una sesión de vinculación temporal y no realices ninguna operación.
- Esto puede ocurrir con el flujo Escribir la clave de la cuenta de forma retroactiva.
- No almacenes la clave ni la uses en la lista de claves de la cuenta, en la encriptación ni en los cálculos de MAC.
- La eliminación de la vinculación se activa por un evento o un tiempo de espera específicos de la función. En el caso de LE Audio Sharing, se recomienda quitar la vinculación BLE y la clave de vinculación 10 minutos después de que se desconecte la sesión temporal.
- Si el valor es
Las claves de la cuenta que se muestran en la lista se usan durante la vinculación basada en claves.
Característica: Revisión de firmware
Esta característica permite que el Seeker lea la revisión del firmware del Provider según sea necesario. Siempre debe devolver los siguientes datos:
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 - var | utf8s |
Código de revisión de firmware | varía |
Debe encapsularse en una sola cadena UTF-8, incluso si hay más de un firmware (p. ej., 3 firmwares para el auricular izquierdo, el auricular derecho y el estuche) en el proveedor. El proveedor también puede devolver las cadenas específicas para casos especiales:
status-updating: Si el proveedor se está actualizando a un nuevo firmware. Como alternativa, el proveedor podría devolver la versión del firmware en etapa de pruebas.
status-abnormal: Si el proveedor se encuentra en un estado anormal. Por ejemplo, no funciona correctamente porque falló la actualización de firmware. Este valor hará que el buscador muestre un mensaje para informar al usuario que debe actualizarse ahora.
El proveedor debe limitar el acceso a la característica de revisión del firmware para evitar el seguimiento del dispositivo. Restricciones sugeridas:
- Los dispositivos vinculados deben tener acceso en cualquier momento.
- Cualquier dispositivo debería tener acceso cuando el proveedor sea visible.
Característica: Datos adicionales
Este servicio debe tener la siguiente característica.
| Característica del servicio de Vinculación rápida | Encriptado | Permisos | UUID |
|---|---|---|---|
| Datos | No | Escribe y notifica | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Característica del servicio de Vinculación rápida anterior (se dará de baja el 1/1/2021) | Encriptado | Permisos | UUID |
|---|---|---|---|
| Datos | No | Escribe y notifica | 0x1237 |
Antes de escribir o notificar esta característica, debe haber un handshake a través de la característica FE2C1234-8366-4814-8EB0-01DE32100BEA para tener un secreto compartido. Se usará AES-CTR para encriptar los datos que fluyen a través de esta característica, cuyo algoritmo se define a continuación. Este modo es más seguro para los datos que se extienden más allá de un solo bloque de 16 bytes. Se usará HMAC-SHA256 para garantizar la integridad de los datos, lo que también se define a continuación.
| Octeto | Descripción | Valor |
|---|---|---|
| 0 - 7 | Son los primeros 8 bytes de HMAC-SHA256. | varía |
| 8 - 15 | Nonce, que se usa en la encriptación AES-CTR. | varía |
| 16: var | Datos encriptados | varía |
Tabla 3.1: Paquete de datos, enviado por el proveedor al buscador a través de una notificación o enviado por el buscador al proveedor a través de una escritura.
| Octeto | Tipo de datos | Descripción | Valor |
|---|---|---|---|
| 0 - var | byte array |
Datos | varies, decodifícalo según el ID de datos de la Tabla 1.2.2:
|
Tabla 3.2: Datos sin procesar. Se descifraron los datos encriptados de la Tabla 3.1.
Cuando se solicita una notificación (p.ej., se solicita un nombre personalizado a través del bit 2 en la Tabla 1.2.1), el proveedor de Vinculación rápida debe hacer lo siguiente:
- Genera 8 bytes aleatorios criptográficos para Nonce.
Encripta los datos con AES-CTR, donde cada bloque de 16 bytes se genera con
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))en el que
- La clave AES es el secreto compartido del paso 4 del procedimiento.
- clearBlock[i] es un bloque de 16 bytes que comienza en data[i * 16]. El último bloque puede tener menos de 16 bytes.
Realiza concat(encryptedBlock[0], encryptedBlock[1],…) para crear los datos encriptados.
Genera HMAC-SHA256 de la siguiente manera:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))en el que
- K se genera con concat(shared_secret, 48 bytes de CEROS), y shared_secret proviene del paso 4 del procedimiento.
- opad es un padding externo de 64 bytes que consta de bytes repetidos con el valor
0x5C. - ipad es un padding interno de 64 bytes que consta de bytes repetidos con el valor
0x36.
Toma los primeros 8 bytes del HMAC-SHA256 como prefijo del paquete de datos.
Cuando recibe una solicitud de escritura, el proveedor de Vinculación rápida debe hacer lo siguiente:
- Verifica la integridad de los datos comprobando los primeros 8 bytes de HMAC-SHA256.
Descifrar los datos encriptados con AES-CTR, donde cada bloque se genera con
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))en el que
- encryptedBlock[i] es un bloque de 16 bytes que comienza en encrypted_data[i * 16]. El último bloque puede tener menos de 16 bytes.
- La clave AES se genera o identifica a partir del protocolo de enlace, p.ej.,
- En el flujo de asignación de nombres 1, proviene de ECDH y no se volverá a usar para este vinculación. Se deben rechazar todas las solicitudes que lleguen encriptadas con esta clave sin reiniciar el procedimiento.
- En el flujo de asignación de nombres 2, es la clave de la cuenta.
Realiza concat(clearBlock[0], clearBlock[1],…) para crear los datos sin procesar.