Servizio di accoppiamento rapido

Il provider di accoppiamento rapido deve implementare il servizio di accoppiamento rapido (UUID 0xFE2C), che contiene le seguenti caratteristiche.

Nome Criptato Autorizzazioni UUID Obbligatorio?
ID modello No Lettura FE2C1233-8366-4814-8EB0-01DE32100BEA Obbligatorio
Accoppiamento basato su chiave No Scrivi e invia notifica FE2C1234-8366-4814-8EB0-01DE32100BEA Obbligatorio
Passkey No Scrivi e invia notifica FE2C1235-8366-4814-8EB0-01DE32100BEA Obbligatorio
Chiave account No Scrittura FE2C1236-8366-4814-8EB0-01DE32100BEA Obbligatorio
Dati aggiuntivi No Scrivi e invia notifica FE2C1237-8366-4814-8EB0-01DE32100BEA *C1
PSM del flusso di messaggi Sì Lettura FE2C1239-8366-4814-8EB0-01DE32100BEA *C2
Passkey aggiuntiva No Lettura, scrittura e notifica FE2C123A-8366-4814-8EB0-01DE32100BEA *C3
FP Device Action No Scrivi e invia notifica FE2C123B-8366-4814-8EB0-01DE32100BEA *C4

Obbligatorio condizionalmente

Caratteristica: ID modello

Questa caratteristica consente al Seeker di leggere l'ID modello in base alle necessità, al di fuori di quando il dispositivo pubblica annunci in modalità di rilevamento. Dovrebbe sempre restituire i seguenti dati:

Ottetto Tipo di dati Descrizione Valore
0 - 2 uint24 ID modello varies

Caratteristica: accoppiamento basato su chiave

Questa caratteristica controlla la procedura di accoppiamento basato su chiavi. In questa procedura, viene stabilito un certo livello di attendibilità verificando che il Seeker e il Provider siano entrambi in possesso di una chiave precondivisa. La chiave è diversa in ogni caso:

  • Caso 1: la chiave precondivisa si basa sulla coppia di chiavi pubblica/privata anti-spoofing e sulla coppia di chiavi pubblica/privata del Seeker, che cambierà per ogni tentativo di accoppiamento.

    • Il Provider è in modalità di accoppiamento.
    • Il Seeker verifica che il Provider sia in possesso della chiave privata anti-spoofing.

    Tieni presente che, in modalità di accoppiamento, il provider può anche accoppiarsi nel modo consueto, ad esempio con un dispositivo che non supporta l'accoppiamento basato su chiavi di Accoppiamento rapido.

  • Caso 2: la chiave precondivisa è una delle chiavi dell'account.

    • Il provider di solito non è in modalità di accoppiamento. (Tuttavia, questo non è un requisito: il provider deve supportare l'utilizzo di una chiave dell'account anche in modalità di accoppiamento).
    • Il Seeker e il Provider verificano ciascuno che l'altro sia in possesso della chiave dell'account.

Poiché entrambi i casi sono estremamente simili, ad eccezione della chiave precondivisa utilizzata, sono combinati nella procedura.

Formato dei dati

Consulta la procedura per l'utilizzo di ciascun formato.

Ottetto Tipo di dati Descrizione Valore Obbligatorio?
0-15 uint128 Richiesta criptata varies Obbligatorio
16 - 79 Chiave pubblica varies Facoltativo

Tabella 1.1: richiesta criptata, scritta nella caratteristica dal Seeker.

Ottetto Tipo di dati Descrizione Valore Obbligatorio?
0 uint8 Tipo di messaggio 0x00 = Richiesta di accoppiamento basato su chiave Obbligatorio
1 uint8 Flag
  • Bit 0 (MSB): deprecato e ignorato da Seeker.
  • Bit 1: 1 se il Seeker richiede che il Provider avvii l'accoppiamento e questa richiesta contiene l'indirizzo BR/EDR del Seeker. 0 negli altri casi.
  • Bit 2: 1 se il Seeker richiede che il Provider comunichi il nome esistente. 0 negli altri casi.
  • Bit 3: 1 se si tratta di Scrittura retroattiva della chiave dell'account. 0 negli altri casi.
  • Bit 4: 1 se il Seeker supporta il dispositivo BLE. 0 negli altri casi.
  • Bit 5: 1 se il Seeker supporta LE Audio. 0 negli altri casi.
  • I bit 6-7 sono riservati per un uso futuro e devono essere ignorati.
