Caratteristiche
Servizio di accoppiamento rapido
Il fornitore dell'accoppiamento rapido disporrà del seguente servizio GATT.
Servizio | UUID |
---|---|
Servizio di accoppiamento rapido | 0xFE2C |
Questo servizio avrà le seguenti caratteristiche.
Caratteristica del servizio di accoppiamento rapido | Criptato | Autorizzazioni | UUID |
---|---|---|---|
ID modello | No | Leggi | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Accoppiamento basato su chiavi | No | Scrivi e invia notifica | FE2C1234-8366-4814-8EB0-01DE32100BEA |
Passkey | No | Scrivi e invia notifica | FE2C1235-8366-4814-8EB0-01DE32100BEA |
Chiave account | No | Scrittura | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Servizio Informazioni del dispositivo
Il fornitore dell'accoppiamento rapido deve supportare anche il servizio Device Information Service.
Servizio | UUID |
---|---|
Servizio Informazioni del dispositivo | 0x180A |
La ricerca dell'accoppiamento rapido utilizza le seguenti caratteristiche.
Nome | Criptato | Autorizzazioni | UUID |
---|---|---|---|
Revisione firmware | No | Leggi | 0x2A26 |
Caratteristica: ID modello
Questa caratteristica consente al cercatore di leggere l'ID modello in base alle esigenze, al di fuori del Quando il dispositivo sta pubblicizzando in modalità rilevabile. Deve sempre essere restituito i seguenti dati:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 - 2 | uint24 |
ID modello | varia |
Caratteristica: accoppiamento basato su chiavi
Questa caratteristica controlla la procedura di accoppiamento basato su chiavi. In questa procedura, viene stabilito un certo livello di fiducia verificando che chi cerca e Entrambi i provider sono in possesso di una chiave precondivisa. La chiave è diversa per ciascun caso:
Caso 1: la chiave precondivisa si basa sulla chiave pubblica/privata anti-spoofing e la coppia di chiavi pubblica/privata del ricercatore, che cambierà per ogni tentativo di associazione.
- Il provider è in modalità di accoppiamento.
- Il Cercatore verifica che il Fornitore sia in possesso dei chiave privata anti-spoofing.
Tieni presente che quando è in modalità di accoppiamento, il Provider può ovviamente eseguire l'accoppiamento nella per l'accoppiamento con un dispositivo che non supporta la funzionalità dell'accoppiamento basato su chiave.
Caso 2: la chiave precondivisa è una delle chiavi dell'account.
- Il provider solitamente non è in modalità di accoppiamento. (Ma questo non è un requisito: il fornitore deve supportare l'utilizzo di una chiave dell'account anche quando modalità di accoppiamento).
- Il Cercatore e il Fornitore verificano che l'altro sia in possesso del chiave dell'account.
Poiché entrambi i casi sono molto simili, ad eccezione della chiave precondivisa che viene utilizzata, vengono combinati in una procedura.
Formato dei dati
Consulta la procedura per informazioni su 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 ricercatore.
Ottetto | Tipo di dati | Descrizione | Valore | Obbligatorio? |
---|---|---|---|---|
0 | uint8 |
Tipo di messaggio | 0x00 = richiesta di associazione basata su chiave |
Obbligatorio |
1 | uint8 |
Flag
|
varia | Obbligatorio |
2 - 7 | uint48 |
Una di queste soglie:
|
varia | Obbligatorio |
8 - 13 | uint48 |
Indirizzo BR/EDR del richiedente | varia | Presente solo se è impostato il Flag Bit 1 o 3 |
N-15 | Valore casuale (sale) | varia | Obbligatorio |
Tabella 1.2.1: Richiesta non elaborata (tipo 0x00). Decriptata dal file per le richieste nella Tabella 1.1.
Ottetto | Tipo di dati | Descrizione | Valore | Obbligatorio? |
---|---|---|---|---|
0 | uint8 |
Tipo di messaggio | 0x10 = richiesta di azione |
Obbligatorio |
1 | uint8 |
Flag
|
varia | Obbligatorio |
2 - 7 | uint48 |
Una di queste soglie:
|
varia | Obbligatorio |
8 | uint8 |
Gruppo di messaggi | varia | Obbligatorio se il bit del flag è impostato 0 |
9 | uint8 |
Codice messaggio | varia | Obbligatorio se il bit del flag è impostato 0 |
10 | uint8 |
Dipende dalle segnalazioni:
|
varia | Obbligatorio se il flag bit 0 o 1 è impostato |
11 - n | Dati aggiuntivi | varia | Facoltativo | |
N-15 | Valore casuale (sale) | varia | Obbligatorio |
Tabella 1.2.2: Richiesta non elaborata (tipo 0x10). Decriptata dal file per le richieste nella Tabella 1.1.
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Tipo di messaggio | 0x01 = risposta di accoppiamento basata su chiavi |
1 - 6 | uint48 |
Indirizzo pubblico (BR/EDR) del fornitore | varia |
7 - 15 | Valore casuale (sale) | varia |
Tabella 1.3: Risposta non elaborata. Criptata 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 provider al ricercatore tramite una invia una notifica.
Caratteristica: passkey
Questa caratteristica viene utilizzata durante l' accoppiamento basato su chiavi .
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0-15 | uint128 |
Blocco di passkey criptate | varia |
Tabella 2.1: Blocco delle passkey criptate. Consulta Procedura di accoppiamento basato su chiave per l'utilizzo.
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 | uint8 |
Tipo di messaggio | Uno dei seguenti:
|
1 - 3 | unit32 |
Passkey di 6 cifre | varia |
4 - 15 | Valore casuale (sale) | varia |
Tabella 2.2: Blocco passkey non elaborato. Versione decriptata della Tabella 2.1.
Caratteristica: chiave account
Dopo l'accoppiamento, il ricercatore dell'accoppiamento rapido scriverà una chiave account all'accoppiamento rapido. Provider.
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0-15 | uint128 |
Chiave account (criptata) | varia |
Dopo aver ricevuto una richiesta di scrittura, il provider di accoppiamento rapido procede come segue:
- Decripta la chiave dell'account utilizzando il secret condiviso generato nel passaggio 4 della
procedura.
- Per i fornitori che richiedono obbligazioni (comune):
- Prima di decriptare, verifica che il secret condiviso sia stato utilizzato per decriptare richiesta di passkey al passaggio 12. Se questo passaggio non è stato superato utilizzando questo un secret, ignora questa scrittura ed esci.
- A questo punto, il secret condiviso (K nella procedura) non verrà utilizzato di nuovo per questo accoppiamento. Tutte le richieste inviate sono criptate con questa chiave senza riavviare la procedura dovrebbe essere rifiutata.
- Per i fornitori che richiedono obbligazioni (comune):
- Verifica che il valore decriptato inizi con
0x04
. In caso contrario, ignora questa scrittura ed esce. - Controlla se nell'elenco delle chiavi dell'account persiste c'è spazio per il nuovo valore.
- In caso contrario, elimina dall'elenco il valore utilizzato meno di recente.
- Aggiungi il nuovo valore all'elenco.
Le chiavi dell'account nell'elenco vengono utilizzate durante l'accoppiamento basato su chiave.
Caratteristica: revisione firmware
Questa caratteristica consente al cercatore di leggere la revisione del firmware del del fornitore in base alle esigenze. Dovrebbe essere sempre restituito i seguenti dati:
Ottetto | Tipo di dati | Descrizione | Valore |
---|---|---|---|
0 - var | utf8s |
Codice di revisione firmware | varia |
Deve essere incapsulato in una singola stringa utf8 anche se ne esistono più di una firmware (ad es. 3 firmware per l'auricolare sinistro, l'auricolare destro e la custodia) sul provider. Il provider può anche restituire stringhe specifiche per casi speciali:
status-updates: se il provider sta attualmente eseguendo l'aggiornamento a un nuovo firmware. In alternativa, il provider potrebbe restituire la versione del firmware temporaneo.
status-abnormal: se il provider è in uno stato anomalo. Ad esempio, non ha funzionato correttamente a causa di un aggiornamento firmware non riuscito. Questo valore farà sì che l'utente in questione per mostrare un messaggio che comunica all'utente che deve essere aggiornato adesso.
Il provider deve limitare l'accesso alla caratteristica Revisione firmware a impedire il monitoraggio del dispositivo. Limitazioni suggerite:
- I dispositivi collegati dovrebbero avere accesso in qualsiasi momento
- qualsiasi dispositivo deve avere accesso quando il provider è rilevabile.
Caratteristica: dati aggiuntivi
Questo servizio avrà le seguenti caratteristiche.
Caratteristica del servizio di accoppiamento rapido | Criptato | Autorizzazioni | UUID |
---|---|---|---|
Dati | No | Scrivi e invia notifica | FE2C1237-8366-4814-8EB0-01DE32100BEA |
Vecchia caratteristica del servizio di accoppiamento rapido (target da deprecare il giorno 1/1/2021) | Criptato | Autorizzazioni | UUID |
---|---|---|---|
Dati | No | Scrivi e invia notifica | 0x1237 |
Prima di scrivere o inviare una notifica a questa caratteristica, deve esserci un
handshake tramite la caratteristica FE2C1234-8366-4814-8EB0-01DE32100BEA
per avere
un secret condiviso. Per crittografare il flusso di dati attraverso questo verrà utilizzato l'algoritmo AES-CTR
caratteristica, il cui algoritmo è definito di seguito. Questa modalità
sicura per tutti i dati che si estendono oltre un singolo blocco da 16 byte. HMAC-SHA256
essere utilizzati per garantire l'integrità dei dati, che viene 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 crittografati. | varia |
Tabella 3.1: Pacchetto di dati inviato dal fornitore al ricercatore tramite una notificare o inviare dal Cercatore al Fornitore in 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. Decriptata dai dati criptati in Tabella 3.1.
Quando viene richiesta una notifica (ad es., richiesta di nome personalizzato tramite Bit 2 in Tabella 1.2.1), il Fornitore dell’accoppiamento rapido dovrà:
- Genera 8 byte crittograficamente casuali per Nonce.
Crittografa i dati utilizzando l'algoritmo AES-CTR, dove ogni blocco da 16 byte viene generato utilizzando
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
dove
- La chiave AES è il secret condiviso nel passaggio 4 della procedura.
- clearBlock[i] è un blocco di 16 byte che parte dai dati[i * 16]. L'ultima può essere inferiore a 16 byte.
Esegui concat(cryptBlock[0], cryptBlock[1],...) per creare il Dati crittografati.
Genera HMAC-SHA256 per
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
dove
- La K viene generata da concat(shared_secret, zeri a 48 byte), shared_secret proviene dal passaggio 4 della procedura.
- opad è una spaziatura interna di 64 byte, composta da byte ripetuti valutati
0x5C
. - iPad è una spaziatura interna di 64 byte, composta da byte ripetuti valutati
0x36
.
Prendi i primi 8 byte da HMAC-SHA256 come prefisso del un pacchetto.
Dopo aver ricevuto una richiesta di scrittura, il provider di accoppiamento rapido procede 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
- criptatoBlock[i] è un blocco di 16 byte a partire da criptato_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 può essere usato di nuovo per questo accoppiamento. Tutte le richieste ricevute tramite crittografia con questa chiave senza riavviare, la procedura dovrebbe essere rifiutato.
- nel flusso di denominazione 2, è la chiave dell'account.
Esegui concat(clearBlock[0], clearBlock[1],...) per creare i dati non elaborati.