Caratteristiche
Servizio di accoppiamento rapido
Il fornitore dell'accoppiamento rapido deve disporre del seguente servizio GATT.
| Servizio | UUID |
|---|---|
| Servizio di accoppiamento rapido | 0xFE2C |
Questo servizio deve avere le seguenti caratteristiche.
| Caratteristica del servizio di accoppiamento rapido | Criptato | Autorizzazioni | UUID |
|---|---|---|---|
| ID modello | No | Lettura | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Accoppiamento basato su chiave | No | Scrivere e inviare una notifica | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Passkey | No | Scrivere e inviare una notifica | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| Chiave account | No | Scrittura | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Servizio di informazioni sul dispositivo
Il fornitore dell'accoppiamento rapido deve supportare anche il servizio di informazioni sul dispositivo.
| Servizio | UUID |
|---|---|
| Servizio di informazioni sul dispositivo | 0x180A |
Fast Pair Seeker utilizza le seguenti caratteristiche.
| Nome | Criptato | Autorizzazioni | UUID |
|---|---|---|---|
| Revisione firmware | No | Lettura | 0x2A26 |
Caratteristica: ID modello
Questa caratteristica consente al richiedente di leggere l'ID modello in base alle necessità, al di fuori di quando il dispositivo pubblicizza in modalità rilevabile. Deve sempre restituire i seguenti dati:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 - 2 | uint24 |
ID modello | varia |
Caratteristica: accoppiamento basato su chiave
Questa caratteristica controlla la procedura di accoppiamento basato su chiave. In questa procedura, un certo livello di attendibilità viene stabilito verificando che il richiedente e il fornitore siano entrambi in possesso di una chiave precondivisa. La chiave è diversa in ogni caso:
Scenario 1: la chiave precondivisa si basa sulla coppia di chiavi pubblica/privata anti-spoofing e sulla coppia di chiavi pubblica/privata del richiedente, che cambierà a ogni tentativo di accoppiamento.
- Il provider è in modalità di accoppiamento.
- Il richiedente verifica che il fornitore sia in possesso della chiave privata anti-spoofing.
Tieni presente che in modalità di accoppiamento, il fornitore può anche eseguire l'accoppiamento nel modo consueto, ad esempio per accoppiarsi con un dispositivo che non supporta l'accoppiamento basato su chiave dell'accoppiamento rapido.
Caso 2: la chiave precondivisa è una delle chiavi dell'account.
- Il provider di solito non è in modalità di accoppiamento. (ma non è un requisito: il fornitore deve supportare l'utilizzo di una chiave dell'account anche in modalità di accoppiamento).
- Il richiedente e il fornitore verificano 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 scoprire come viene utilizzato ogni formato.
| Ottetto | Tipo di dati | Descrizione | Valore | Obbligatorio? |
|---|---|---|---|---|
| 0-15 | uint128 |
Richiesta criptata | varia | Obbligatorio |
| 16 - 79 | Chiave pubblica | varia | Facoltativo |
Tabella 1.1:richiesta criptata, scritta nella caratteristica dal richiedente.
| Ottetto | Tipo di dati | Descrizione | Valore | Obbligatorio? |
|---|---|---|---|---|
| 0 | uint8 |
Tipo di messaggio | 0x00 = Richiesta di accoppiamento basata su chiave |
Obbligatorio |
| 1 | uint8 |
Flag
|
varia | Obbligatorio |
| 2 - 7 | uint48 |
Una di queste opzioni:
|
varia | Obbligatorio |
| 8 - 13 | uint48 |
Indirizzo BR/EDR del richiedente | varia | Presente solo se è impostato il bit 1 o 3 dei flag |
| n - 15 | Valore casuale (sale) | varia | Obbligatorio |
Tabella 1.2.1: richiesta non elaborata (tipo 0x00). Decrittografato dalla richiesta criptata in Tabella 1.1.
| Ottetto | Tipo di dati | Descrizione | Valore | Obbligatorio? |
|---|---|---|---|---|
| 0 | uint8 |
Tipo di messaggio | 0x10 = Action Request |
Obbligatorio |
| 1 | uint8 |
Flag
|
varia | Obbligatorio |
| 2 - 7 | uint48 |
Una di queste opzioni:
|
varia | Obbligatorio |
| 8 | uint8 |
Invia messaggio al gruppo | varia | Obbligatorio se è impostato il bit 0 dei flag |
| 9 | uint8 |
Codice del messaggio | varia | Obbligatorio se è impostato il bit 0 dei flag |
| 10 | uint8 |
Dipende dai flag:
|
varia | Obbligatorio se è impostato il bit 0 o 1 dei flag |
| 11 - n | Dati aggiuntivi | varia | Facoltativo | |
| n - 15 | Valore casuale (sale) | varia | Obbligatorio |
Tabella 1.2.2: richiesta non elaborata (tipo 0x10). Decrittografato dalla richiesta criptata in Tabella 1.1.
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 | uint8 |
Tipo di messaggio | 0x01 = Key-based Pairing Response |
| 1 - 6 | uint48 |
Indirizzo pubblico (BR/EDR) del fornitore | varia |
| 7 - 15 | Valore casuale (sale) | varia |
Tabella 1.3: risposta non elaborata. criptato per produrre la risposta criptata in Tabella 1.4.
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 -15 | uint128 |
Risposta criptata | varia |
Tabella 1.4: risposta criptata, inviata dal fornitore al richiedente tramite una notifica.
Caratteristica: passkey
Questa caratteristica viene utilizzata durante la procedura di accoppiamento basato su chiave.
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0-15 | uint128 |
Blocco passkey criptato | varia |
Tabella 2.1: blocco della passkey criptata. Consulta la procedura di accoppiamento basata su chiave per l'utilizzo.
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 | uint8 |
Tipo di messaggio | Un elemento tra:
|
| 1 - 3 | unit32 |
Passkey di 6 cifre | varia |
| 4 - 15 | Valore casuale (sale) | varia |
Tabella 2.2: blocco passkey non elaborato. Versione decrittografata della Tabella 2.1.
Caratteristica: chiave account
Dopo l'accoppiamento, il richiedente dell'accoppiamento rapido scriverà una chiave dell'account nel fornitore dell'accoppiamento rapido.
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0-15 | uint128 |
Chiave dell'account (crittografata) | varia |
Una volta ricevuta una richiesta di scrittura, il fornitore di accoppiamento rapido deve procedere come segue:
- Decripta la chiave dell'account utilizzando il segreto condiviso generato dal passaggio 4 della
procedura.
- Per i fornitori che richiedono una garanzia (comune):
- Prima di decriptare, verifica che il segreto 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 e esci.
- A questo punto, il segreto condiviso (K nella procedura) non verrà più utilizzato per questo accoppiamento. Tutte le richieste che arrivano criptate con questa chiave senza riavviare la procedura devono essere rifiutate.
- Per i fornitori che richiedono una garanzia (comune):
- Verifica che il valore decriptato inizi con
0x04o0xFF. In caso contrario, ignora questa scrittura e 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 operazione come una sessione di accoppiamento temporanea e non eseguire alcuna operazione.
- Ciò 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 bond viene attivata da un evento o un timeout specifico della funzionalità. Per la condivisione audio LE, è consigliabile rimuovere l'associazione BLE e la chiave di collegamento 10 minuti dopo la disconnessione della sessione temporanea.
- Se il valore è
Le chiavi dell'account nell'elenco vengono utilizzate durante l'accoppiamento basato su chiave.
Caratteristica: revisione firmware
Questa caratteristica consente al richiedente di leggere la revisione del firmware del fornitore in base alle esigenze. Deve sempre restituire i seguenti dati:
| Ottetto | Tipo di dati | Descrizione | Valore |
|---|---|---|---|
| 0 - var | utf8s |
Codice di revisione del firmware | varia |
Deve essere incapsulato in una singola stringa UTF-8 anche se è presente più di un firmware (ad es. 3 firmware per l'auricolare sinistro, l'auricolare destro e la custodia) sul fornitore. Il fornitore può anche restituire le stringhe specifiche per casi speciali:
status-updating: se il fornitore sta eseguendo l'aggiornamento a un nuovo firmware. In alternativa, il fornitore potrebbe restituire la versione del firmware di staging.
status-abnormal: se il fornitore si trova in uno stato anomalo. Ad esempio, si è verificato un malfunzionamento perché l'aggiornamento del firmware non è riuscito. Questo valore farà in modo che Seeker mostri un messaggio per informare l'utente che deve essere aggiornato ora.
Il fornitore deve limitare l'accesso alla caratteristica Revisione firmware per impedire il monitoraggio del dispositivo. Limitazioni suggerite:
- i dispositivi accoppiati devono avere accesso in qualsiasi momento
- qualsiasi dispositivo dovrebbe avere accesso quando il fornitore è rilevabile
Caratteristica: dati aggiuntivi
Questo servizio deve avere la seguente caratteristica.
| Caratteristica del servizio di accoppiamento rapido | Criptato | Autorizzazioni | UUID |
|---|---|---|---|
| Dati | No | Scrivere e inviare una notifica | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Vecchia caratteristica del servizio Accoppiamento rapido (destinata al ritiro il 01/01/2021) | Criptato | Autorizzazioni | UUID |
|---|---|---|---|
| Dati | No | Scrivere e inviare una notifica | 0x1237 |
Prima di scrivere o inviare una notifica a questa caratteristica, deve essere
eseguito un handshake tramite la caratteristica FE2C1234-8366-4814-8EB0-01DE32100BEA per avere
un segreto condiviso. AES-CTR verrà utilizzato per criptare i dati che scorrono 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. | varia |
| 8 - 15 | Nonce, utilizzato dalla crittografia AES-CTR. | varia |
| 16 - var | Dati criptati. | varia |
Tabella 3.1: pacchetto di dati, inviato dal Fornitore al Richiedente tramite una notifica o inviato dal Richiedente al Fornitore 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:
|
Tabella 3.2: dati non elaborati. Decriptato dai dati criptati in Tabella 3.1.
Quando viene richiesta una notifica (ad es. richiesta di nome personalizzato tramite il bit 2 nella tabella 1.2.1), il fornitore di accoppiamento rapido deve:
- Genera 8 byte casuali crittograficamente per Nonce.
Cripta i dati utilizzando AES-CTR, dove ogni blocco di 16 byte viene generato utilizzando
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))dove
- La chiave AES è il segreto condiviso del passaggio 4 della procedura.
- clearBlock[i] è un blocco di 16 byte a partire da data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
Esegui concat(encryptedBlock[0], encryptedBlock[1],…) per creare i dati criptati.
Genera HMAC-SHA256 per
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))dove
- K viene generato da concat(shared_secret, 48-byte ZEROs), il shared_secret proviene dal passaggio 4 della procedura.
- opad è un riempimento esterno di 64 byte, costituito da byte ripetuti con valore
0x5C. - ipad è un padding interno di 64 byte, costituito da byte ripetuti con valore
0x36.
Prendi i primi 8 byte di HMAC-SHA256 come prefisso del pacchetto di dati.
Una volta ricevuta una richiesta di scrittura, il fornitore di accoppiamento rapido deve procedere come segue:
- Verifica l'integrità dei dati controllando i primi 8 byte di HMAC-SHA256.
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
- encryptedBlock[i] è un blocco di 16 byte che inizia da encrypted_data[i * 16]. L'ultimo blocco può essere inferiore a 16 byte.
- La chiave AES viene generata o identificata dall'handshake, ad esempio
- nel flusso di denominazione 1, proviene da ECDH e non verrà utilizzato di nuovo per questo accoppiamento. Tutte le richieste che arrivano criptate con questa chiave senza riavviare la procedura devono essere rifiutate.
- nel flusso di denominazione 2, è la chiave dell'account.
Esegui concat(clearBlock[0], clearBlock[1],…) per creare i dati non elaborati.