Sygnał reklamowy dostawcy

Reklamy: łatwo dostępne

Jeśli urządzenie dostawcy jest wykrywalne w przypadku BR/EDR (czyli w trybie parowania), będzie rozgłaszać dane identyfikatora modelu szybkiego parowania w BLE, a adres BLE nie powinien być zmieniany.

Interwał reklamowy: reklama możliwa do znalezienia

Odstęp między reklamami nie powinien być dłuższy niż 100 ms (10 Hz). Wysoka szybkość umożliwia wyszukiwanie szybko znaleźć dostawcę, nawet podczas skanowania w trybie małego zużycia energii.

Ładunek reklamowy: dane identyfikatora modelu szybkiego parowania

Reklama powinna zawierać typ danych usługi, ibid., § 1.11. Identyfikator UUID będzie identyfikatorem UUID usługi szybkiego parowania 0xFE2C. Dane usługi będą zawierać:

Oktet Typ danych Opis Wartość
0–2 uint24 24-bitowy identyfikator modelu zależy

Reklamy: gdy nie można jej znaleźć

Jeśli urządzenie nie jest wykrywalne (czyli nie jest w trybie parowania), będzie reklamować dane konta Szybkie parowanie zgodnie z poniższymi wytycznymi.

Reklamowanie danych konta umożliwia użytkownikom w pobliżu rozpoznanie, że dostawca należy do jego konta, i rozpoczęcie parowania bez konieczności wymuszania jego ponownego włączenia w trybie parowania, co jest częstą przyczyną skarg użytkowników. Poszukiwacze umożliwiają użytkownikom zignorowanie tej transmisji, gdy nie czekają na sparowanie z dostawcą lub jeśli transmisja nie jest odpowiednia (na przykład została już sparowana). Poszukiwacze automatycznie odfiltrowują też ewidentnie niewłaściwe transmisje, na przykład gdy dane konta są nieprawidłowo skonfigurowane.

Interwał reklamowy: gdy nie można wykryć

Odstęp między reklamami nie powinien przekraczać 250 ms (4 Hz).

Ładunek reklamowy: dane konta w funkcji Szybkie parowanie

Reklama powinna zawierać typ danych usługi, Ibid., § 1.11. Identyfikator UUID będzie identyfikatorem UUID usługi szybkiego parowania 0xFE2C. Dane usługi będą zawierać:

Oktet Typ danych Opis Wartość
0 uint8 Wersja i flagi
0bVVVVFFFF
  • V = wersja
  • F = flagi
0x00
(zarezerwowany do użytku w przyszłości)
1 – różni się Dane klucza konta zależy
lub 0x00, jeśli lista kluczy konta jest pusta

Dane klucza konta zawierają:

Oktet Typ danych Opis Wartość
0 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość filtra klucza konta w bajtach
  • T = typ
0bLLLL0000
  • długość = 0bLLLL = różni się
  • type = 0b0000 (pokaż wskaźnik w interfejsie użytkownika) lub 0b0010 (ukrywanie oznaczenia interfejsu), filtr klucza konta
1–s Filtr klucza konta zależy
S + 1 uint8 Długość i typ pola
0bLLLLTTTT
  • L = długość w bajtach
  • T = typ
0b00100001
  • długość = 0b0010 = 2
  • typ = 0b0001, Sól
S + 2 - S + 3 uint16 Salt zależy

Filtr klucza konta

Reklamowany filtr klucza konta pozwala osobie przeglądającej szybko sprawdzić, czy dostawca może mieć określony klucz konta (o niskim prawdopodobieństwie fałszywie pozytywnych, średnio dużo mniejszy niż 0,5%), przed podjęciem dalszych interakcji. Gdy widz może automatycznie nawiązać połączenie i spróbować rozpocząć procedurę, gdy zauważy emitowany filtr typu 0, tzn. pokazuje wskaźnik interfejsu, który może zawierać jeden z kluczy konta, aby jeszcze bardziej zmniejszyć współczynnik wyników fałszywie pozytywnych. W niektórych sytuacjach dostawca może chcieć, aby był rozpoznawany przez osobę szukającą, ale nie był gotowy do sparowania. Przykładem może być to, że po przywróceniu słuchawek nie będziemy już pokazywać kolejnych powiadomień o parowaniu, bo zestaw słuchawkowy może je odrzucić.

