Service d'Association express

Le fournisseur d'Association express doit implémenter le service d'Association express (UUID 0xFE2C), qui présente les caractéristiques suivantes.

Nom Chiffré Autorisations UUID Obligatoire ?
ID du modèle Non Lecture FE2C1233-8366-4814-8EB0-01DE32100BEA Obligatoire
Association basée sur une clé Non Écrire et notifier FE2C1234-8366-4814-8EB0-01DE32100BEA Obligatoire
Clé d'accès Non Écrire et notifier FE2C1235-8366-4814-8EB0-01DE32100BEA Obligatoire
Clé de compte Non Écriture FE2C1236-8366-4814-8EB0-01DE32100BEA Obligatoire
Données supplémentaires Non Écrire et notifier FE2C1237-8366-4814-8EB0-01DE32100BEA *C1
PSM du flux de messages Oui Lecture FE2C1239-8366-4814-8EB0-01DE32100BEA *C2
Clé d'accès supplémentaire Non Lecture, écriture et notification FE2C123A-8366-4814-8EB0-01DE32100BEA *C3
Action de l'appareil FP Non Écrire et notifier FE2C123B-8366-4814-8EB0-01DE32100BEA *C4

Obligatoire sous certaines conditions

Caractéristique : ID du modèle

Cette caractéristique permet au Chercheur de lire l'ID du modèle si nécessaire, en dehors des moments où l'appareil diffuse des annonces en mode visible. Elle doit toujours renvoyer les données suivantes :

Octet Type de données Description Valeur
0 - 2 uint24 ID du modèle Variable

Caractéristique : Association basée sur une clé

Cette caractéristique contrôle la procédure d'association basée sur une clé. Dans cette procédure, un certain niveau de confiance est établi en vérifiant que le demandeur et le fournisseur sont tous deux en possession d'une clé pré-partagée. La clé est différente dans chaque cas :

  • Cas 1 : La clé pré-partagée est basée sur la paire de clés publique/privée anti-spoofing et sur la paire de clés publique/privée du Seeker, qui change à chaque tentative d'association.

    • Le fournisseur est en mode association.
    • Le chercheur vérifie que le fournisseur est en possession de la clé privée anti-spoofing.

    Notez qu'en mode association, le fournisseur peut également s'associer de la manière habituelle, par exemple pour s'associer à un appareil qui n'est pas compatible avec l'association basée sur une clé de l'Association express.

  • Cas 2 : La clé prépartagée est l'une des clés de compte.

    • Le fournisseur n'est généralement pas en mode association. (Toutefois, il ne s'agit pas d'une exigence. Le fournisseur doit accepter l'utilisation d'une clé de compte, même en mode association.)
    • Le demandeur et le fournisseur vérifient chacun que l'autre est en possession de la clé de compte.

Étant donné que les deux cas sont extrêmement similaires, à l'exception de la clé pré-partagée utilisée, ils sont combinés dans la procédure.

Format des données

Consultez la procédure pour savoir comment chaque format est utilisé.

Octet Type de données Description Valeur Obligatoire ?
0 à 15 uint128 Requête chiffrée Variable Obligatoire
16 à 79 Clé publique Variable Facultatif

Tableau 1.1 : requête chiffrée, écrite dans la caractéristique par le chercheur.

Octet Type de données Description Valeur Obligatoire ?
0 uint8 Type de message 0x00 = demande d'association basée sur une clé Obligatoire
1 uint8 Options
  • Bit 0 (MSB) : obsolète et ignoré par Seeker.
  • Bit 1 : 1 si le demandeur demande au fournisseur d'initier l'association et que cette demande contient l'adresse BR/EDR du demandeur. 0 sinon.
  • Bit 2 : 1 si le demandeur demande au fournisseur de notifier le nom existant. 0 sinon.
  • Bit 3 : 1 s'il s'agit d'une écriture rétroactive de la clé de compte. 0 sinon.
  • Bit 4 : 1 si le Seeker est compatible avec l'appareil BLE. 0 sinon.
  • Bit 5 : 1 si le chercheur est compatible avec LE Audio. 0 sinon.
  • Les bits 6 et 7 sont réservés pour une utilisation ultérieure et doivent être ignorés.
varie Obligatoire
2 - 7 uint48 Soit :
  • Adresse BLE actuelle du fournisseur
  • Adresse d'identité du fournisseur
varie Obligatoire
8 - 13 uint48 Adresse BR/EDR du Seeker varie Présent uniquement si le bit 1 ou 3 de l'indicateur est défini
n - 15 Valeur aléatoire (salage) varie Obligatoire

