Indicatore di annuncio del provider

Annuncio: quando è rilevabile

Quando il dispositivo Provider è rilevabile tramite BR/EDR (ovvero in modalità di accoppiamento), deve trasmettere i dati dell'ID modello di accoppiamento rapido tramite BLE e l'indirizzo BLE non deve essere ruotato.

Intervallo di annuncio: quando rilevabile

L'intervallo tra gli annunci non deve essere superiore a 100 ms (10 Hz). Una frequenza elevata consente al Seeker di trovare rapidamente il Provider, anche durante la scansione in modalità a basso consumo.

Payload pubblicitario: dati dell'ID modello di accoppiamento rapido

L'annuncio deve contenere il tipo di dati Service Data, 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-2 uint24 ID modello a 24 bit varies

Payload di annuncio di condivisione audio LE: dati dell'ID modello di accoppiamento rapido e mappa delle funzionalità di accoppiamento rapido

I dati di servizio devono contenere quanto segue:

Ottetto Tipo di dati Descrizione Valore
0 uint8 Versione e flag
0bVVVVFFFF
  • V = versione
  • F = flag
0x00
1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza dell'ID modello in byte
  • T = tipo
0bLLLL0111
  • length = 0bLLLL = varies
  • type = 0b0111, ID modello
2 - s ID modello varies
s + 1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza in byte
  • T = tipo
0bLLLL1000
s + 2 uint8 Mappa delle funzionalità di FP varies
Mappa delle funzionalità di FP

La mappa delle funzionalità FP è una bitmap che rappresenta le funzionalità FP supportate dal provider. Il primo byte della bitmap è definito come segue:

Bitmap Descrizione
0bRRRRRRSO R - Bit riservato, verrà ignorato dal Seeker per il momento e deve essere impostato su 0.
S - Supporto della condivisione audio FP LE (impostato su 1 se abilitato, altrimenti su 0).
O - Bit Out of Box (OOB), impostato su 1 se il dispositivo è nuovo di fabbrica.