Filtr klucza konta to filtr Bloom o zmiennej długości, skonstruowany w ten sposób:

  1. Niech n będzie liczbą kluczy konta (n >= 1) na stałej liście kluczy konta.
  2. Obcinaj (1,2*n + 3) rozmiar filtra s (w bajtach). Jeśli na przykład zachowany jest 1 klucz, s = 4 bajty.
    uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
  3. Zainicjuj filtr F jako tablicę z s bajtami, każdy z wartością 0.
    uint8_t F[s] = {0};
  4. Dla każdego klucza konta K na stałej liście kluczy konta:
    a. Niech V będzie concat(K, Salt).

    // In the sample code, the size of salt is 2 bytes.
    #define SALT_SIZE 2
    
    uint8_t V[FASTPAIR_ACCOUNT_KEY_SIZE + SALT_SIZE];
    for (uint8_t keyIndex = 0; keyIndex < n; keyIndex++)
      {
         // concat (K, Salt)
          fastpair_get_account_key_by_index(keyIndex, V);
    
          uint8_t randomSalt = (uint8_t)rand();
          V[FASTPAIR_ACCOUNT_KEY_SIZE] = randomSalt;
          ... }
    

    b. Zaszyfruj V z użyciem algorytmu SHA256, uzyskując 32-bajtową wartość H = {H0, ..., H31}.

    uint8_t H[32] = {0};
    SHA256_hash_function(V, H);
    

    c. Podziel H na osiem 4-bajtowych liczb całkowitych bez znaku w big-endian, X = {X0, ..., X7}, gdzie X0 = 0xH0H1H2H3.

         uint32_t X[8];
         for (index = 0; index < 8; index++)
         {
            X[index] = (((uint32_t)(H[index * 4])) << 24) |
                        (((uint32_t)(H[index * 4 + 1])) << 16) |
                        (((uint32_t)(H[index * 4 + 2])) << 8) |
                        (((uint32_t)(H[index * 4 + 3])) << 0);
         }
    

    d. Dla każdego Xi:
    i. Niech M będzie Xi zmodyfikować liczbę bitów w filtrze (s * 8).
    ii. Bajt z funkcji F w indeksie (M / 8) zostanie zaokrąglony w dół.
    iii. Jako bajt ustaw bit w indeksie (M % 8) na 1.
    iv. Innymi słowy:

        // M = Xi % (s * 8)
        // F[M/8] = F[M/8] | (1 << (M % 8))
        for (index = 0; index < 8; index++)
        {
            uint32_t M    = X[index] % (s * 8);
            F[M / 8] = F[M / 8] | (1 << (M % 8));
        }
    

Dodaj w danych reklamowych filtr F jako pole filtra klucza konta. Zwróć uwagę, że nie ma „endianness” tej wartości, ponieważ nie ma mniej lub większego bajta. Nie zmieniaj kolejności bajtów.

Pole soli

Ciąg zaburzający to wartość losowa, która jest dołączana do kluczy konta podczas tworzenia filtra kwiatów. Ten sól należy wygenerować ponownie po każdej aktualizacji RPA dla dostawcy, aby uniknąć śledzenia podczas rotacji adresów.

Aby wygenerować filtr klucza konta z zastosowaniem ciągu zaburzającego:

  1. Wygeneruj losowy 2-bajtowy S. Pamiętaj, że nie ma „endianness” tej wartości, ponieważ nie ma więcej ani mniej istotnego bajtu. Nie zmieniaj kolejności bajtów.
  2. Użyj dwubajtowego ciągu S jako soli.
  3. W danych konta Szybkiego parowania dodaj wygenerowany filtr w polu Filtr klucza konta, a w polu Sól wpisz S.