varies Obbligatorio
2 - 7 uint48 Una di queste soglie:
  • Indirizzo BLE attuale del provider
  • Indirizzo di identità del provider
varies Obbligatorio
8 - 13 uint48 Indirizzo BR/EDR del Seeker varies Presente solo se è impostato il bit 1 o 3 dei flag
n - 15 Valore casuale (salt) varies Obbligatorio

Tabella 1.2.1: richiesta non elaborata (tipo 0x00). Decrittografato dalla richiesta criptata nella Tabella 1.1.

Ottetto Tipo di dati Descrizione Valore Obbligatorio?
0 uint8 Tipo di messaggio 0x10 = Richiesta di azione Obbligatorio
1 uint8 Flag varies Obbligatorio
2 - 7 uint48 Una di queste soglie:
  • Indirizzo BLE attuale del provider
  • Indirizzo di identità del provider
varies Obbligatorio
8 uint8 Invia messaggio al gruppo varies Obbligatorio se è impostato il bit 0 dei flag
9 uint8 Codice del messaggio varies Obbligatorio se è impostato il bit 0 dei flag
10 uint8 Dipende dai flag:
  • Bit 0 impostato: lunghezza dei dati aggiuntivi inferiore a 6
  • Bit 1 impostato: ID dati
varies Obbligatorio se è impostato il bit 0 o 1 dei flag
11 - n Dati aggiuntivi varies Facoltativo
n - 15 Valore casuale (salt) varies Obbligatorio

Tabella 1.2.2: richiesta non elaborata (tipo 0x10). Decrittografato dalla richiesta criptata nella Tabella 1.1.

Ottetto Tipo di dati Descrizione Valore
0 uint8 Tipo di messaggio 0x01 = Risposta di accoppiamento basato su chiave
1 - 6 uint48 Indirizzo pubblico (BR/EDR) del provider varies
7 - 15 Valore casuale (salt) varies

Tabella 1.3: Risposta non elaborata (tipo 0x01). Criptato per produrre la risposta criptata nella Tabella 1.4.

Ottetto Tipo di dati Descrizione Valore
0 uint8 Tipo di messaggio 0x02 = Key-based Pairing Extended Response
1 uint8 Flag
  • Bit 0 (MSB): 1 se il Provider è un dispositivo solo LE, 0 altrimenti. Se il bit 0 è impostato su 1, il Seeker presuppone che il bit 1 sia impostato su 1.
  • Bit 1: 1 se il provider preferisce l'accoppiamento LE, 0 in caso contrario.
  • Bit 2: 1 se il tipo di indirizzo del secondo indirizzo è casuale, 0 se è pubblico.
  • I bit 3-7 sono riservati per un uso futuro e devono essere ignorati.
varies
2 uint8 Numero di indirizzi del provider
I valori validi sono 1 e 2.
varies
3-8 o
3-14
  • Il primo indirizzo deve essere l'indirizzo di identità del dispositivo principale e associabile se è preferibile l'associazione BR/EDR
  • Il secondo indirizzo deve essere l'indirizzo associabile del dispositivo secondario, se disponibile
varies
9-15 o 15 Valore casuale (salt) varies

Tabella 1.3.2: Risposta non elaborata (tipo 0x02). Criptato per produrre la risposta criptata nella Tabella 1.4.

Ottetto Tipo di dati Descrizione Valore
0 -15 uint128 Risposta criptata varies

Tabella 1.4: risposta criptata, inviata dal provider al seeker tramite una notifica.

Caratteristica: passkey

Questa caratteristica viene utilizzata durante la procedura di accoppiamento basato su chiavi.

Ottetto Tipo di dati Descrizione Valore
0-15 uint128 Blocco di passkey criptato varies

Tabella 2.1: blocco di passkey criptato. Per l'utilizzo, consulta la procedura di accoppiamento basato su chiavi.

Ottetto Tipo di dati Descrizione Valore
0 uint8 Tipo di messaggio Un elemento tra:
  • 0x02 = Passkey del cercatore
  • 0x03 = Passkey del provider
1 - 3 unit32 Passkey di 6 cifre varies
4 - 15 Valore casuale (salt) varies

Tabella 2.2: blocco di passkey non elaborato. Versione decriptata della Tabella 2.1.

Caratteristica: chiave account

Dopo l'accoppiamento, il Seeker di Accoppiamento rapido scrive una chiave account nel Provider di Accoppiamento rapido.

Ottetto Tipo di dati Descrizione Valore
0-15 uint128 Chiave account (crittografata) varies