Tableau 1.2.1 : Requête brute (type 0x00). Déchiffré à partir de la requête chiffrée dans le tableau 1.1.

Octet Type de données Description Valeur Obligatoire ?
0 uint8 Type de message 0x10 = Demande d'action Obligatoire
1 uint8 Options varie Obligatoire
2 - 7 uint48 Soit :
  • Adresse BLE actuelle du fournisseur
  • Adresse d'identité du fournisseur
varie Obligatoire
8 uint8 Message de groupe varie Obligatoire si le bit d'indicateur 0 est défini
9 uint8 Code du message varie Obligatoire si le bit d'indicateur 0 est défini
10 uint8 Dépend des options :
  • Le bit 0 est défini : longueur des données supplémentaires, inférieure à 6
  • Le bit 1 est défini : ID de données
varie Obligatoire si le bit d'indicateur 0 ou 1 est défini
11 - n Données supplémentaires varie Facultatif
n - 15 Valeur aléatoire (salage) varie Obligatoire

Tableau 1.2.2 : requête brute (type 0x10). Déchiffré à partir de la requête chiffrée dans le tableau 1.1.

Octet Type de données Description Valeur
0 uint8 Type de message 0x01 = réponse d'association basée sur une clé
1 - 6 uint48 Adresse publique (BR/EDR) du fournisseur varie
7 à 15 Valeur aléatoire (salage) varie

Tableau 1.3 : Réponse brute (type 0x01). Chiffré pour produire la réponse chiffrée dans le tableau 1.4.

Octet Type de données Description Valeur
0 uint8 Type de message 0x02 = Key-based Pairing Extended Response
1 uint8 Options
  • Bit 0 (MSB) : 1 si le fournisseur est un appareil LE uniquement, 0 sinon. Si le bit 0 est défini sur 1, le Seeker suppose que le bit 1 est défini sur 1.
  • Bit 1 : 1 si le fournisseur préfère l'association LE, 0 sinon.
  • Bit 2 : 1 si le type de la deuxième adresse est "Random" (Aléatoire), 0 s'il est "Public".
  • Les bits 3 à 7 sont réservés à une utilisation ultérieure et doivent être ignorés.
varie
2 uint8 Nombre d'adresses du fournisseur
Les valeurs valides sont 1 et 2.
varie
3 à 8 ou
3 à 14
  • La première adresse doit être l'adresse d'identité de l'appareil principal, et elle doit être associable si l'association BR/EDR est préférée.
  • La deuxième adresse doit être l'adresse de liaison de l'appareil secondaire, si celui-ci est disponible.
varie
9-15 ou 15 Valeur aléatoire (salage) varie

Tableau 1.3.2 : Réponse brute (type 0x02). Chiffré pour produire la réponse chiffrée dans le tableau 1.4.

Octet Type de données Description Valeur
0 à 15 uint128 Réponse chiffrée varie

Tableau 1.4 : Réponse chiffrée, envoyée par le fournisseur au chercheur via une notification.

Caractéristique : clé d'accès

Cette caractéristique est utilisée lors de la procédure d'association basée sur une clé.

Octet Type de données Description Valeur
0 à 15 uint128 Bloc de clé d'accès chiffré varie

Tableau 2.1 : Bloc de clé d'accès chiffré. Pour en savoir plus sur l'utilisation, consultez la procédure d'association basée sur une clé.

Octet Type de données Description Valeur
0 uint8 Type de message Au choix :
  • 0x02 = clé d'accès du chercheur
  • 0x03 = clé d'accès du fournisseur
1 - 3 unit32 Clé d'accès à six chiffres varie
4 à 15 Valeur aléatoire (salage) varie

Tableau 2.2 : Bloc de clé d'accès brut. Version déchiffrée du tableau 2.1.

Caractéristique : clé de compte

Après l'association, le chercheur d'Association express écrit une clé de compte dans le fournisseur d'Association express.

