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
  • V = versione
  • F = flag
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
  • L = lunghezza in byte del filtro della chiave dell'account
  • T = tipo
0bLLLL0000
  • lunghezza = 0bLLLL = varia
  • type = 0b0000 (mostra indicazione UI) o 0b0010 (nascondi indicazione UI), filtro chiavi account
1 - sec Filtro chiave account varia
S + 1 uint8 Lunghezza e tipo del campo
0bLLLLTTTT
  • L = lunghezza in byte
  • T = tipo
0b00100001
  • lunghezza = 0b0010 = 2
  • type = 0b0001, Sali
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:

  1. Specifica n il numero di chiavi dell'account (n >= 1) nell'elenco chiavi dell'account persistente.
  2. 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);
  3. Inizializza il filtro F come un array di s byte, ciascuno impostato su 0.
    uint8_t F[s] = {0};
  4. 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:

  1. 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.
  2. Usa la S a 2 byte come sale.
  3. Nei dati dell'account ad accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Filtro chiave account e S nel campo Sale.