Quando riceve una richiesta di scrittura, il provider di Accoppiamento rapido deve:

  1. Decripta la chiave dell'account utilizzando il secret condiviso generato nel passaggio 4 della procedura.
    • Per i fornitori che richiedono una fideiussione (comune):
      • Prima di decriptare, verifica che il secret condiviso sia stato utilizzato per decriptare la richiesta di passkey del passaggio 12. Se questo passaggio non è stato superato utilizzando questo secret, ignora questa scrittura ed esci.
    • A questo punto, il secret condiviso (K nella procedura) non verrà più utilizzato per questo accoppiamento. Tutte le richieste che arrivano crittografate con questa chiave senza riavviare la procedura devono essere rifiutate.
  2. Verifica che il valore decriptato inizi con 0x04 o 0xFF. In caso contrario, ignora questa scrittura ed esci.
    • Se il valore è 0x04:
      • Controlla se l'elenco delle chiavi dell'account persistente ha spazio per il nuovo valore.
      • In caso contrario, elimina dall'elenco il valore utilizzato meno di recente.
      • Aggiungi il nuovo valore all'elenco.
    • Se il valore è 0xFF:
      • Considera questa sessione di accoppiamento come temporanea e non eseguire alcuna operazione.
      • Questo può accadere con il flusso Scrittura retroattiva della chiave dell'account.
      • Non memorizzare la chiave e non utilizzarla nell'elenco delle chiavi dell'account, nella crittografia o nei calcoli MAC.
      • La rimozione del legame viene attivata da un evento o da un timeout specifico della funzionalità. Per la condivisione audio LE, è vivamente consigliato rimuovere l'accoppiamento BLE e la chiave di collegamento 10 minuti dopo la disconnessione della sessione temporanea.

Le chiavi account nell'elenco vengono utilizzate durante l'accoppiamento basato su chiavi.

Caratteristica: dati aggiuntivi

Questo servizio deve avere la seguente caratteristica.

Caratteristica del servizio di accoppiamento rapido Criptato Autorizzazioni UUID
Dati No Scrivi e invia notifica FE2C1237-8366-4814-8EB0-01DE32100BEA
Vecchia caratteristica del servizio Accoppiamento rapido (da ritirare il 1° gennaio 2021) Criptato Autorizzazioni UUID
Dati No Scrivi e invia notifica 0x1237

Prima di scrivere o inviare notifiche a questa caratteristica, deve essere eseguito un handshake tramite la caratteristica FE2C1234-8366-4814-8EB0-01DE32100BEA per avere un secret condiviso. AES-CTR verrà utilizzato per criptare i dati che passano attraverso questa caratteristica, il cui algoritmo è definito di seguito. Questa modalità è più sicura per i dati che si estendono oltre un singolo blocco di 16 byte. HMAC-SHA256 verrà utilizzato per garantire l'integrità dei dati, definita anche di seguito.

Ottetto Descrizione Valore
abbastanza I primi 8 byte di HMAC-SHA256. varies
8 - 15 Nonce, utilizzato dalla crittografia AES-CTR. varies
16 - var Dati criptati. varies

Tabella 3.1: pacchetto di dati, inviato dal provider al seeker tramite una notifica o dal seeker al provider tramite una scrittura.

Ottetto Tipo di dati Descrizione Valore
0 - var byte array Dati varia, decodificalo in base all'ID dati della Tabella 1.2.2:
  • 0x01(personalized name): utf8s

Tabella 3.2: dati non elaborati. Decriptati dai dati criptati nella Tabella 3.1.

Quando viene richiesta una notifica (ad es. richiesta di un nome personalizzato tramite il bit 2 nella Tabella 1.2.1), il provider di accoppiamento rapido deve eseguire le seguenti operazioni:

  1. Genera 8 byte casuali crittograficamente per il nonce.
  2. Cripta i dati utilizzando AES-CTR, dove ogni blocco da 16 byte viene generato utilizzando

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    dove

    1. La chiave AES è il secret condiviso del passaggio 4 della procedura.
    2. clearBlock[i] è un blocco da 16 byte che inizia da data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
  3. Esegui concat(encryptedBlock[0], encryptedBlock[1],…) per creare i dati criptati.

  4. Genera HMAC-SHA256 per

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    dove

    1. K viene generato da concat(shared_secret, 48-byte ZEROs), dove shared_secret proviene dal passaggio 4 della procedura.
    2. opad è un padding esterno di 64 byte, costituito da byte ripetuti con valore 0x5C.
    3. ipad è un padding interno di 64 byte, costituito da byte ripetuti con valore 0x36.
  5. Prendi i primi 8 byte dall'HMAC-SHA256 come prefisso del pacchetto dati.