Octet Type de données Description Valeur
0 à 15 uint128 Clé de compte (chiffrée) varie

Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :

  1. Déchiffrez la clé de compte à l'aide du secret partagé généré à l'étape 4 de la procédure.
    • Pour les fournisseurs qui exigent un cautionnement (courant) :
      • Avant de déchiffrer, vérifiez que le secret partagé a été utilisé pour déchiffrer la requête de clé d'accès de l'étape 12. Si cette étape n'a pas été effectuée à l'aide de ce secret, ignorez cette écriture et quittez.
    • À ce stade, le secret partagé (K dans la procédure) ne sera plus utilisé pour cette association. Toute requête chiffrée avec cette clé qui arrive sans redémarrage de la procédure doit être rejetée.
  2. Vérifiez que la valeur déchiffrée commence par 0x04 ou 0xFF. Si ce n'est pas le cas, ignorez cette écriture et quittez.
    • Si la valeur est 0x04 :
      • Vérifiez si la liste des clés de compte persistante dispose d'un espace pour la nouvelle valeur.
      • Si ce n'est pas le cas, supprimez de la liste la valeur la moins récemment utilisée.
      • Ajoutez la nouvelle valeur à la liste.
    • Si la valeur est 0xFF :
      • Considérez cela comme une session d'association temporaire et n'effectuez aucune opération.
      • Cela peut se produire avec le flux Écriture rétroactive de la clé de compte.
      • Ne stockez pas la clé et ne l'utilisez pas dans la liste des clés de compte, le chiffrement ou les calculs MAC.
      • La suppression de l'association est déclenchée par un événement ou un délai d'expiration spécifique à la fonctionnalité. Pour le partage audio LE, il est vivement recommandé de supprimer la liaison BLE et la clé de liaison 10 minutes après la déconnexion de la session temporaire.

Les clés de compte de la liste sont utilisées lors de l'association basée sur des clés.

Caractéristique : Données supplémentaires

Ce service doit présenter les caractéristiques suivantes.

Caractéristique du service d'Association express Chiffré Autorisations UUID
Données Non Écrire et notifier FE2C1237-8366-4814-8EB0-01DE32100BEA
Ancienne caractéristique du service Association express (obsolescence prévue le 01/01/2021) Chiffré Autorisations UUID
Données Non Écrire et notifier 0x1237

Avant d'écrire ou d'envoyer une notification à cette caractéristique, un handshake doit être effectué via la caractéristique FE2C1234-8366-4814-8EB0-01DE32100BEA pour obtenir un secret partagé. AES-CTR sera utilisé pour chiffrer les données transitant par cette caractéristique, dont l'algorithme est défini ci-dessous. Ce mode est plus sécurisé pour les données qui s'étendent au-delà d'un seul bloc de 16 octets. HMAC-SHA256 sera utilisé pour garantir l'intégrité des données, qui est également définie ci-dessous.

Octet Description Valeur
0 - 7 Les huit premiers octets de HMAC-SHA256. varie
8 - 15 Nonce, utilisé par le chiffrement AES-CTR. varie
16 - var Données chiffrées. varie

Tableau 3.1 : Paquet de données, envoyé par le fournisseur au chercheur via une notification ou envoyé par le chercheur au fournisseur via une écriture.

Octet Type de données Description Valeur
0 - var byte array Données varie, décodez-le en fonction de l'ID de données du tableau 1.2.2 :
  • 0x01(personalized name): utf8s

Tableau 3.2 : Données brutes. Déchiffré à partir des données chiffrées du tableau 3.1.

Lorsqu'une notification est demandée (par exemple, demander un nom personnalisé via le bit 2 du tableau 1.2.1), le fournisseur d'Association express doit procéder comme suit :

  1. Générez 8 octets aléatoires de manière cryptographique pour le nonce.
  2. Chiffrez les données à l'aide d'AES-CTR, où chaque bloc de 16 octets est généré à l'aide de

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

    où

    1. La clé AES est le secret partagé de l'étape 4 de la procédure.
    2. clearBlock[i] est un bloc de 16 octets commençant à data[i * 16]. Le dernier bloc peut être inférieur à 16 octets.
  3. Exécutez concat(encryptedBlock[0], encryptedBlock[1],...) pour créer les données chiffrées.

  4. Générer un HMAC-SHA256 par

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

    où

    1. K est généré par concat(shared_secret, 48-byte ZEROs), où shared_secret provient de l'étape 4 de la procédure.
    2. opad est un remplissage externe de 64 octets, composé d'octets répétés d'une valeur de 0x5C.
    3. "ipad" est un remplissage interne de 64 octets, composé d'octets répétés d'une valeur de 0x36.
  5. Prenez les huit premiers octets du HMAC-SHA256 comme préfixe du paquet de données.

Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :

  1. Vérifiez l'intégrité des données en contrôlant les huit premiers octets de HMAC-SHA256.
  2. Déchiffrez les données chiffrées à l'aide d'AES-CTR, où chaque bloc est généré à l'aide de

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

    où

    1. encryptedBlock[i] est un bloc de 16 octets commençant à encrypted_data[i * 16]. Le dernier bloc peut faire moins de 16 octets.
    2. La clé AES est générée ou identifiée à partir du handshake, par exemple :
      1. Dans le flux de dénomination 1, elle provient d'ECDH et ne sera plus utilisée pour cette association. Toute requête chiffrée avec cette clé sans redémarrage de la procédure doit être rejetée.
      2. Dans le flux de dénomination 2, il s'agit de la clé de compte.
  3. Effectuez concat(clearBlock[0], clearBlock[1],...) pour créer les données brutes.

