Características

Servicio de Vinculación rápida

El proveedor de Vinculación rápida tendrá 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 Encriptada 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

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

El buscador de Vinculación rápida usa las siguientes características.

Nombre Encriptada Permisos UUID
Revisión de firmware No Leer 0x2A26

Característica: ID del modelo

Esta característica permite que Seeker lea el ID de modelo según sea necesario, fuera de cuando el dispositivo publica anuncios en el modo detectable. Siempre debería mostrar los siguientes datos:

Octeto Tipo de datos Descripción Valor
0 - 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 el Seeker y el Provider tengan 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 contra la falsificación de identidad y el par de claves pública/privada de Seeker, 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 la falsificación de identidad.

    Ten en cuenta que, en el modo de vinculación, el proveedor también puede vincularse de la manera habitual, por ejemplo, para vincularse con un dispositivo que no admita la vinculación basada en claves de 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. (Pero 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 muy similares, excepto cuando se usa la clave precompartida, se combinan 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 del 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
  • Bit 0 (MSB): Seeker dejó de estar disponible y lo ignoró.
  • Bit 1: 1, si el buscador solicita que el proveedor inicie la vinculación, y esta solicitud contiene la dirección BR/EDR del buscador De lo contrario, es 0.
  • Bit 2: 1, si el buscador solicita que el Proveedor notifique el nombre existente. De lo contrario, es 0.
  • Bit 3: 1 si corresponde a Escritura retroactiva de la clave de la cuenta. De lo contrario, es 0.
  • Los bits 4 a 7 están reservados para uso futuro y se deben ignorar.
varía Obligatoria
Entre 2 y 7 uint48 Puedes elegir una de estas opciones:
  • Dirección BLE actual del proveedor
  • Dirección pública del proveedor
varía Obligatoria
8 - 13 uint48 Dirección en BR/EDR del solicitante varía Presente solo si se configura el bit de marcas 1 o 3
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 Puedes elegir una de estas opciones:
  • Dirección BLE actual del proveedor
  • Dirección pública del proveedor
varía Obligatoria
8 uint8 Grupo de mensajes varía Obligatorio si se establece el bit 0 de las marcas
9 uint8 Código del mensaje varía Obligatorio si se establece el bit 0 de las marcas
10 uint8 Depende de las marcas:
  • Se estableció el bit 0: longitud de datos adicionales, menor que 6.
  • El bit 1 está configurado: ID de datos.
varía Obligatorio si se establece el bit 0 o 1 de las marcas
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
Entre 1 y 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. Encriptado 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 que envía 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 llaves de acceso encriptadas varía

Tabla 2.1: Bloqueo de llaves de acceso encriptadas 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 los siguientes:
  • 0x02 = Llave de acceso del solicitante
  • 0x03 = Llave de acceso del proveedor
Entre 1 y 3 unit32 Llave de acceso de 6 dígitos varía
4 - 15 Valor aleatorio (sal) varía

Tabla 2.2: Bloqueo de llaves 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 deberá hacer lo siguiente:

  1. Desencripta la clave de la cuenta con el secreto compartido generado en el paso 4 del procedimiento.
    • Para proveedores que requieren vinculación (común):
      • Antes de desencriptar, verifica que el secreto compartido se haya usado para desencriptar la solicitud de llave de acceso del paso 12. Si este paso no se pasó con este secreto, ignora esta escritura y sal.
    • En este punto, el secreto compartido (K en el procedimiento) no se usará de nuevo para esta vinculación. Se deben rechazar todas las solicitudes que se encripten con esta clave sin reiniciar el procedimiento.
  2. Verifica que el valor desencriptado comience con 0x04. De lo contrario, ignora esta escritura y sal.
  3. Verifica si la lista de claves de cuenta guardada tiene espacio para el valor nuevo.
  4. De lo contrario, borra de la lista el valor que se usó más recientemente.
  5. 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 Seeker lea la revisión del firmware del proveedor según sea necesario. Siempre debería 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 cadena utf8, incluso si hay más de un firmware (p. ej., 3 firmwares para el auricular izquierdo, el derecho y la funda) en el proveedor. El proveedor también puede mostrar las cadenas específicas en casos especiales:

  1. status-upgrade: Si el proveedor se encuentra actualizando a un firmware nuevo. Como alternativa, el proveedor puede mostrar la versión del firmware almacenado en etapa intermedia.

  2. status-abnormal: Si el proveedor se encuentra en un estado anormal. Por ejemplo, no funcionó porque la actualización del firmware falló. Este valor hará que el Seeker muestre un mensaje para informar al usuario que debe actualizarse ahora.

El proveedor debe limitar el acceso a la característica de revisión de firmware para evitar el seguimiento de dispositivos. Restricciones sugeridas:

  • los dispositivos vinculados deben tener acceso en todo momento
  • cualquier dispositivo debe tener acceso cuando el proveedor sea detectable

Característica: Datos adicionales

Este servicio tendrá la siguiente característica.

Característica del servicio de Vinculación rápida Encriptada 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) Encriptada Permisos UUID
Datos No Escribir y notificar 0x1237

Antes de escribir o notificar sobre 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. Se usará la 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 en los datos que se extienden más allá de un único 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 - 15 Nonce, utilizado por la encriptación AES-CTR. varía
16: var Datos encriptados varía

Tabla 3.1: Paquete de datos que el proveedor envía al proveedor a través de una notificación o que el buscador envía 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:
  • 0x01(nombre personalizado): utf8s

Tabla 3.2: Datos sin procesar. Desencriptado de los datos encriptados en la Tabla 3.1.

Cuando se solicite una notificación (p.ej., solicitar un nombre personalizado a través del Bit 2 en la Tabla 1.2.1), el proveedor de Vinculación rápida deberá hacer lo siguiente:

  1. Genera 8 bytes de forma criptográfica aleatoria para Nonce.
  2. Los datos se encriptan con 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

    1. La clave AES es el secreto compartido del paso 4 del procedimiento.
    2. clearBlock[i] es un bloque de 16 bytes a partir de data[i * 16]. El último bloque puede tener menos de 16 bytes.
  3. Realiza concat(encryptedBlock[0], encryptedBlock[1],...) para crear los datos encriptados.

  4. Genera HMAC-SHA256

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    en el que

    1. K se genera con concat(shared_secret, 48-byte ZEROs); elshared_secret es del paso 4 en el procedimiento.
    2. opad tiene un padding externo de 64 bytes, que consta de bytes repetidos con valor 0x5C.
    3. El ipad tiene un padding interno de 64 bytes, que consta de bytes repetidos con valor 0x36.
  5. Toma los primeros 8 bytes de HMAC-SHA256 como prefijo del paquete de datos.

Cuando se reciba una solicitud de escritura, el proveedor de Vinculación rápida deberá hacer lo siguiente:

  1. Para verificar la integridad de los datos, comprueba los primeros 8 bytes de HMAC-SHA256.
  2. Desencripta los datos encriptados con AES-CTR, donde cada bloque se genera usando

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    en el que

    1. encryptionBlock[i] es un bloque de 16 bytes a partir de encryption_data[i * 16]. El último bloque puede tener menos de 16 bytes.
    2. La clave AES se genera o se identifica a partir del protocolo de enlace, p.ej.,
      1. en el flujo de nomenclatura 1, es de ECDH y no se volverá a usar para esta vinculación. Se deben rechazar todas las solicitudes que se encripten con esa clave sin reiniciar el procedimiento.
      2. en el flujo de nomenclatura 2, es la clave de la cuenta.
  3. Realiza concat(clearBlock[0], clearBlock[1],...) para crear los datos sin procesar.