Quando riceve una richiesta di scrittura, il provider di Accoppiamento rapido deve:

  1. Verifica l'integrità dei dati controllando i primi 8 byte di HMAC-SHA256.
  2. Decripta i dati criptati utilizzando AES-CTR, dove ogni blocco viene generato utilizzando

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    dove

    1. encryptedBlock[i] è un blocco di 16 byte che inizia da encrypted_data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
    2. La chiave AES viene generata o identificata dall'handshake, ad esempio:
      1. Nel flusso di denominazione 1, proviene da ECDH e non verrà utilizzato di nuovo per questo accoppiamento. Tutte le richieste che arrivano crittografate con questa chiave senza riavviare la procedura devono essere rifiutate.
      2. Nel flusso di denominazione 2, è la chiave dell'account.
  3. Esegui concat(clearBlock[0], clearBlock[1],…) per creare i dati non elaborati.

Caratteristica: PSM del flusso di messaggi

Consulta Dispositivo BLE: PSM del flusso di messaggi

Caratteristica: passkey aggiuntiva

Consulta Dispositivo BLE: passkey aggiuntiva.

Caratteristica: azione del dispositivo FP

Caratteristica del servizio di accoppiamento rapido Criptato Autorizzazioni UUID
Azione dispositivo FP No Scrivi e invia notifica FE2C123B-8366-4814-8EB0-01DE32100BEA

Ottetto Descrizione Valore
abbastanza I primi 8 byte di HMAC-SHA256. varies
8 - 15 Nonce, utilizzato dalla crittografia AES-CTR. varies
16 - var Dati criptati. varies

Tabella 4.1: pacchetto di dati, inviato dal provider al seeker come notifica o dal seeker al provider come scrittura.

Ottetto Tipo di dati Descrizione Valore
0 - var byte array Richiesta di azione Un elemento tra:
  • Lettura del nome personalizzato, 0x01
  • Write Personalized Name, vedi Tabella 4.3.1
  • Lettura delle informazioni sul set coordinato, 0x02
  • Lettura delle funzionalità del dispositivo, 0x03

Tabella 4.2: dati non elaborati. Decrittografati dai dati crittografati nella Tabella 4.1 inviati dal Seeker al Provider come scrittura.

Ottetto Tipo di dati Descrizione Valore
0 - var byte array Risposta all'azione Un elemento tra:
  • Nome personalizzato, vedi Tabella 4.3.1
  • Informazioni sul set coordinato, consulta la Tabella 4.3.2
  • Funzionalità del dispositivo, consulta la tabella 4.3.3
  • Codice di errore
    • 0x80 (Richiesta non supportata)
    • 0x81 (Richiesta non valida)

Tabella 4.3: dati non elaborati. Decrittografati dai dati criptati nella Tabella 4.1 inviata dal Provider al Seeker come notifica.

Ottetto Tipo di dati Descrizione Valore
0 uint8 ID azione 0x01
1 - var utf8s Nome personalizzato varies

Tabella 4.3.1: formato del nome personalizzato

Ottetto Tipo di dati Descrizione Valore
0 uint8 ID azione 0x02
1 uint8 Tipo di membro del set coordinato di Accoppiamento rapido
  • 0x00: componente sinistro
  • 0x01: componente destro
2 uint8 Numero di pezzi del set coordinato numero di componenti
3 uint8 Imposta il tipo di chiave di risoluzione dell'identità 0x01 (SIRK in testo normale)
4 - 19 uint128 Imposta il valore della chiave di risoluzione dell'identità Dati di 16 byte, vedi Coordinated Set Identification Service

Tabella 4.3.2: formato delle informazioni del set coordinato

Ottetto Tipo di dati Descrizione Valore
0 uint8 ID azione 0x03
1 - 2 uint16 Funzioni dispositivo
  • Bit 0-15: riservati, devono essere impostati su 0

Tabella 4.3.3: formato delle funzionalità del dispositivo

Operazioni di accoppiamento rapido

Per questa caratteristica sono definite due operazioni principali

  • Lettura dell'accoppiamento rapido: lettura dei dati dal provider
    1. Seeker: attiva la notifica GATT
    2. Provider: notifica GATT registrata
    3. Seeker: richiesta di scrittura GATT, i dati non elaborati contengono solo Action ID
    4. Provider: risposta di scrittura GATT
    5. Provider: notifica GATT, i dati non elaborati contengono
      • ID azione
      • Dati per l'ID azione
    6. Seeker: notifica GATT ricevuta
  • Scrittura con l'accoppiamento rapido: scrive i dati nel Provider
    1. Seeker: richiesta di scrittura GATT, i dati non elaborati contengono
      • ID azione
      • Dati per l'ID azione
    2. Provider: risposta di scrittura GATT

