Kod uwierzytelniania wiadomości
Strumienie wiadomości służą do konfigurowania przełącznika dźwięku. Więcej informacji znajdziesz w artykule Wiadomości przełącznika dźwięku. W przypadku tych ważnych konfiguracji dostawca musi mieć pewność, że wiadomość jest wysyłana przez GMSCore (moduł szybkiego parowania), a nie przez inną aplikację na urządzeniu wyszukującym.
Generowanie kodu MAC (message authentication code)
FP Seeker dodaje kod uwierzytelniania wiadomości do wiadomości konfiguracyjnych urządzenia za pomocą algorytmu HMAC-SHA256. Kod MAC wiadomości składa się z pierwszych 8 bajtów:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
gdzie
- K jest generowany przez concat(klucz konta, 48-bajtowe zera).
- message to dodatkowe dane strumienia wiadomości.
- nonce jest generowany przez concat(session_nonce, message_nonce); session nonce i message nonce są zdefiniowane w następnej sekcji.
- opad to 64 bajty zewnętrznego dopełnienia składającego się z powtarzających się bajtów o wartości
0x5C. - ipad to 64 bajty wewnętrznego dopełnienia składającego się z powtarzających się bajtów o wartości
0x36.
Wartość nonce sesji i wartość nonce wiadomości
Aby zapobiec atakowi typu replay, dostawca musi zadbać o to, aby wartość nonce nie była powtarzana. Utrzymanie synchronizacji zegara lub licznika zarówno u dostawcy, jak i u użytkownika nie jest proste, dlatego dostawca generuje nonce sesji (dla każdego połączenia), który jest udostępniany we wszystkich wiadomościach podczas połączenia, a użytkownik generuje nonce wiadomości (dla każdej wiadomości), który jest losowo generowany dla każdej wiadomości. Wartość nonce do generowania kodu MAC każdej wiadomości to kombinacja wartości nonce sesji i wartości nonce wiadomości, czyli concat(session_nonce, message_nonce).
Do grupy zdarzeń Informacje o urządzeniu dodajemy nonce sesji:
| Nazwa grupy wiadomości | Wartość |
|---|---|
| Zdarzenie dotyczące informacji o urządzeniu | 0x03 |
| Nazwa kodu wiadomości | Wartość |
|---|---|
| Liczba jednorazowa sesji | 0x0A |
Wartość nonce sesji powinna zostać wygenerowana i wysłana do osoby poszukującej, gdy połączy się strumień wiadomości:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 | Zdarzenie dotyczące informacji o urządzeniu | 0x03 |
| 1 | uint8 | Liczba jednorazowa sesji | 0x0A |
| 2–3 | uint16 | Długość dodatkowych danych | 0x0008 |
| 4–11 | liczba jednorazowa sesji | różni się |
Aby wysłać wiadomość, gdy wymagany jest kod MAC, osoba wysyłająca wyśle nonce wiadomości i kod MAC wraz z wiadomością.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 | Grupa wiadomości | różni się |
| 1 | uint8 | Kod wiadomości | różni się |
| 2–3 | uint16 | Długość danych dodatkowych(długość danych dodatkowych + 16) | różni się |
| 4 - n | Dodatkowe dane | różni się | |
| n + 1 - n + 8 | Nonce wiadomości | różni się | |
| n + 9 - n + 16 | Kod uwierzytelniania wiadomości | różni się |
Weryfikowanie kodu MAC (message authentication code)
Po otrzymaniu wiadomości z kodem uwierzytelniania wiadomości dostawca weryfikuje go za pomocą tej samej funkcji co funkcja generująca. Oznacza to, że otrzymany kod MAC powinien być równy pierwszych 8 bajtów
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
gdzie:
- Wartość K jest generowana przez
concat(account key, 48-byte ZEROs), a dostawca musi przejrzeć wszystkie zapisane klucze konta, aby zweryfikować kod MAC. - message to dodatkowe dane (z wyłączeniem nonce wiadomości i MAC) ze strumienia wiadomości.
Jeśli kod MAC jest prawidłowy, dostawca postępuje zgodnie z instrukcjami zawartymi w wiadomości. W przeciwnym razie dostawca wysyła komunikat NAK z kodem błędu 0x3 – niedozwolone z powodu nieprawidłowego kodu uwierzytelniania wiadomości.