Indicatore pubblicità del fornitore
Pubblicità: quando rilevabile
Quando il dispositivo del fornitore è rilevabile BR/EDR (ovvero in modalità di accoppiamento), deve pubblicizzare i dati dell'ID modello di accoppiamento rapido tramite BLE e l'indirizzo BLE non deve essere ruotato.
Intervallo di pubblicità: quando è rilevabile
L'intervallo tra gli annunci non deve superare 100 ms (10 Hz). Una frequenza elevata consente al cercatore di trovare rapidamente il fornitore, anche durante la scansione in modalità a basso consumo.
Payload della pubblicità: dati ID modello di accoppiamento rapido
L'annuncio deve contenere il tipo di dati Dati di servizio, ivi incluso, § 1.11. L'UUID deve essere l'UUID del servizio di accoppiamento rapido di 0xFE2C
. I dati di servizio devono contenere quanto segue:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0-2 | uint24 |
ID modello a 24 bit | varia |
Pubblicità: quando non è rilevabile
Quando non è rilevabile (ovvero non è in modalità di accoppiamento), il dispositivo del fornitore deve pubblicizzare i dati dell'account per l'accoppiamento rapido, utilizzando le seguenti linee guida.
La pubblicità dei dati dell'account consente ai Cercatori nelle vicinanze di riconoscere quando un fornitore appartiene al loro account e di avviare l'accoppiamento senza dover prima forzare il fornitore a tornare in modalità di accoppiamento, che è una causa comune dei reclami degli utenti. I cercatori daranno la possibilità agli utenti di ignorare questa trasmissione nel caso in cui non aspettino di accoppiarsi con il fornitore o se la trasmissione non è pertinente (ad esempio, se hanno già eseguito l'accoppiamento). I ricercatori filtreranno automaticamente anche le trasmissioni chiaramente errate, ad esempio quando i dati dell'account sono configurati in modo errato.
Intervallo di pubblicità: quando non è rilevabile
L'intervallo tra gli annunci deve essere al massimo di 250 ms (4 Hz).
Payload pubblicitario: dati dell'account per l'accoppiamento rapido
L'annuncio deve contenere il tipo di dati Dati di servizio, Ibid., § 1.11. L'UUID deve essere l'UUID del servizio di accoppiamento rapido di 0xFE2C
. I dati di servizio devono contenere quanto segue:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Versione e flag 0bVVVVFFFF
|
0x00 (riservato per un uso futuro) |
1 - varia | Dati della chiave dell'account | varia |
I dati della chiave dell'account contengono:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0bLLLL0000
|
1 - s | Filtro chiavi account | varia | |
s + 1 | uint8 |
Lunghezza e tipo di campo 0bLLLLTTTT
|
0b00100001
|
s + 2 - s + 3 | uint16 |
Salt | varia |
Filtro chiavi account
Il filtro della chiave dell'account pubblicizzata consente a un cercatore di verificare rapidamente se un fornitore potrebbe possedere una determinata chiave dell'account (con una bassa probabilità di falsi positivi, in media molto inferiore allo 0,5%), prima di ulteriori interazioni. Il buscador potrebbe connettersi automaticamente e tentare di avviare la procedura quando rileva un filtro trasmesso con tipo 0, ovvero che mostra l'indicazione dell'interfaccia utente, che potenzialmente contiene una delle chiavi del suo account, in modo da ridurre ulteriormente il tasso di falsi positivi. In alcuni casi, il fornitore potrebbe voler essere riconosciuto dal cercatore anche se non è pronto per l'accoppiamento. Un esempio è che quando gli auricolari vengono rimessi nella custodia, vogliamo interrompere la visualizzazione della notifica di accoppiamento successiva poiché l'accoppiamento potrebbe essere rifiutato dall'auricolare.
Il filtro delle chiavi dell'account è un filtro Bloom di lunghezza variabile costituito come segue:
- Sia n il numero di chiavi dell'account (n >= 1) nell'elenco Chiave account persistente.
- Sia s, le dimensioni del filtro in byte, pari a (1,2*n + 3) troncato. Ad esempio, se una chiave è persistente, s = 4 byte.
uint8_t s = (((uint8_t)(( float )1.2 * n)) + 3);
- Inizializza il filtro F come un array di s byte, ciascuno impostato su 0.
uint8_t F[s] = {0};
Per ogni chiave dell'account K nell'elenco delle chiavi dell'account persistente:
a. Sia V = 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. Esegui l'hash di V utilizzando SHA256, ottenendo un valore di 32 byte H = {H0, …, H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Dividi H in otto numeri interi non firmati di 4 byte in big endian, X = {X0, …, X7}, dove 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. Per ogni Xi:
i. Sia M Xi modulo il numero di bit nel filtro, (s * 8).
ii. Recupera il byte in F all'indice (M / 8), arrotondato per difetto.
iii. All'interno del byte, imposta il bit all'indice (M % 8) su 1.
iv. In altre parole:// 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)); }
Includi il filtro F come campo Filtro chiave account nei dati pubblicitari. Tieni presente che questo valore non ha un "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
Salina
Il sale è un valore casuale che viene aggiunto alle chiavi dell'account durante la creazione del filtro Bloom. Questo sale deve essere rigenerato ogni volta che l'RPA viene aggiornato per il fornitore per evitare il monitoraggio durante la rotazione degli indirizzi.
Per generare il filtro della chiave dell'account utilizzando il sale:
- Genera un S di 2 byte casuale. Tieni presente che questo valore non ha un "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
- Utilizza S di 2 byte come il sale.
- Nei dati dell'account di accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Filtro chiave account e S nel campo Sale.