Nachrichtenauthentifizierungscode
Nachrichtenstreams werden verwendet, um die Audio-Umschaltung zu konfigurieren. Weitere Informationen finden Sie unter Nachrichten zur Audio-Umschaltung. Bei diesen wichtigen Konfigurationen muss der Anbieter dafür sorgen, dass die Nachricht von GMSCore (Fast Pair-Modul) und nicht von einer anderen App auf dem Seeker gesendet wird.
MAC (Message Authentication Code) generieren
FP Seeker fügt für Gerätekonfigurationsnachrichten einen Message Authentication Code (MAC) mit HMAC-SHA256 hinzu. Der MAC der Nachricht besteht aus den ersten 8 Byte von:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
Bitte wo?
- K wird durch concat(Kontoschlüssel, 48 Byte mit Nullen) generiert.
- message sind die zusätzlichen Daten des Nachrichtenstreams.
- nonce wird durch concat(session_nonce, message_nonce) generiert. „session nonce“ und „message nonce“ werden im folgenden Abschnitt definiert.
- opad besteht aus 64 Byte äußerer Auffüllung, die aus wiederholten Byte mit dem Wert
0x5Cbestehen. - ipad ist ein 64 Byte umfassendes inneres Padding, das aus wiederholten Bytes mit dem Wert
0x36besteht.
Sitzungs-Nonce und Nachrichten-Nonce
Um einen Replay-Angriff zu verhindern, muss der Anbieter dafür sorgen, dass eine Nonce nicht wiederholt wird. Da die Aufrechterhaltung der Uhr- oder Zählersynchronisierung sowohl beim Anbieter als auch beim Suchenden nicht einfach ist, generiert der Anbieter die Sitzungs-Nonce (pro Verbindung), die während der Verbindung für alle Nachrichten freigegeben wird, während der Suchende die Nachrichten-Nonce (pro Nachricht) generiert, die für jede Nachricht zufällig generiert wird. Die Nonce zum Generieren des MAC jeder Nachricht ist die Kombination aus Sitzungs-Nonce und Nachrichten-Nonce, d.h. concat(session_nonce, message_nonce).
Wir fügen der Ereignisgruppe „Geräteinformationen“ eine Sitzungs-Nonce hinzu:
| Name der Nachrichtengruppe | Wert |
|---|---|
| Geräteinformationen | 0x03 |
| Codename der Nachricht | Wert |
|---|---|
| Sitzungs-Nonce | 0x0A |
Die Sitzungs-Nonce sollte generiert und an den Seeker gesendet werden, wenn Message Stream eine Verbindung herstellt:
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 | Geräteinformationen | 0x03 |
| 1 | uint8 | Sitzungs-Nonce | 0x0A |
| 2–3 | uint16 | Zusätzliche Datenlänge | 0x0008 |
| 4 – 11 | Sitzungs-Nonce | variiert |
Wenn eine MAC erforderlich ist, sendet der Suchende zusammen mit der Nachricht eine Message-Nonce und die MAC.
| Oktett | Datentyp | Beschreibung | Wert |
|---|---|---|---|
| 0 | uint8 | Nachrichtengruppe | variiert |
| 1 | uint8 | Nachrichtencode | variiert |
| 2–3 | uint16 | Zusätzliche Datenlänge(die zusätzliche Datenlänge + 16) | variiert |
| 4 – n | Zusätzliche Daten | variiert | |
| n + 1 – n + 8 | Nachricht-Nonce | variiert | |
| n + 9 – n + 16 | Nachrichtenauthentifizierungscode | variiert |
MAC (Message Authentication Code) prüfen
Nachdem der Anbieter eine Nachricht mit dem Nachrichtenauthentifizierungscode empfangen hat, muss er ihn mit derselben Funktion wie der Generierungsfunktion überprüfen. Das heißt, der empfangene MAC sollte den ersten 8 Byte von
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
Dabei gilt:
- K wird von
concat(account key, 48-byte ZEROs)generiert und der Bereitsteller muss alle gespeicherten Kontoschlüssel durchlaufen, um den Nachrichtenauthentifizierungscode zu überprüfen. - message sind die zusätzlichen Daten (ohne Message-Nonce und MAC) des Message-Streams.
Wenn die MAC korrekt ist, muss der Anbieter der Anweisung in der Nachricht folgen. Andernfalls sendet der Anbieter ein NAK mit dem Fehlergrund 0x3 – „not allowed due to incorrect message authentication code“ (nicht zulässig aufgrund eines falschen Message Authentication Code).