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

  1. K jest generowany przez concat(klucz konta, 48-bajtowe zera).
  2. message to dodatkowe dane strumienia wiadomości.
  3. nonce jest generowany przez concat(session_nonce, message_nonce); session nonce i message nonce są zdefiniowane w następnej sekcji.
  4. opad to 64 bajty zewnętrznego dopełnienia składającego się z powtarzających się bajtów o wartości 0x5C.
  5. 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:

  1. Wartość K jest generowana przez concat(account key, 48-byte ZEROs), a dostawca musi przejrzeć wszystkie zapisane klucze konta, aby zweryfikować kod MAC.
  2. 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.