Caractéristique : PSM du flux de messages

Consultez Appareil BLE : PSM du flux de messages.

Caractéristique : clé d'accès supplémentaire

Consultez Appareil BLE : clé d'accès supplémentaire.

Caractéristique : action sur l'appareil FP

Caractéristique du service d'Association express Chiffré Autorisations UUID
Action sur l'appareil FP Non Écrire et notifier FE2C123B-8366-4814-8EB0-01DE32100BEA

Octet Description Valeur
0 - 7 Les huit premiers octets de HMAC-SHA256. varie
8 - 15 Nonce, utilisé par le chiffrement AES-CTR. varie
16 - var Données chiffrées. varie

Tableau 4.1 : Paquet de données, envoyé par le fournisseur au chercheur sous forme de notification, ou par le chercheur au fournisseur sous forme d'écriture.

Octet Type de données Description Valeur
0 - var byte array Demande d'action Au choix :
  • Lire le nom personnalisé, 0x01
  • Écrivez le nom personnalisé (voir le tableau 4.3.1).
  • Lire les informations sur l'ensemble coordonné, 0x02
  • Lire les fonctionnalités de l'appareil, 0x03

Tableau 4.2 : Données brutes. Déchiffré à partir des données chiffrées du tableau 4.1 envoyées par le demandeur au fournisseur en tant qu'écriture.

Octet Type de données Description Valeur
0 - var byte array Réponse à l'action Au choix :
  • Nom personnalisé, voir le tableau 4.3.1
  • Informations sur l'ensemble coordonné, voir le tableau 4.3.2
  • Fonctionnalités de l'appareil, voir le tableau 4.3.3
  • Code d'erreur
    • 0x80 (requête non prise en charge)
    • 0x81 (requête non valide)

Tableau 4.3 : Données brutes. Déchiffré à partir des données chiffrées du tableau 4.1 envoyé par le fournisseur au demandeur sous forme de notification.

Octet Type de données Description Valeur
0 uint8 Identifiant de l'action 0x01
1 - var utf8s Nom personnalisé Variable

Tableau 4.3.1 : format de nom personnalisé

Octet Type de données Description Valeur
0 uint8 Identifiant de l'action 0x02
1 uint8 Type de membre de l'ensemble coordonné d'Association express
  • 0x00 : composant gauche
  • 0x01 : composant droit
2 uint8 Taille de l'ensemble coordonné nombre de composants
3 uint8 Définir le type de clé de résolution d'identité 0x01 (SIRK en texte brut)
4 - 19 uint128 Définir la valeur de la clé de résolution d'identité Données de 16 octets, consultez Service d'identification d'ensemble coordonné.

Tableau 4.3.2 : Format des informations sur les ensembles coordonnés

Octet Type de données Description Valeur
0 uint8 Identifiant de l'action 0x03
1 - 2 uint16 Fonctionnalités de l'appareil
  • Bits 0 à 15 : réservés, doivent être définis sur 0

Tableau 4.3.3 : Format des fonctionnalités de l'appareil

Opérations d'Association express

Deux opérations principales sont définies pour cette caractéristique

  • Lecture de l'Association express : lire les données du fournisseur
    1. Seeker : activer la notification GATT
    2. Fournisseur : notification GATT enregistrée
    3. Chercheur : requête d'écriture GATT, les données brutes ne contiennent que Action ID
    4. Fournisseur : réponse d'écriture GATT
    5. Fournisseur : GATT Notify, les données brutes contiennent
      • Identifiant de l'action
      • Données pour l'identifiant de l'action
    6. Seeker : notification GATT reçue
  • Écriture de l'Association express : écrire des données dans le fournisseur
    1. Seeker : requête d'écriture GATT, les données brutes contiennent
      • Identifiant de l'action
      • Données pour l'identifiant de l'action
    2. Fournisseur : réponse d'écriture GATT

