Merkmale
Schnelles Pairing
Der Anbieter für Schnelles Pairing muss den folgenden GATT-Dienst haben.
| Dienst | UUID |
|---|---|
| Schnelles Pairing | 0xFE2C |
Dieser Dienst muss die folgenden Merkmale aufweisen.
| Merkmal des Fast Pair Service | Verschlüsselt | Berechtigungen | UUID |
|---|---|---|---|
| Modell-ID | Nein | Lesen | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Schlüsselbasierte Kopplung | 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 |
Device Information Service
Der Fast Pair-Anbieter sollte auch den Device Information Service unterstützen.
| Dienst | UUID |
|---|---|
| Device Information Service | 0x180A |
Der Schnelles Pairing-Sucher verwendet die folgenden Merkmale.
| Name | Verschlüsselt | Berechtigungen | UUID |
|---|---|---|---|
| Firmware-Version | Nein | Lesen | 0x2A26 |
Merkmal: Modell-ID
Mit diesem Merkmal kann der Seeker die Modell-ID bei Bedarf lesen, auch wenn das Gerät nicht im sichtbaren Modus wirbt. Es sollten immer die folgenden Daten zurückgegeben werden:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0–2 | uint24 |
Modell-ID | variiert |
Merkmal: Schlüsselbasierte Kopplung
Dieses Merkmal steuert das schlüsselbasierte Kopplungsverfahren. Bei diesem Verfahren wird ein gewisses Maß an Vertrauen aufgebaut, indem überprüft wird, ob sowohl der Seeker als auch der Provider im Besitz eines vorinstallierten Schlüssels sind. Der Schlüssel ist jeweils unterschiedlich:
Fall 1: Der vorinstallierte Schlüssel basiert auf dem öffentlichen/privaten Schlüsselpaar zur Fälschungssicherheit und dem eigenen öffentlichen/privaten Schlüsselpaar des Seeker, das sich bei jedem Pairing-Versuch ändert.
- Der Anbieter befindet sich im Kopplungsmodus.
- Der Seeker überprüft, ob der Provider im Besitz des privaten Anti-Spoofing-Schlüssels ist.
Im Kopplungsmodus kann der Anbieter natürlich auch auf die übliche Weise koppeln, z. B. mit einem Gerät, das die schlüsselbasierte Kopplung von „Schnelles Pairing“ nicht unterstützt.
Fall 2: Der vorinstallierte Schlüssel ist einer der Kontoschlüssel.
- Der Provider befindet sich normalerweise nicht im Kopplungsmodus. Dies ist jedoch keine Voraussetzung. Der Anbieter sollte die Verwendung eines Kontoschlüssels auch im Kopplungsmodus unterstützen.
- Der Suchende und der Anbieter bestätigen jeweils, dass der andere den Kontoschlüssel besitzt.
Da sich beide Fälle nur darin unterscheiden, welcher vorinstallierte Schlüssel verwendet wird, werden sie in Verfahren zusammengefasst.
Datenformat
Informationen zur Verwendung der einzelnen Formate finden Sie in der Anleitung.
| Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
|---|---|---|---|---|
| 0–15 | uint128 |
Verschlüsselte Anfrage | variiert | Obligatorisch |
| 16–79 | Öffentlicher Schlüssel | variiert | Optional |
Tabelle 1.1:Verschlüsselte Anfrage, die vom Seeker in das Merkmal geschrieben wird.
| Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
|---|---|---|---|---|
| 0 | uint8 |
Mitteilungsart | 0x00 = Schlüsselbasierte Anfrage zur Kopplung |
Obligatorisch |
| 1 | uint8 |
Flags
|
variiert | Obligatorisch |
| 2–7 | uint48 |
Entweder:
|
variiert | Obligatorisch |
| 8–13 | uint48 |
BR/EDR-Adresse des Suchenden | variiert | Nur präsentieren, wenn Bit 1 oder 3 der Flags festgelegt ist |
| n – 15 | Zufälliger Wert (Salt) | variiert | Obligatorisch |
Tabelle 1.2.1: Rohe Anfrage (Typ 0x00). Entschlüsselt aus der verschlüsselten Anfrage in Tabelle 1.1.
| Oktett | Datentyp | Beschreibung | Wert | Obligatorisch? |
|---|---|---|---|---|
| 0 | uint8 |
Mitteilungsart | 0x10 = Aktionsanfrage |
Obligatorisch |
| 1 | uint8 |
Flags
|
variiert | Obligatorisch |
| 2–7 | uint48 |
Entweder:
|
variiert | Obligatorisch |
| 8 | uint8 |
Nachricht an die Gruppe schicken | variiert | Erforderlich, wenn Flags Bit 0 festgelegt ist |
| 9 | uint8 |
Nachrichtencode | variiert | Erforderlich, wenn Flags Bit 0 festgelegt ist |
| 10 | uint8 |
Abhängig von Flags:
|
variiert | Erforderlich, wenn Flags-Bit 0 oder 1 festgelegt ist |
| 11 – n | Zusätzliche Daten | variiert | Optional | |
| n – 15 | Zufälliger Wert (Salt) | variiert | Obligatorisch |
Tabelle 1.2.2:Rohdatenanfrage (Typ 0x10). Entschlüsselt aus der verschlüsselten Anfrage in Tabelle 1.1.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 |
Mitteilungsart | 0x01 = Antwort auf schlüsselbasierte Kopplung |
| 1–6 | uint48 |
Öffentliche (BR/EDR-)Adresse des Anbieters | variiert |
| 7–15 | Zufälliger Wert (Salt) | variiert |
Tabelle 1.3:Rohantwort. Verschlüsselt, 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 während des schlüsselbasierten Pairing 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 „Schlüsselbasierte Kopplung“.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 |
Mitteilungsart | Eine der Folgenden:
|
| 1–3 | unit32 |
6‑stelliger Passkey | variiert |
| 4–15 | Zufälliger Wert (Salt) | variiert |
Tabelle 2.2: Rohblock für Passkeys. Entschlüsselte Version von Tabelle 2.1.
Merkmal: Kontoschlüssel
Nach dem schnellen Pairing schreibt der Fast Pair Seeker einen Kontoschlüssel in den Fast Pair Provider.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0–15 | uint128 |
Kontoschlüssel (verschlüsselt) | variiert |
Wenn der Schnelles Pairing-Anbieter eine Schreibanfrage erhält, muss er Folgendes tun:
- Entschlüsseln Sie den Kontoschlüssel mit dem gemeinsamen Secret, das in Schritt 4 des Verfahrens generiert wurde.
- Für Dienstleister, die eine Kautionsversicherung benötigen (häufig):
- Prüfen Sie vor dem Entschlüsseln, ob das gemeinsame Secret zum Entschlüsseln der Passkey-Anfrage aus Schritt 12 verwendet wurde. Wenn dieser Schritt mit diesem Secret nicht erfolgreich war, ignorieren Sie diesen Schreibvorgang und beenden Sie den Vorgang.
- An diesem Punkt wird das gemeinsame Secret (K im Verfahren) für diese Kopplung nicht mehr verwendet. Alle Anfragen, die mit diesem Schlüssel verschlüsselt sind, sollten abgelehnt werden, ohne dass das Verfahren neu gestartet wird.
- Für Dienstleister, die eine Kautionsversicherung benötigen (häufig):
- Prüfen Sie, ob der entschlüsselte Wert mit
0x04oder0xFFbeginnt. Wenn nicht, ignoriere diesen Schreibvorgang und beende den Vorgang.- Wenn der Wert
0x04ist:- Prüfen Sie, ob in der persistenten Kontoschlüsselliste Platz für den neuen Wert ist.
- Wenn nicht, löschen Sie den Wert, der am längsten nicht verwendet wurde, aus der Liste.
- Fügen Sie den neuen Wert der Liste hinzu.
- Wenn der Wert
0xFFist:- Behandle dies als temporäre Kopplungssitzung und führe keinen Vorgang aus.
- Das kann beim Ablauf Kontoschlüssel rückwirkend schreiben passieren.
- Speichern Sie den Schlüssel nicht und verwenden Sie ihn nicht in der Kontoschlüsselliste, bei der Verschlüsselung oder bei MAC-Berechnungen.
- Das Entfernen der Bindung wird durch ein funktionsspezifisches Ereignis oder eine Zeitüberschreitung ausgelöst. Für die LE-Audiofreigabe wird dringend empfohlen, die BLE-Bindung und den Verknüpfungsschlüssel 10 Minuten nach dem Trennen der temporären Sitzung zu entfernen.
- Wenn der Wert
Kontoschlüssel in der Liste werden während der schlüsselbasierten Kopplung verwendet.
Merkmal: Firmware-Version
So kann der Seeker die Firmware-Revision des Providers nach Bedarf lesen. Es sollten immer die folgenden Daten zurückgegeben werden:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 – var | utf8s |
Firmware-Revisionscode | variiert |
Sie sollte in einem einzelnen UTF-8-String gekapselt sein, auch wenn es mehr als eine Firmware (z. B. 3 Firmwares für den linken Kopfhörer, den rechten Kopfhörer und das Case) auf dem Anbieter gibt. Der Anbieter kann auch die spezifischen Strings für Sonderfälle zurückgeben:
status-updating: wenn der Anbieter gerade auf eine neue Firmware aktualisiert wird. Alternativ kann der Anbieter die Version der bereitgestellten Firmware zurückgeben.
status-abnormal: wenn der Anbieter in einem abnormalen Zustand ist. Das Gerät hat beispielsweise nicht richtig funktioniert, weil das Firmware-Update fehlgeschlagen ist. Dieser Wert bewirkt, dass dem Nutzer eine Meldung angezeigt wird, dass der Seeker jetzt aktualisiert werden muss.
Der Anbieter sollte den Zugriff auf das Merkmal „Firmware Revision“ einschränken, um das Tracking von Geräten zu verhindern. Vorgeschlagene Einschränkungen:
- Verbundene Geräte sollten jederzeit Zugriff haben
- jedes Gerät sollte Zugriff haben, wenn der Anbieter sichtbar ist
Wenn der Anbieter Find Hub unterstützt, ist eine zusätzliche Implementierung erforderlich. Weitere Informationen finden Sie unter Firmware-Updates für „Mein Gerät finden“.
Merkmal: Zusätzliche Daten
Dieser Dienst muss die folgende Eigenschaft haben.
| Merkmal des Fast Pair Service | Verschlüsselt | Berechtigungen | UUID |
|---|---|---|---|
| Daten | Nein | Schreiben und benachrichtigen | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Altes Merkmal des Dienstes „Schnelles Pairing“ (wird am 01.01.2021 eingestellt) | Verschlüsselt | Berechtigungen | UUID |
|---|---|---|---|
| Daten | Nein | Schreiben und benachrichtigen | 0x1237 |
Bevor du in dieses Merkmal schreibst oder darüber benachrichtigst, muss ein Handshake über das Merkmal FE2C1234-8366-4814-8EB0-01DE32100BEA erfolgen, um ein gemeinsames Secret zu erhalten. AES-CTR wird verwendet, um Daten zu verschlüsseln, die über dieses Merkmal übertragen werden. Der Algorithmus ist unten definiert. Dieser Modus ist sicherer für Daten, die über einen einzelnen 16-Byte-Block hinausgehen. Zur Gewährleistung der Datenintegrität wird HMAC-SHA256 verwendet, was ebenfalls unten definiert ist.
| Oktett | Beschreibung | Wert |
|---|---|---|
| 0–7 | Die ersten 8 Byte von HMAC-SHA256. | variiert |
| 8–15 | Nonce, die von der AES-CTR-Verschlüsselung verwendet wird. | variiert |
| 16 – var | Verschlüsselte Daten. | variiert |
Tabelle 3.1: Datenpaket, das vom Anbieter über eine Benachrichtigung an den Suchenden oder vom Suchenden über einen Schreibvorgang an den Anbieter gesendet wird.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 – var | byte array |
Daten | variiert, decodieren Sie sie gemäß der Daten-ID in Tabelle 1.2.2:
|
Tabelle 3.2:Rohdaten. Entschlüsselt aus den verschlüsselten Daten in Tabelle 3.1.
Wenn eine Benachrichtigung angefordert wird (z.B. Anforderung eines personalisierten Namens über Bit 2 in Tabelle 1.2.1), muss der Schnelles Pairing-Anbieter Folgendes tun:
- Generieren Sie kryptografisch zufällige 8 Byte für die 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 bei data[i * 16] beginnt. Der letzte Block kann kleiner als 16 Byte sein.
Führen Sie „concat(encryptedBlock[0], encryptedBlock[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 durch concat(shared_secret, 48-byte ZEROs) generiert. Das shared_secret stammt aus Schritt 4 des Verfahrens.
- opad ist ein äußeres Padding von 64 Byte, das aus wiederholten Byte mit dem Wert
0x5Cbesteht. - ipad ist ein 64-Byte-Inner-Padding, das aus wiederholten Bytes mit dem Wert
0x36besteht.
Nehmen Sie die ersten 8 Byte aus dem HMAC-SHA256 als Präfix des Datenpakets.
Wenn der Schnelles Pairing-Anbieter eine Schreibanfrage erhält, muss er Folgendes tun:
- Prüfen Sie die Integrität der Daten, indem Sie die ersten 8 Byte von HMAC-SHA256 untersuchen.
Entschlüsseln Sie die verschlüsselten Daten mit AES-CTR, wobei jeder Block mit
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))Bitte wo?
- encryptedBlock[i] ist ein 16‑Byte-Block, der mit encrypted_data[i * 16] beginnt. Der letzte Block kann weniger als 16 Bytes umfassen.
- Der AES-Schlüssel wird aus dem Handshake generiert oder identifiziert, z.B.
- Im Namensfluss 1 stammt er von ECDH und wird für diese Kopplung nicht noch einmal verwendet. Alle Anfragen, die mit diesem Schlüssel verschlüsselt eingehen, ohne dass das Verfahren neu gestartet wurde, sollten abgelehnt werden.
- In Benennungsablauf 2 ist es der Kontoschlüssel.
Führen Sie concat(clearBlock[0], clearBlock[1],...) aus, um die Rohdaten zu erstellen.