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
|
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
|
0bLLLL0000
|
1–s | Filtr klucza konta | zależy | |
S + 1 | uint8 |
Długość i typ pola 0bLLLLTTTT
|
0b00100001
|
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:
- Niech n będzie liczbą kluczy konta (n >= 1) na stałej liście kluczy konta.
- 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);
- Zainicjuj filtr F jako tablicę z s bajtami, każdy z wartością 0.
uint8_t F[s] = {0};
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:
- 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.
- Użyj dwubajtowego ciągu S jako soli.
- W danych konta Szybkiego parowania dodaj wygenerowany filtr w polu Filtr klucza konta, a w polu Sól wpisz S.