ID d'action de lecture compatible avec l'Association express

  • 0x01 (nom personnalisé)
  • 0x02 (informations sur l'ensemble coordonné)
  • 0x03 (Fonctionnalités de l'appareil)

ID d'action d'écriture compatible avec l'Association express

Si le fournisseur ne comprend pas un identifiant de l'action, il répond par une notification GATT contenant "Requête non compatible" (0x80), comme décrit dans le tableau 4.3.

Algorithme de chiffrement

.

Lorsqu'une notification est demandée, le fournisseur de l'Association express doit effectuer les opérations suivantes :

  1. Générez 8 octets aléatoires de manière cryptographique pour le nonce.
  2. Chiffrez les données à l'aide d'AES-CTR, où chaque bloc de 16 octets est généré à l'aide de

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

    où

    1. La clé AES est le secret partagé de l'étape 4 de la procédure.
    2. clearBlock[i] est un bloc de 16 octets commençant à data[i * 16]. Le dernier bloc peut être inférieur à 16 octets.
  3. Exécutez concat(encryptedBlock[0], encryptedBlock[1],...) pour créer les données chiffrées.

  4. Générer un HMAC-SHA256 par

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

    où

    1. K est généré par concat(shared_secret, 48-byte ZEROs), où shared_secret provient de l'étape 4 de la procédure.
    2. opad est un remplissage externe de 64 octets, composé d'octets répétés d'une valeur de 0x5C.
    3. "ipad" est un remplissage interne de 64 octets, composé d'octets répétés d'une valeur de 0x36.
  5. Prenez les huit premiers octets du HMAC-SHA256 comme préfixe du paquet de données.

Lorsqu'il reçoit une requête d'écriture, le fournisseur d'Association express doit effectuer les opérations suivantes :

  1. Vérifiez l'intégrité des données en contrôlant les huit premiers octets de HMAC-SHA256.
  2. Déchiffrez les données chiffrées à l'aide d'AES-CTR, où chaque bloc est généré à l'aide de

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

    où

    1. encryptedBlock[i] est un bloc de 16 octets commençant à encrypted_data[i * 16]. Le dernier bloc peut faire moins de 16 octets.
    2. La clé AES est générée ou identifiée à partir du handshake, par exemple :
      1. Dans le flux de dénomination 1, elle provient d'ECDH et ne sera plus utilisée pour cette association. Toute requête chiffrée avec cette clé sans redémarrage de la procédure doit être rejetée.
      2. Dans le flux de dénomination 2, il s'agit de la clé de compte.
  3. Exécutez concat(clearBlock[0], clearBlock[1],...) pour créer les données brutes.

Service d'informations sur l'appareil

Le fournisseur d'Association express doit également être compatible avec le service d'informations sur l'appareil (UUID 0x180A). Le chercheur d'Association express utilise les caractéristiques suivantes.

Nom Chiffré Autorisations UUID
Révision du micrologiciel Non Lecture 0x2A26

Caractéristique : révision du micrologiciel

Cette caractéristique permet au chercheur de lire la révision du micrologiciel du fournisseur si nécessaire. Elle doit toujours renvoyer les données suivantes :

Octet Type de données Description Valeur
0 - var utf8s Code de révision du micrologiciel varie

Il doit être encapsulé dans une seule chaîne UTF-8, même s'il existe plusieurs micrologiciels (par exemple, trois micrologiciels pour l'écouteur gauche, l'écouteur droit et l'étui) sur le fournisseur. Le fournisseur peut également renvoyer des chaînes spécifiques pour des cas particuliers :

  1. status-updating : si le fournisseur est en train de mettre à jour le micrologiciel. Le fournisseur peut également renvoyer la version du micrologiciel préparé.

  2. status-abnormal : si le fournisseur est dans un état anormal. Par exemple, il ne fonctionne pas correctement, car la mise à jour du micrologiciel a échoué. Cette valeur entraîne l'affichage d'un message par le Seeker pour informer l'utilisateur qu'il doit être mis à jour maintenant.

Le fournisseur doit limiter l'accès à la caractéristique "Firmware Revision" (Révision du micrologiciel) pour empêcher le suivi de l'appareil. Restrictions suggérées :

  • les appareils associés doivent avoir accès à tout moment
  • Tous les appareils doivent avoir accès lorsque le fournisseur est visible

Si le fournisseur est compatible avec Find Hub, une implémentation supplémentaire est requise. Pour en savoir plus, consultez Mises à jour du micrologiciel Localiser.