Eigenschaften
Schnelles Pairing
Der Anbieter für schnelles Pairing bietet den folgenden GATT-Dienst an.
Dienst | UUID |
---|---|
Schnelles Pairing | 0xFE2C |
Dieser Dienst muss die folgenden Merkmale haben.
Merkmal „Schnelles Pairing“ | Verschlüsselt | Berechtigungen | UUID |
---|---|---|---|
Modell-ID | Nein | Lesen | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Schlüsselbasiertes Pairing | Nein | Schreiben und benachrichtigen | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Passkey | Nein | Schreiben und benachrichtigen | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Kontoschlüssel | Nein | Schreiben | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Geräteinformationsdienst
Der Anbieter für schnelles Pairing sollte auch den Geräteinformationsdienst unterstützen.
Dienst | UUID |
---|---|
Geräteinformationsdienst | 0x180A |
Für die Funktion „Schnelles Pairing“ werden die folgenden Eigenschaften verwendet.
Name | Verschlüsselt | Berechtigungen | UUID |
---|---|---|---|
Firmware-Version | Nein | Lesen | 0x2A26 |
Merkmal: Modell-ID
Diese Eigenschaft ermöglicht es dem Seeker, die Modell-ID bei Bedarf zu lesen, auch wenn das Gerät nicht im Erkennungsmodus beworben wird. Es sollten immer die folgenden Daten zurückgegeben werden:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–2 | uint24 |
Modell-ID | Variabel |
Merkmal: schlüsselbasierte Kopplung
Diese Eigenschaft steuert das schlüsselbasierte Kopplungsverfahren. Bei diesem Verfahren wird ein gewisses Maß an Vertrauen geschaffen, indem überprüft wird, ob der Suchende und der Anbieter beide im Besitz eines vorinstallierten Schlüssels sind. Der Schlüssel ist in jedem Fall unterschiedlich:
Fall 1: Der vorinstallierte Schlüssel basiert auf dem öffentlichen/privaten Anti-Spoofing-Schlüsselpaar und dem öffentlichen/privaten Schlüsselpaar des Suchenden, das sich bei jedem Kopplungsversuch ändert.
- Der Anbieter befindet sich im Kopplungsmodus.
- Der Suchende überprüft, ob der Provider im Besitz des privaten Schlüssels gegen Spoofing ist.
Im Kopplungsmodus kann der Anbieter natürlich auch auf die übliche Weise gekoppelt werden, z. B. um ein Gerät zu koppeln, das die schlüsselbasierte Kopplung durch schnelles Pairing nicht unterstützt.
Fall 2: Der vorinstallierte Schlüssel ist einer der Kontoschlüssel.
- Der Anbieter befindet sich normalerweise nicht im Kopplungsmodus. (Das ist jedoch keine Voraussetzung – der Anbieter sollte die Verwendung eines Kontoschlüssels auch im Kopplungsmodus unterstützen.)
- Der Suchende und der Anbieter überprüfen beide, ob die jeweils andere Person im Besitz des Kontoschlüssels ist.
Da beide Fälle äußerst ähnlich sind, mit Ausnahme des vorinstallierten Schlüssels, werden sie in einem Verfahren kombiniert.
Datenformat
Informationen zur Verwendung der einzelnen Formate finden Sie hier.
Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
---|---|---|---|---|
0–15 | uint128 |
Verschlüsselte Anfrage | Variabel | Obligatorisch |
16–79 | Öffentlicher Schlüssel | Variabel | Optional |
Tabelle 1.1:Verschlüsselte Anfrage, geschrieben in das Merkmal des Seekers.
Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
---|---|---|---|---|
0 | uint8 |
Nachrichtentyp | 0x00 = schlüsselbasierte Kopplungsanfrage |
Obligatorisch |
1 | uint8 |
Markierungen
|
variiert | Obligatorisch |
2–7 | uint48 |
Sie haben folgende Möglichkeiten:
|
variiert | Obligatorisch |
8–13 | uint48 |
BR/EDR-Adresse des Suchenden | variiert | Nur vorhanden, wenn Flags Bit 1 oder 3 festgelegt sind |
n – 15 | Zufallswert (Salt) | variiert | Obligatorisch |
Tabelle 1.2.1:Raw-Anfrage (Typ 0x00). die aus der verschlüsselten Anfrage in Tabelle 1.1 entschlüsselt wurden.
Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
---|---|---|---|---|
0 | uint8 |
Nachrichtentyp | 0x10 = Aktionsanfrage |
Obligatorisch |
1 | uint8 |
Markierungen
|
variiert | Obligatorisch |
2–7 | uint48 |
Sie haben folgende Möglichkeiten:
|
variiert | Obligatorisch |
8 | uint8 |
Nachrichtengruppe | variiert | Obligatorisch, wenn Flags Bit 0 gesetzt ist |
9 | uint8 |
Nachrichtencode | variiert | Obligatorisch, wenn Flags Bit 0 gesetzt ist |
10 | uint8 |
Von Flags abhängig:
|
variiert | Obligatorisch, wenn Flag Bit 0 oder 1 gesetzt ist |
11 – n | Zusätzliche Daten | variiert | Optional | |
n – 15 | Zufallswert (Salt) | variiert | Obligatorisch |
Tabelle 1.2.2:Raw-Anfrage (Typ 0x10). die aus der verschlüsselten Anfrage in Tabelle 1.1 entschlüsselt wurden.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Nachrichtentyp | 0x01 = schlüsselbasierte Kopplungsantwort |
1–6 | uint48 |
Öffentliche Adresse des Anbieters (BR/EDR) | variiert |
7–15 | Zufallswert (Salt) | variiert |
Tabelle 1.3:Rohantwort. Die Verschlüsselung erfolgt, um die verschlüsselte Antwort in Tabelle 1.4 zu erzeugen.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–15 | uint128 |
Verschlüsselte Antwort | variiert |
Tabelle 1.4:Verschlüsselte Antwort, die vom Anbieter über eine Benachrichtigung an den Suchenden gesendet wird.
Merkmal: Passkey
Diese Eigenschaft wird beim schlüsselbasierten Pairing-Verfahren verwendet.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–15 | uint128 |
Verschlüsselter Passkey-Block | variiert |
Tabelle 2.1:Verschlüsselter Passkey-Block. Weitere Informationen finden Sie unter „Verfahren zur schlüsselbasierten Kopplung“.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 | uint8 |
Nachrichtentyp | Eine der folgenden Optionen:
|
1–3 | unit32 |
6-stelliger Passkey | variiert |
4–15 | Zufallswert (Salt) | variiert |
Tabelle 2.2:Roh-Passkey-Block. Entschlüsselte Version von Tabelle 2.1
Merkmal: Kontoschlüssel
Nach dem Koppeln schreibt der Suchende für schnelles Pairing einen Kontoschlüssel an den Anbieter für schnelles Pairing.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0–15 | uint128 |
Kontoschlüssel (verschlüsselt) | variiert |
Beim Erhalt einer Schreibanforderung geht der Anbieter für schnelles Pairing so vor:
- Entschlüsseln Sie den Kontoschlüssel mit dem gemeinsamen Secret, das in Schritt 4 des Verfahrens generiert wurde.
- Für Anbieter, die Bindung erfordern (üblich):
- Prüfen Sie vor der Entschlüsselung, ob das gemeinsame Secret zum Entschlüsseln der Passkey-Anfrage aus Schritt 12 verwendet wurde. Wenn dieser Schritt mit diesem Secret nicht bestanden wurde, ignorieren Sie diesen Schreibvorgang und beenden Sie den Vorgang.
- An dieser Stelle wird das gemeinsame Secret (K im Verfahren) nicht noch einmal für diese Kopplung verwendet. Alle Anfragen, die mit diesem Schlüssel verschlüsselt eingehen, ohne das Verfahren neu zu starten, sollten abgelehnt werden.
- Für Anbieter, die Bindung erfordern (üblich):
- Prüfen Sie, ob der entschlüsselte Wert mit
0x04
beginnt. Ist dies nicht der Fall, ignorieren Sie diesen Schreibvorgang und beenden Sie den Vorgang. - Prüfen Sie, ob in der beibehaltenen Kontoschlüsselliste Platz für den neuen Wert vorhanden ist.
- Ist dies nicht der Fall, löschen Sie den am wenigsten verwendeten Wert aus der Liste.
- Fügen Sie der Liste den neuen Wert hinzu.
Die Kontoschlüssel in der Liste werden während der schlüsselbasierten Kopplung verwendet.
Eigenschaft: Firmware-Version
Diese Eigenschaft ermöglicht es dem Seeker, die Firmwareversion des Anbieters bei Bedarf zu lesen. Es sollten immer die folgenden Daten zurückgegeben werden:
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 – var | utf8s |
Firmware-Versionscode | variiert |
Er sollte in einen einzigen utf8-String gekapselt werden, auch wenn beim Anbieter mehr als eine Firmware (z. B. drei Firmwares für den linken, rechten Kopfhörer und das Gehäuse) vorhanden ist. In Sonderfällen kann der Provider die spezifischen Strings auch zurückgeben:
status-refresh: Gibt an, ob der Anbieter derzeit auf eine neue Firmware aktualisiert wird. Alternativ könnte der Anbieter die Version der bereitgestellten Firmware zurückgeben.
status-abnormal: Der Anbieter hat einen ungewöhnlichen Status. Zum Beispiel funktioniert es nicht, weil das Firmware-Update fehlgeschlagen ist. Dieser Wert führt dazu, dass der Seeker eine Meldung mit dem Hinweis anzeigt, dass er jetzt aktualisiert werden muss.
Der Anbieter sollte den Zugriff auf die Eigenschaft der Firmwareversion einschränken, um das Geräte-Tracking zu verhindern. Empfohlene Einschränkungen:
- gebundenen Geräten jederzeit Zugriff
- Jedes Gerät sollte Zugriff haben, wenn der Anbieter sichtbar ist
Merkmal: Zusätzliche Daten
Diese Dienstleistung weist folgende Merkmale auf.
Merkmal „Schnelles Pairing“ | Verschlüsselt | Berechtigungen | UUID |
---|---|---|---|
Daten | Nein | Schreiben und benachrichtigen | FE2C1237-8366-4814-8EB0-01DE32100BEA |
Altes Merkmal für schnelles Pairing (Ziel wird am 01.01.2021 eingestellt) | Verschlüsselt | Berechtigungen | UUID |
---|---|---|---|
Daten | Nein | Schreiben und benachrichtigen | 0x1237 |
Bevor dieses Merkmal geschrieben oder darüber benachrichtigt wird, muss ein Handshake über die Eigenschaft FE2C1234-8366-4814-8EB0-01DE32100BEA
erfolgen, um ein gemeinsames Secret zu haben. AES-CTR wird zum Verschlüsseln von Daten verwendet, die diese Eigenschaft durchlaufen, deren Algorithmus unten definiert ist. Dieser Modus ist sicherer für Daten, die über einen einzelnen 16-Byte-Block hinausgehen. HMAC-SHA256 wird verwendet, um die Datenintegrität sicherzustellen, die ebenfalls unten definiert ist.
Oktett | Beschreibung | Wert |
---|---|---|
0–7 | Die ersten 8 Byte von HMAC-SHA256. | variiert |
8–15 | Nonce, verwendet von der AES-CTR-Verschlüsselung. | variiert |
16 – var | Verschlüsselte Daten. | variiert |
Tabelle 3.1:Datenpaket, das vom Anbieter über eine Benachrichtigung an den Suchenden gesendet oder vom Suchenden per Schreibvorgang an den Anbieter gesendet wird.
Oktett | Datentyp | Beschreibung | Wert |
---|---|---|---|
0 – var | byte array |
Daten | variiert, decodieren Sie ihn gemäß der Daten-ID aus Tabelle 1.2.2:
|
Tabelle 3.2:Rohdaten. Aus den verschlüsselten Daten in Tabelle 3.1 entschlüsselt.
Wenn eine Benachrichtigung angefordert wird (z.B. Anforderung eines personalisierten Namens über Bit 2 in Tabelle 1.2.1), wird der Anbieter für schnelles Pairing Folgendes tun:
- Generiert kryptografisch zufällige 8 Byte für Nonce.
Verschlüsseln Sie die Daten mit AES-CTR, wobei jeder 16-Byte-Block mit
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
Bitte wo?
- Der AES-Schlüssel ist das gemeinsame Secret aus Schritt 4 des Verfahrens.
- ClearBlock[i] ist ein 16-Byte-Block, der mit „data“[i * 16] beginnt. Der letzte Block kann kleiner als 16 Byte sein.
Führen Sie „concat(encryptedBlock[0], verschlüsseltenBlock[1],...)“ aus, um die verschlüsselten Daten zu erstellen.
HMAC-SHA256 generieren durch
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
Bitte wo?
- K wird von concat(shared_secret, 48-Byte ZEROs) generiert, das gemeinsam genutzte_Secret aus Schritt 4 des Verfahrens.
- Opad ist ein äußeres Padding von 64 Byte, das aus wiederholten Byte mit dem Wert
0x5C
besteht. - ipad hat einen Innenrand von 64 Byte, der aus wiederholten Byte mit dem Wert
0x36
besteht.
Ermitteln Sie die ersten 8 Byte des HMAC-SHA256 als Präfix des Datenpakets.
Beim Erhalt einer Schreibanforderung geht der Anbieter für schnelles Pairing so vor:
- Die Integrität der Daten durch Prüfen der ersten 8 Byte von HMAC-SHA256 prüfen
Entschlüsseln Sie die verschlüsselten Daten mit AES-CTR, wobei jeder Block mithilfe von
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
Bitte wo?
- encryptionBlock[i] ist ein 16-Byte-Blockstart aus verschlüsselten_data[i * 16]. Der letzte Block kann kleiner als 16 Byte sein.
- Der AES-Schlüssel wird durch den Handshake generiert oder identifiziert. Beispiel:
- in Benennung von Ablauf 1 stammt von ECDH und wird nicht noch einmal für diese Verknüpfung verwendet. Alle Anfragen, die mit diesem Schlüssel verschlüsselt werden und ohne einen Neustart der Prozedur eingehen, sollten abgelehnt werden.
- im Benennungsablauf 2 ist es der Kontoschlüssel.
Führen Sie concat(clearBlock[0], cleanBlock[1],...) aus, um die Rohdaten zu erstellen.