ID azione supportato per la lettura con l'accoppiamento rapido

  • 0x01 (nome personalizzato)
  • 0x02 (informazioni sul set coordinato)
  • 0x03 (Funzionalità del dispositivo)

ID azione supportata per la scrittura con l'accoppiamento rapido

Se il Provider non comprende un ID azione, risponde con una notifica GATT contenente Richiesta non supportata (0x80), come descritto nella Tabella 4.3.

Algoritmo di crittografia

Quando viene richiesta una notifica, il provider di accoppiamento rapido deve:

  1. Genera 8 byte casuali crittograficamente per il nonce.
  2. Cripta i dati utilizzando AES-CTR, dove ogni blocco da 16 byte viene generato utilizzando

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    dove

    1. La chiave AES è il secret condiviso del passaggio 4 della procedura.
    2. clearBlock[i] è un blocco di 16 byte a partire da data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
  3. Esegui concat(encryptedBlock[0], encryptedBlock[1],...) per creare i dati criptati.

  4. Genera HMAC-SHA256 per

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    dove

    1. K viene generato da concat(shared_secret, 48-byte ZEROs), dove shared_secret proviene dal passaggio 4 della procedura.
    2. opad è un padding esterno di 64 byte, costituito da byte ripetuti con valore 0x5C.
    3. ipad è un padding interno di 64 byte, costituito da byte ripetuti con valore 0x36.
  5. Prendi i primi 8 byte dall'HMAC-SHA256 come prefisso del pacchetto dati.

Quando riceve una richiesta di scrittura, il provider di Accoppiamento rapido deve:

  1. Verifica l'integrità dei dati controllando i primi 8 byte di HMAC-SHA256.
  2. Decripta i dati criptati utilizzando AES-CTR, dove ogni blocco viene generato utilizzando

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    dove

    1. encryptedBlock[i] è un blocco di 16 byte a partire da encrypted_data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
    2. La chiave AES viene generata o identificata dall'handshake, ad esempio:
      1. Nel flusso di denominazione 1, proviene da ECDH e non verrà utilizzato di nuovo per questo accoppiamento. Tutte le richieste che arrivano crittografate con questa chiave senza riavviare la procedura devono essere rifiutate.
      2. Nel flusso di denominazione 2, è la chiave dell'account.
  3. Esegui concat(clearBlock[0], clearBlock[1],...) per creare i dati non elaborati.

Servizio informazioni sul dispositivo

Il provider di accoppiamento rapido deve supportare anche il servizio di informazioni sul dispositivo (UUID 0x180A). Il seeker di accoppiamento rapido utilizza le seguenti caratteristiche.

Nome Criptato Autorizzazioni UUID
Revisione firmware No Lettura 0x2A26

Caratteristica: revisione del firmware

Questa caratteristica consente al Seeker di leggere la revisione del firmware del Provider, se necessario. Deve sempre restituire i seguenti dati:

Ottetto Tipo di dati Descrizione Valore
0 - var utf8s Codice di revisione del firmware varies

Deve essere incapsulato in una singola stringa UTF-8 anche se sul provider è presente più di un firmware (ad es. 3 firmware per l'auricolare sinistro, l'auricolare destro e la custodia). Il provider può anche restituire stringhe specifiche per casi speciali:

  1. status-updating: se il provider sta eseguendo l'aggiornamento a un nuovo firmware. In alternativa, il provider potrebbe restituire la versione del firmware di gestione temporanea.

  2. status-abnormal: se il provider è in uno stato anomalo. Ad esempio, non funziona correttamente perché l'aggiornamento firmware non è riuscito. Questo valore farà sì che il Seeker mostri un messaggio per informare l'utente che deve essere aggiornato ora.

Il Provider deve limitare l'accesso alla caratteristica Revisione firmware per impedire il tracciamento del dispositivo. Limitazioni suggerite:

  • i dispositivi accoppiati devono avere accesso in qualsiasi momento
  • qualsiasi dispositivo deve avere accesso quando il Provider è rilevabile

Se il Provider supporta Find Hub, è necessaria un'implementazione aggiuntiva. Per maggiori dettagli, consulta l'articolo Aggiornamenti firmware di Find Hub.