Se il provider supporta la specifica FP LE Audio Sharing (ovvero supporta l'accoppiamento temporaneo, il payload pubblicitario di LE Audio Sharing e la versione 2 del controllo Hearable), imposta il bit di supporto di FP LE Audio Sharing su 1; altrimenti, impostalo su 0.

Se il Provider non è stato accoppiato con alcun Seeker FP ed è nuovo di fabbrica (ovvero non sono presenti chiavi dell'account FP sul Provider), imposta il bit OOB su 1; in caso contrario, impostalo su 0.

Payload di pubblicità delle informazioni sul set coordinato: dati dell'ID modello di accoppiamento rapido e informazioni sul set coordinato di accoppiamento rapido

I dati di servizio devono contenere quanto segue:

Ottetto Tipo di dati Descrizione Valore
0 uint8 Versione e flag
0bVVVVFFFF
  • V = versione
  • F = flag
0x00
1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza dell'ID modello in byte
  • T = tipo
0bLLLL0111
  • length = 0bLLLL = varies
  • type = 0b0111, ID modello
2 - s ID modello varies
s + 1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza dei dati del set coordinato
  • T = tipo
0b01101011
  • length = 0b0110
  • type = 0b1011
s + 2 - s + 7 uint48 Dati del set coordinato FP Dati di 6 byte, consulta Informazioni sul set coordinato FP
Informazioni sul set coordinato FP

Le informazioni sul set coordinato FP vengono utilizzate per identificare se il dispositivo di pubblicità si trova o meno nello stesso set coordinato.

Ottetto Tipo di dati Descrizione Valore
0 uint8 Numero di pezzi del set coordinato varies
1 uint8 Tipo di membro del set coordinato di Accoppiamento rapido Può essere uno dei seguenti:
  • 0x00 : componente sinistro
  • 0x01 : componente destro
2 - 5 uint32 Imposta l'hash della chiave di risoluzione dell'identità varies

L'algoritmo per generare il valore hash della chiave di risoluzione dell'identità del set è

  • Utilizza SHA256 per eseguire l'hashing del valore SIRK

    SIRK = 0xe3b0c44298fc1c149afbf4c8996fb924
    
    SHA256(SIRK) = 0x2646036bb22781536be710245c8cbb04b92842c587f845996ce8ab542592a25e
    
  • Estrai i primi quattro byte come valore hash

    Hash Value of Set Identity Resolving Key = 0x2646036b
    

Per la chiave di risoluzione dell'identità del set, consulta Servizio di identificazione del set coordinato per saperne di più.

Annuncio: quando non è rilevabile

Quando non è rilevabile (ovvero non è in modalità di accoppiamento), il dispositivo Provider deve annunciare i dati dell'account di accoppiamento rapido, utilizzando le seguenti linee guida.

La pubblicità dei dati dell'account consente ai Seeker nelle vicinanze di riconoscere quando un Provider appartiene al loro account e di avviare l'accoppiamento senza dover prima forzare il Provider a tornare in modalità di accoppiamento, una causa comune di reclamo da parte degli utenti. I Seeker offriranno agli utenti l'opportunità di ignorare questa trasmissione nel caso in cui non aspettino di accoppiarsi con il Provider o la trasmissione non sia pertinente (ad esempio, se l'accoppiamento è già avvenuto). I seeker filtrano automaticamente anche le trasmissioni palesemente errate, ad esempio quando i dati dell'account non sono configurati correttamente.

Intervallo di annuncio: quando non è rilevabile

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

Payload pubblicitario: dati dell'account di 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
  • V = versione
  • F = flag
0x00
(riservato per un uso futuro)
1 - varia Dati della chiave dell'account varies

I dati della 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
  • length = 0bLLLL = varies
  • type = 0b0000 (mostra l'indicazione della UI) o 0b0010 (nascondi l'indicazione della UI), filtro della chiave dell'account
1 - s Filtro per chiave account varies
s + 1 uint8 Lunghezza e tipo di campo
0bLLLLTTTT
  • L = lunghezza in byte
  • T = tipo
0b00100001
  • lunghezza = 0b0010 = 2
  • type = 0b0001, Salt
s + 2 - s + 3 uint16 Salt varies

Filtro per chiave account

Il filtro della chiave dell'account pubblicizzato consente a un Seeker di verificare rapidamente se un Provider 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 Seeker potrebbe connettersi automaticamente e tentare di avviare la procedura quando rileva la trasmissione di un filtro con tipo 0, ovvero che mostra l'indicazione dell'interfaccia utente, che potrebbe contenere una delle sue chiavi dell'account, in modo da ridurre ulteriormente la percentuale di falsi positivi. In alcune situazioni, il Provider potrebbe voler essere riconosciuto dal Seeker anche se non è pronto per l'accoppiamento. Ad esempio, quando gli auricolari vengono riposti nella custodia, vogliamo interrompere la visualizzazione della notifica di accoppiamento successiva, poiché l'accoppiamento potrebbe essere rifiutato dalle cuffie.

Il filtro della chiave dell'account è un filtro Bloom di lunghezza variabile costruito come segue:

  1. Supponiamo che n sia il numero di chiavi dell'account (n >= 1) nell'elenco delle chiavi dell'account persistente.
  2. Sia s, la dimensione del filtro in byte, pari a (1,2*n + 3) troncato. Ad esempio, se viene mantenuta una chiave, 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 account K nell'elenco delle chiavi 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 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 da 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 salt è un valore casuale che viene aggiunto alle chiavi dell'account durante la creazione del filtro Bloom. Questo salt 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 della chiave dell'account utilizzando il salt:

  1. Genera un valore S casuale di 2 byte. Tieni presente che non esiste un "endianness" per questo valore, poiché non esiste un byte più o meno significativo. Non modificare l'ordine dei byte.
  2. Utilizza il valore S di 2 byte come salt.
  3. Nei dati dell'account per l'accoppiamento rapido pubblicizzati, includi il filtro generato nel campo Account Key Filter (Filtro chiave account) e S nel campo Salt (Salt).