Indicatore pubblicità del fornitore

Pubblicità: quando rilevabile

Quando il dispositivo del provider è rilevabile BR/EDR (ovvero in modalità di accoppiamento), annuncia i Dati ID modello ad accoppiamento rapido tramite BLE e l'indirizzo BLE non ruotato.

Intervallo pubblicitario: quando rilevabile

L'intervallo tra gli annunci non deve essere superiore a 100 ms (10 Hz). R la velocità veloce consente al ricercatore di trovare rapidamente il provider, anche durante la scansione modalità a basso consumo.

Payload pubblicità: dati ID modello ad accoppiamento rapido

L'annuncio deve contenere il tipo di dati dei Dati di servizio, ibid., § 1.11. La L'UUID sarà l'UUID del servizio di accoppiamento rapido di 0xFE2C. I dati del servizio devono contengono 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 con accoppiamento rapido, utilizzando le seguenti linee guida.

La pubblicità dei dati dell'account consente agli utenti nelle vicinanze di riconoscere quando un fornitore appartiene al proprio account e avvia l'accoppiamento senza dover forzare il provider di servizi di telefonia mobile di nuovo in modalità di accoppiamento, una causa comune reclamo. I ricercatori offriranno agli utenti l'opportunità di ignorare questa trasmissione nel caso in cui non si aspettino l'accoppiamento con il provider la trasmissione non è pertinente (ad esempio, se sono già stati accoppiati). Chi cerca i partecipanti filtrerà automaticamente anche le trasmissioni palesemente di scarsa qualità, come quando i dati dell'account non sono configurati correttamente.

Intervallo pubblicitario: quando non rilevabile

L'intervallo tra gli annunci deve essere al massimo di 250 ms (4 Hz).

Payload pubblicità: dati degli account ad accoppiamento rapido

L'annuncio deve contenere il tipo di dati dei dati di servizio: Ibid., § 1.11. La L'UUID sarà l'UUID del servizio di accoppiamento rapido di 0xFE2C. I dati del servizio devono contengono 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 relativi alla chiave dell'account contengono:

Ottetto Tipo di dati Descrizione Valore
0 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza del filtro della chiave dell'account in byte
  • T = tipo
0bLLLL0000
  • lunghezza = 0bLLLL = varia
  • tipo = 0b0000 (mostra indicazione UI) o 0b0010 (nascondi indicazione UI), Filtro chiave account
1 - s Filtro chiave account varia
S + 1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza in byte
  • T = tipo
0b00100001
  • lunghezza = 0b0010 = 2
  • tipo = 0b0001, Salt
S + 2 - S + 3 uint16 Salt varia

Filtro chiave account

Il filtro chiave account pubblicizzato consente a un ricercatore di verificare rapidamente se Il fornitore potrebbe possedere una determinata chiave dell'account (con un basso numero di falsi positivi probabilità, in media molto meno dello 0,5%), prima di ulteriori interazioni. La Il dispositivo di ricerca potrebbe connettersi automaticamente e tentare di avviare la procedura quando vede un filtro che viene trasmesso con tipo 0, ovvero che mostra un'indicazione UI, contiene potenzialmente una delle chiavi del proprio account, in modo da ridurre il tasso di positivi ulteriormente. In alcune situazioni, è possibile che il Fornitore voglia essere riconosciuto dal ricercatore quando non è pronto per l'accoppiamento. Ad esempio, quando vengono posizionati gli auricolari di nuovo, vogliamo interrompere la visualizzazione della successiva notifica di accoppiamento poiché l'accoppiamento potrebbe essere rifiutato dalle cuffie.

Il filtro per chiave dell'account è un filtro a lunghezza variabile Filtro Bloom creato come che segue:

  1. Sia n il numero di chiavi dell'account (n >= 1) nel Elenco delle chiavi dell'account.
  2. Sia s, che corrisponde alla dimensione del filtro in byte, troncata (1,2*n + 3). Per 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. Usa l'hash V con 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 senza segno a 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. Ottieni il byte in F all'indice (M / 8), arrotondato per difetto.
    iii. All'interno del byte, imposta il bit nell'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));
        }
    

Nei dati pubblicitari, includi il filtro F come campo Filtro chiave account. Non esiste una "endianness" a questo valore, poiché non c'è più o meno byte significativi: non modificare l'ordine dei byte.

Campo di sale

Il sale è un valore casuale che viene aggiunto alle chiavi dell'account durante la creazione filtro Bloom. Questo sale deve essere rigenerato ogni volta che viene aggiornato l'RPA al provider per evitare il tracciamento attraverso la rotazione degli indirizzi.

Per generare il filtro della chiave dell'account utilizzando il sale:

  1. Genera una classe S casuale a 2 byte. Non esiste una "endianness" a questo dato che non c'è un byte più o meno significativo, non modificare il byte ordine.
  2. Usa la S da 2 byte come Salt.
  3. Nei dati dell'account per l'accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Filtro chiave account e S nel campo Salt.