Indicatore pubblicitario del fornitore
Pubblicità: se rilevabile
Quando il dispositivo del Fornitore è rilevabile tramite BR/EDR (ovvero, in modalità di accoppiamento), pubblicherà i dati ID modello di accoppiamento rapido tramite BLE e l'indirizzo BLE non deve essere ruotato.
Intervallo pubblicità: se rilevabile
L'intervallo tra gli annunci non deve essere superiore a 100 ms (10 Hz). Una velocità elevata consente a Ricercatore di trovare rapidamente il provider, anche durante la scansione in modalità a basso consumo.
Payload pubblicità: dati ID modello ad accoppiamento rapido
L'annuncio conterrà il tipo di dati dei dati di servizio, ibid., § 1.11. L'UUID sarà l'UUID del servizio ad accoppiamento rapido di 0xFE2C
. I dati dei servizi dovranno contenere quanto segue:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0-2 | uint24 |
ID modello a 24 bit | varia |
Pubblicità: quando non rilevabili
Quando non è rilevabile (ovvero non in modalità di accoppiamento), il dispositivo del Fornitore pubblicizzerà i Dati dell'account ad accoppiamento rapido secondo le seguenti linee guida.
Pubblicizzare i dati dell'account consente ai Ricercatori nelle vicinanze di riconoscere quando un fornitore appartiene al loro account e avviare l'accoppiamento senza dover prima forzare il fornitore a tornare alla modalità di accoppiamento, una causa comune dei reclami da parte dell'utente. Gli utenti che eseguono ricerche offriranno agli utenti l'opportunità di ignorare la trasmissione nel caso in cui non attendano per l'accoppiamento con il provider o la trasmissione non sia pertinente (ad esempio, se l'utente è già stato accoppiato). Gli utenti che eseguono ricerche filtrano automaticamente anche le trasmissioni ovviamente di scarsa qualità, ad esempio quando i dati dell'account sono configurati in modo errato.
Intervallo pubblicità: se non rilevabile
L'intervallo tra gli annunci deve essere al massimo di 250 ms (4 Hz).
Payload pubblicità: accoppiamento rapido dei dati dell'account
L'annuncio conterrà il tipo di dati dei dati di servizio, Ibid., § 1.11. L'UUID sarà l'UUID del servizio ad accoppiamento rapido di 0xFE2C
. I dati dei servizi dovranno contenere quanto segue:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Versione e flag 0bVVVVFFFF
|
0x00 (prenotato per uso futuro) |
1 - varia | Dati chiave dell'account | varia o 0x00 se l'elenco delle chiavi dell'account è vuoto |
I dati chiave dell'account contengono:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Lunghezza e tipo del campo 0bLLLLTTTT
|
0bLLLL0000
|
1 - sec | Filtro chiave account | varia | |
S + 1 | uint8 |
Lunghezza e tipo del campo 0bLLLLTTTT
|
0b00100001
|
S + 2 - S + 3 | uint16 |
Salt | varia |
Filtro chiave account
Il filtro chiave dell'account pubblicizzato consente a un richiedente di verificare rapidamente se un provider potrebbe possedere una determinata chiave di account (con una bassa probabilità di falsi positivi, in media molto inferiore allo 0,5%), prima di ulteriori interazioni. Il Cercatore può connettersi automaticamente e tentare di avviare la procedura quando rileva un filtro di tipo 0, ovvero mostra un'indicazione nell'interfaccia utente, che potenzialmente contiene una delle sue chiavi dell'account, in modo da ridurre ulteriormente la percentuale di falsi positivi. In alcune situazioni, il Fornitore potrebbe voler essere riconosciuto dal Ricercatore anche se non è pronto per l'accoppiamento. Ad esempio, quando gli auricolari vengono rimessi nella custodia, vogliamo interrompere la visualizzazione della successiva notifica di accoppiamento poiché l'accoppiamento potrebbe essere rifiutato dalle cuffie.
Il filtro chiavi account è un filtro Bloom a lunghezza variabile creato nel seguente modo:
- Specifica n il numero di chiavi dell'account (n >= 1) nell'elenco chiavi dell'account persistente.
- Lascia che s, la dimensione del filtro in byte, sia (1,2*n + 3) troncata. 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'hashing di V utilizzando SHA256, ottenendo un valore a 32 byte H = {H0, ..., H31}.
uint8_t H[32] = {0}; SHA256_hash_function(V, H);
c. Dividi H in otto numeri interi senza segno 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. Lascia che M sia Xi modulo il numero di bit nel filtro, (s * 8).
ii. Ottieni 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 nel campo Filtro chiave account nei dati pubblicitari. Tieni presente che questo valore non ha "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
Campo di sale
Il sale è un valore casuale che viene aggiunto alle chiavi degli account durante la creazione del filtro Bloom. Questo sale deve essere rigenerato ogni volta che l'RPA viene aggiornato per il provider per evitare il monitoraggio durante la rotazione degli indirizzi.
Per generare il filtro per le chiavi dell'account utilizzando il sale:
- Genera una S a 2 byte casuale. Tieni presente che questo valore non ha "endianness", poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
- Usa la S a 2 byte come sale.
- Nei dati dell'account ad accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Filtro chiave account e S nel campo Sale.