Cechy
Usługa Szybkie parowanie
Dostawca szybkiego parowania musi mieć następującą usługę GATT.
| Usługa | UUID |
|---|---|
| Usługa Szybkie parowanie | 0xFE2C |
Usługa ta powinna mieć następujące cechy:
| Charakterystyka usługi Szybkiego parowania | Zaszyfrowane | Uprawnienia | UUID |
|---|---|---|---|
| Identyfikator modelu | Nie | Odczyt | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Parowanie na podstawie klucza | Nie | Pisanie i powiadamianie | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Klucz dostępu | Nie | Napisz i powiadom | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| Klucz konta | Nie | Zapis | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Usługa informacji o urządzeniu
Dostawca szybkiego parowania powinien też obsługiwać usługę informacji o urządzeniu.
| Usługa | UUID |
|---|---|
| Usługa informacji o urządzeniu | 0x180A |
Poszukiwacz Szybkiego parowania używa tych cech.
| Nazwa | Zaszyfrowane | Uprawnienia | UUID |
|---|---|---|---|
| Wersja oprogramowania | Nie | Odczyt | 0x2A26 |
Cecha: identyfikator modelu
Ta cecha umożliwia Poszukującemu odczytanie identyfikatora modelu w razie potrzeby, poza sytuacjami, gdy urządzenie rozgłasza się w trybie wykrywalnym. Powinien zawsze zwracać te dane:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0–2 | uint24 |
Identyfikator modelu | różne |
Charakterystyka: parowanie oparte na kluczach
Ta charakterystyka kontroluje procedurę parowania opartego na kluczu. W tej procedurze określony poziom zaufania jest ustalany przez sprawdzenie, czy Poszukujący i Dostawca mają klucz PSK. W każdym przypadku klucz jest inny:
Przypadek 1. Klucz PSK jest oparty na parze kluczy publiczny/prywatny zapobiegającej podszywaniu się oraz na parze kluczy publiczny/prywatny urządzenia poszukującego, która zmienia się przy każdej próbie sparowania.
- Urządzenie jest w trybie parowania.
- Poszukiwacz sprawdza, czy Dostawca posiada klucz prywatny zapobiegający spoofingowi.
Pamiętaj, że w trybie parowania dostawca może też oczywiście parować urządzenia w zwykły sposób, na przykład w celu sparowania z urządzeniem, które nie obsługuje parowania opartego na kluczach w ramach Szybkiego parowania.
Przypadek 2. Klucz PSK jest jednym z kluczy konta.
- Dostawca zwykle nie jest w trybie parowania. (Nie jest to jednak wymagane – dostawca powinien obsługiwać klucz konta nawet w trybie parowania).
- Poszukiwacz i Dostawca sprawdzają, czy druga strona ma klucz konta.
Oba przypadki są bardzo podobne, z wyjątkiem używanego klucza PSK, dlatego zostały połączone w procedurze.
Format danych
Zobacz procedurę, aby dowiedzieć się, jak używać poszczególnych formatów.
| Oktet | Typ danych | Opis | Wartość | Obowiązkowe? |
|---|---|---|---|---|
| 0–15 | uint128 |
Zaszyfrowane żądanie | różne | Obowiązkowe |
| 16–79 | Klucz publiczny | różne | Opcjonalny |
Tabela 1.1: zaszyfrowane żądanie zapisane w charakterystyce przez urządzenie wyszukujące.
| Oktet | Typ danych | Opis | Wartość | Obowiązkowe? |
|---|---|---|---|---|
| 0 | uint8 |
Typ komunikatu | 0x00 = prośba o parowanie na podstawie klucza |
Obowiązkowe |
| 1 | uint8 |
Flagi
|
różni się | Obowiązkowe |
| 2–7 | uint48 |
Jeden z tych warunków:
|
różni się | Obowiązkowe |
| 8–13 | uint48 |
Adres BR/EDR urządzenia wyszukującego | różne | Występuje tylko wtedy, gdy ustawiony jest bit 1 lub 3 flag |
| n - 15 | losowa wartość (ciąg zaburzający), | różne | Obowiązkowe |
Tabela 1.2.1. Surowe żądanie (typ 0x00). odszyfrowane z zaszyfrowanego żądania w tabeli 1.1.
| Oktet | Typ danych | Opis | Wartość | Obowiązkowe? |
|---|---|---|---|---|
| 0 | uint8 |
Typ komunikatu | 0x10 = prośba o działanie |
Obowiązkowe |
| 1 | uint8 |
Flagi
|
różne | Obowiązkowe |
| 2–7 | uint48 |
Jeden z tych warunków:
|
różni się | Obowiązkowe |
| 8 | uint8 |
Wyślij wiadomość do grupy | różne | Wymagane, jeśli ustawiono bit 0 flagi |
| 9 | uint8 |
Kod wiadomości | różne | Wymagane, jeśli ustawiono bit 0 flagi |
| 10 | uint8 |
Zależy od flag:
|
różne | Wymagane, jeśli ustawiono bit flagi 0 lub 1 |
| 11 - n | Dodatkowe dane | różne | Opcjonalny | |
| n – 15 | losowa wartość (ciąg zaburzający), | różne | Obowiązkowe |
Tabela 1.2.2. Żądanie nieprzetworzone (typ 0x10). Odszyfrowane z zaszyfrowanego żądania w tabeli 1.1.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 |
Typ komunikatu | 0x01 = odpowiedź dotycząca parowania na podstawie klucza |
| 1–6 | uint48 |
Publiczny adres (BR/EDR) dostawcy | różne |
| 7–15 | Wartość losowa (sól) | różni się |
Tabela 1.3. Odpowiedź nieprzetworzona. Zaszyfrowane w celu wygenerowania zaszyfrowanej odpowiedzi w tabeli 1.4.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0–15 | uint128 |
Zaszyfrowana odpowiedź | różne |
Tabela 1.4. Zaszyfrowana odpowiedź wysłana przez dostawcę do osoby poszukującej za pomocą powiadomienia.
Cechy: klucz dostępu
Ta charakterystyka jest używana podczas procedury parowania opartego na kluczach.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0–15 | uint128 |
Zaszyfrowany blok klucza dostępu | różne |
Tabela 2.1. Blok zaszyfrowanego klucza dostępu. See Key-based Pairing procedure for usage.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 | uint8 |
Typ komunikatu | Jedna z tych wartości:
|
| 1–3 | unit32 |
6-cyfrowy klucz dostępu | różni się |
| 4–15 | Losowa wartość (salt) | różni się |
Tabela 2.2. Nieprzetworzony blok klucza dostępu. Odszyfrowana wersja Tabeli 2.1.
Cecha: klucz konta
Po sparowaniu Szybkie parowanie (urządzenie poszukujące) zapisze klucz konta na urządzeniu udostępniającym Szybkie parowanie.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0–15 | uint128 |
Klucz konta (zaszyfrowany) | różni się |
Po otrzymaniu żądania zapisu dostawca Szybkiego parowania powinien wykonać te czynności:
- Odszyfruj klucz konta za pomocą udostępnionego hasła wygenerowanego w kroku 4 w procedurze.
- W przypadku dostawców, którzy wymagają kaucji (często):
- Przed odszyfrowaniem sprawdź, czy do odszyfrowania żądania klucza dostępu z kroku 12 użyto tajnego klucza. Jeśli ten krok nie został wykonany przy użyciu tego klucza tajnego, zignoruj ten zapis i zakończ działanie.
- Na tym etapie klucz tajny (K w procedurze) nie będzie już używany w przypadku tego parowania. Wszelkie żądania, które zostaną zaszyfrowane tym kluczem bez ponownego uruchomienia procedury, powinny zostać odrzucone.
- W przypadku dostawców, którzy wymagają kaucji (często):
- Sprawdź, czy odszyfrowana wartość zaczyna się od
0x04lub0xFF. Jeśli nie, zignoruj ten zapis i zamknij.- Jeśli wartością jest
0x04:- Sprawdź, czy w utrwalonej liście kluczy konta jest miejsce na nową wartość.
- Jeśli nie, usuń z listy najmniej używaną wartość.
- Dodaj nową wartość do listy.
- Jeśli wartością jest
0xFF:- Traktuj to jako tymczasową sesję parowania i nie wykonuj żadnych działań.
- Może się to zdarzyć w przypadku procesu Zapisywanie klucza konta z mocą wsteczną.
- Nie przechowuj klucza i nie używaj go na liście kluczy konta, do szyfrowania ani do obliczeń MAC.
- Usunięcie powiązania jest wywoływane przez zdarzenie specyficzne dla funkcji lub przekroczenie limitu czasu. W przypadku udostępniania dźwięku LE zdecydowanie zalecamy usunięcie powiązania BLE i klucza połączenia po 10 minutach od rozłączenia sesji tymczasowej.
- Jeśli wartością jest
Klucze konta na liście są używane podczas parowania opartego na kluczach.
Cecha: wersja oprogramowania układowego
Ta charakterystyka umożliwia Poszukującemu odczytywanie wersji oprogramowania układowego Dostawcy w razie potrzeby. Powinien zawsze zwracać te dane:
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 – var | utf8s |
Kod wersji oprogramowania układowego | różni się |
Powinno być ono zawarte w jednym ciągu znaków UTF-8, nawet jeśli dostawca ma więcej niż 1 oprogramowanie układowe (np. 3 oprogramowania układowe dla lewej słuchawki, prawej słuchawki i etui). Dostawca może też zwracać określone ciągi znaków w przypadkach specjalnych:
status-updating: jeśli dostawca aktualizuje obecnie oprogramowanie układowe do nowej wersji. Dostawca może też zwrócić wersję przygotowanego oprogramowania.
status-abnormal: jeśli dostawca jest w stanie nieprawidłowym. Na przykład nie działa prawidłowo, ponieważ nie udało się zaktualizować oprogramowania. Ta wartość spowoduje wyświetlenie przez wyszukiwarkę komunikatu informującego użytkownika o konieczności natychmiastowej aktualizacji.
Dostawca powinien ograniczyć dostęp do charakterystyki wersji oprogramowania układowego, aby zapobiec śledzeniu urządzenia. Sugerowane ograniczenia:
- sparowane urządzenia powinny mieć dostęp w dowolnym momencie;
- każde urządzenie powinno mieć dostęp, gdy dostawca jest wykrywalny;
Jeśli dostawca obsługuje Centrum lokalizacji, wymagane jest dodatkowe wdrożenie. Więcej informacji znajdziesz w artykule Aktualizacje oprogramowania Centrum lokalizacji.
Cechy: dane dodatkowe
Ta usługa ma następujące cechy:
| Charakterystyka usługi Szybkiego parowania | Zaszyfrowane | Uprawnienia | UUID |
|---|---|---|---|
| Dane | Nie | Napisz i powiadom | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Stara charakterystyka usługi Szybkie parowanie (wycofana 1 stycznia 2021 r.) | Zaszyfrowane | Uprawnienia | UUID |
|---|---|---|---|
| Dane | Nie | Pisanie i powiadamianie | 0x1237 |
Przed zapisaniem lub powiadomieniem o tej charakterystyce musi nastąpić uzgadnianie połączenia za pomocą charakterystyki FE2C1234-8366-4814-8EB0-01DE32100BEA, aby uzyskać udostępnione hasło. Do szyfrowania danych przepływających przez tę charakterystykę będzie używany algorytm AES-CTR, który został zdefiniowany poniżej. Ten tryb jest bezpieczniejszy w przypadku danych, które wykraczają poza pojedynczy blok 16-bajtowy. Do zapewnienia integralności danych będzie używany algorytm HMAC-SHA256, który również jest zdefiniowany poniżej.
| Oktet | Opis | Wartość |
|---|---|---|
| czasami | Pierwsze 8 bajtów HMAC-SHA256. | różne |
| 8–15 | Wartość nonce używana przez szyfrowanie AES-CTR. | różne |
| 16 - var | Zaszyfrowane dane. | różni się |
Tabela 3.1. Pakiet danych wysyłany przez dostawcę do poszukującego za pomocą powiadomienia lub przez poszukującego do dostawcy za pomocą zapisu.
| Oktet | Typ danych | Opis | Wartość |
|---|---|---|---|
| 0 – var | byte array |
Dane | różni się, zdekoduj go zgodnie z identyfikatorem danych tabeli 1.2.2:
|
Tabela 3.2. Nieprzetworzone dane. Odszyfrowane z zaszyfrowanych danych w tabeli 3.1.
Gdy zostanie wysłana prośba o powiadomienie (np. prośba o spersonalizowaną nazwę za pomocą bitu 2 w tabeli 1.2.1), dostawca Szybkiego parowania musi wykonać te czynności:
- Wygeneruj kryptograficznie losowe 8 bajtów dla liczby jednorazowej.
Zaszyfruj dane za pomocą AES-CTR, gdzie każdy 16-bajtowy blok jest generowany przy użyciu
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))gdzie
- Klucz AES to udostępnione hasło z kroku 4 w procedurze.
- clearBlock[i] to 16-bajtowy blok zaczynający się od data[i * 16]. Ostatni blok może mieć mniej niż 16 bajtów.
Wykonaj funkcję concat(encryptedBlock[0], encryptedBlock[1],...), aby utworzyć zaszyfrowane dane.
Wygeneruj HMAC-SHA256 za pomocą
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))gdzie
- K jest generowane przez concat(shared_secret, 48-byte ZEROs), gdzie shared_secret pochodzi z kroku 4 procedury.
- opad to 64-bajtowe zewnętrzne dopełnienie składające się z powtarzających się bajtów o wartości
0x5C. - ipad to 64-bajtowe dopełnienie wewnętrzne, składające się z powtarzających się bajtów o wartości
0x36.
Pierwsze 8 bajtów z HMAC-SHA256 traktuj jako prefiks pakietu danych.
Po otrzymaniu żądania zapisu dostawca Szybkiego parowania powinien wykonać te czynności:
- Sprawdź integralność danych, weryfikując pierwsze 8 bajtów HMAC-SHA256.
Odszyfruj zaszyfrowane dane za pomocą AES-CTR, gdzie każdy blok jest generowany przy użyciu
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))gdzie
- encryptedBlock[i] to 16-bajtowy blok rozpoczynający się od encrypted_data[i * 16]. Ostatni blok może mieć mniej niż 16 bajtów.
- Klucz AES jest generowany lub identyfikowany na podstawie uzgadniania, np.
- w przepływie nazewnictwa 1 pochodzi z ECDH i nie będzie ponownie używana w tym parowaniu. Wszelkie żądania, które zostaną zaszyfrowane tym kluczem bez ponownego uruchomienia procedury, powinny zostać odrzucone.
- w procesie nadawania nazw 2 jest to klucz konta.
Wykonaj concat(clearBlock[0], clearBlock[1],...), aby utworzyć nieprzetworzone dane.