Características
Servicio y características del servicio GATT
El proveedor de Vinculación rápida contará con el siguiente servicio GATT.
Servicios | UUID |
---|---|
Servicio de Vinculación rápida | 0xFE2C |
Este servicio tendrá las siguientes características.
Características personalizadas
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 | Escribir y notificar | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Llave de acceso | No | Escribir y notificar | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Clave de la cuenta | No | Escritura | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Características estándar
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 del momento en que el dispositivo publica anuncios en el modo detectable. Siempre debe mostrar 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 cuando se verifica que tanto el buscador como el proveedor poseen una clave precompartida. La clave es diferente en cada caso:
Caso 1: La clave precompartida se basa en el par de claves públicas/privadas que impiden la falsificación de identidad y en el par de claves públicas/privadas de Seeker, que cambiará con cada intento de vinculación.
- El proveedor está en modo de vinculación.
- El buscador verifica que el Proveedor posea la clave privada que impide la falsificación de identidad.
Ten en cuenta que, cuando se encuentra en el modo de vinculación, el proveedor también puede vincularse de la manera habitual, por ejemplo, para sincronizarse 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 cuenta.
- Por lo general, el proveedor no está en modo de vinculación. (Sin embargo, este no es un requisito: el proveedor debe admitir el uso de una clave de cuenta incluso cuando está en modo de vinculación).
- El buscador y el proveedor verifican que el otro posea la clave de la cuenta.
Dado que ambos casos son muy similares, excepto cuando se usa una clave precompartida, se los combina en el procedimiento.
Formato de datos
Consulta el procedimiento para conocer cómo se usa cada formato.
Octeto | Tipo de datos | Descripción | Valor | ¿Obligatorio? |
---|---|---|---|---|
0 a 15 | uint128 |
Solicitud encriptada | varía | Obligatoria |
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 | ¿Obligatorio? |
---|---|---|---|---|
0 | uint8 |
Tipo de mensaje | 0x00 = Solicitud de vinculación basada en claves |
Obligatoria |
1 | uint8 |
Marcas
|
varía | Obligatoria |
Entre 2 y 7 | uint48 |
Sigue uno de estos pasos:
|
varía | Obligatoria |
8 a 13 | uint48 |
Dirección BR/EDR del solicitante | varía | Presente solo si se configuran los bits 1 o 3 de las marcas |
n: 15 | Valor aleatorio (sal) | varía | Obligatoria |
Tabla 1.2.1: Solicitud sin procesar (tipo 0x00). Desencriptado de la solicitud encriptada en la Tabla 1.1.
Octeto | Tipo de datos | Descripción | Valor | ¿Obligatorio? |
---|---|---|---|---|
0 | uint8 |
Tipo de mensaje | 0x10 = Solicitud de acción |
Obligatoria |
1 | uint8 |
Marcas
|
varía | Obligatoria |
Entre 2 y 7 | uint48 |
Sigue uno de estos pasos:
|
varía | Obligatoria |
8 | uint8 |
Grupo de mensajes | varía | Obligatorio si se establece el Bit 0 de la marca |
9 | uint8 |
Código de mensaje | varía | Obligatorio si se establece el Bit 0 de la marca |
10 | uint8 |
Depende de los indicadores:
|
varía | Es obligatorio si se configuran los bits 0 o 1 de la marca. |
11: n | Datos adicionales | varía | Opcional | |
n: 15 | Valor aleatorio (sal) | varía | Obligatoria |
Tabla 1.2.2: Solicitud sin procesar (tipo 0x10). Desencriptado 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 (BR/EDR) del proveedor | varía |
7 - 15 | Valor aleatorio (sal) | varía |
Tabla 1.3: Respuesta sin procesar. Encriptada para producir la respuesta encriptada en la Tabla 1.4.
Octeto | Tipo de datos | Descripción | Valor |
---|---|---|---|
De 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 |
Bloqueo de llave de acceso encriptada | varía |
Tabla 2.1: Bloque de llave de acceso encriptada. Consulta el procedimiento de vinculación basada en claves para su uso.
Octeto | Tipo de datos | Descripción | Valor |
---|---|---|---|
0 | uint8 |
Tipo de mensaje | Uno de:
|
1 a 3 | unit32 |
Llave de acceso de 6 dígitos | varía |
4 - 15 | Valor aleatorio (sal) | varía |
Tabla 2.2: Bloque de clave de acceso sin procesar. Versión desencriptada de la Tabla 2.1.
Característica: Clave de la 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 se reciba una solicitud de escritura, el proveedor de Vinculación rápida hará lo siguiente:
- Desencripta la clave de la cuenta con el secreto compartido generado en el paso 4 del
procedimiento.
- Antes de desencriptar, verifica que el secreto compartido se haya usado para desencriptar la solicitud de clave de acceso del paso 12. Si este paso no se realizó con este secreto, ignora esta escritura y cierra.
- En este punto, el secreto compartido (K en el procedimiento) no se volverá a usar para esta vinculación. Se deben rechazar todas las solicitudes encriptadas con esta clave sin reiniciar el procedimiento.
- Verifica que el valor desencriptado comience con
0x04
. Si no es así, ignora esta escritura y cierra. - Verifica si la lista de claves de cuenta persistente tiene espacio para el valor nuevo.
- De lo contrario, borra de la lista el valor que se usó por última vez.
- Agrega el valor nuevo a la lista.
Las claves de cuenta de la lista se usan durante la Vinculación basada en claves.
Característica: Revisión de firmware
Esta característica permite que el buscador lea la revisión del firmware del proveedor según sea necesario. Siempre debe mostrar 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 string utf8, incluso si hay más de un firmware (p. ej., 3 firmware para el auricular izquierdo, el derecho y la funda) en el proveedor. El proveedor también puede mostrar las strings específicas para casos especiales:
status-refresh: Si el proveedor se está actualizando a un nuevo firmware. Como alternativa, el proveedor podría mostrar la versión del firmware almacenado en etapa de pruebas.
status-anormal: Si el proveedor está en un estado anormal. Por ejemplo, no funciona correctamente porque falló la actualización del firmware. Este valor hará que el buscador muestre un mensaje para informarle al usuario que debe actualizarse ahora.
Característica: Datos adicionales
Este servicio tendrá la siguiente característica.
Característica del servicio de vinculación rápida | Encriptado | Permisos | UUID |
---|---|---|---|
Datos | No | Escribir y notificar | FE2C1237-8366-4814-8EB0-01DE32100BEA |
Característica anterior del servicio de vinculación rápida (objetivo que dejará de estar disponible el 1/1/2021) | Encriptado | Permisos | UUID |
---|---|---|---|
Datos | No | Escribir y notificar | 0x1237 |
Antes de escribir o notificar a esta característica, debe haber un protocolo de enlace a través de la característica FE2C1234-8366-4814-8EB0-01DE32100BEA
para tener un secreto compartido. AES-CTR se usará para encriptar los datos que fluyen por esta característica, cuyo algoritmo se define a continuación. Este modo es más seguro en los datos que se extienden más allá de un solo bloque de 16 bytes. HMAC-SHA256 se usará para garantizar la integridad de los datos, que también se define a continuación.
Octeto | Descripción | Valor |
---|---|---|
0 - 7 | Los primeros 8 bytes de HMAC-SHA256. | varía |
8 a 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 que envía el proveedor al buscador a través de una notificación, o el buscador envía este paquete al proveedor con una escritura.
Octeto | Tipo de datos | Descripción | Valor |
---|---|---|---|
0: var | byte array |
Datos | varía, decodificarlo según el ID de datos de la Tabla 1.2.2:
|
Tabla 3.2: Datos sin procesar. Se desencripta de los datos encriptados de la Tabla 3.1.
Cuando se solicite 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 hará lo siguiente:
- Genera 8 bytes criptográficamente aleatorios para nonce.
Encriptar los datos usando AES-CTR, donde cada bloque de 16 bytes se genera usando
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
en el que
- La clave AES es el secreto compartido del paso 4 en el procedimiento.
- clearBlock[i] es un bloque de 16 bytes a partir de 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 mediante
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
en el que
- K se genera mediante concat(shared_secret, 48-byte ZEROs); el shared_secret es del paso 4 en el procedimiento.
- opad tiene un relleno externo de 64 bytes, que consta de bytes repetidos con valores
0x5C
. - El ipad tiene un relleno interno de 64 bytes, que consta de bytes repetidos con valores
0x36
.
Toma los primeros 8 bytes del HMAC-SHA256 como prefijo del paquete de datos.
Cuando se reciba una solicitud de escritura, el proveedor de Vinculación rápida hará lo siguiente:
- Verifica la integridad de los datos mediante la comprobación de los primeros 8 bytes de HMAC-SHA256.
Desencripta los datos encriptados usando AES-CTR, donde cada bloque se genera con el
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
en el que
- encriptarBlock[i] es un bloque de 16 bytes que comienza a partir deencrypted_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 nomenclatura 1, es de ECDH y no se usará de nuevo para esta vinculación. Se deben rechazar todas las solicitudes encriptadas con esta clave sin reiniciar el procedimiento.
- en el flujo de nomenclatura 2, es la clave de la cuenta.
Ejecuta concat(clearBlock[0], clearBlock[1],...) para crear los datos sin procesar.