Özellikleri
Hızlı Eşleme Hizmeti
Hızlı Eşleme Sağlayıcı'da aşağıdaki GATT hizmeti bulunmalıdır.
| Hizmet | UUID |
|---|---|
| Hızlı Eşleme Hizmeti | 0xFE2C |
Bu hizmet aşağıdaki özelliklere sahip olmalıdır.
| Hızlı Eşleme Hizmeti özelliği | Şifrelenmiş | İzinler | UUID |
|---|---|---|---|
| Model Kimliği | Hayır | Okuma | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Anahtar tabanlı eşleme | Hayır | Yazma ve bildirim gönderme | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Geçiş anahtarı | Hayır | Yazma ve bildirim gönderme | FE2C1235-8366-4814-8EB0-01DE32100BEA |
| Hesap anahtarı | Hayır | Yazma | FE2C1236-8366-4814-8EB0-01DE32100BEA |
Cihaz Bilgileri Hizmeti
Hızlı Eşleme Sağlayıcı, Cihaz Bilgisi Hizmeti'ni de desteklemelidir.
| Hizmet | UUID |
|---|---|
| Cihaz Bilgileri Hizmeti | 0x180A |
Hızlı Eşleme Arayıcı aşağıdaki özellikleri kullanır.
| Ad | Şifrelenmiş | İzinler | UUID |
|---|---|---|---|
| Donanım Yazılımı Revizyonu | Hayır | Okuma | 0x2A26 |
Özellik: Model kimliği
Bu özellik, cihaz bulunabilir modda reklam yayınlarken dışında, Arayan'ın gerektiğinde model kimliğini okumasına olanak tanır. Her zaman aşağıdaki verileri döndürmelidir:
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - 2 | uint24 |
Model Kimliği | değişir |
Özellik: Anahtara Dayalı Eşleme
Bu özellik, anahtar tabanlı eşleme prosedürünü kontrol eder. Bu prosedürde, Talep Eden ve Sağlayıcı'nın her ikisinin de önceden paylaşılan bir anahtara sahip olduğu doğrulanarak belirli bir güven düzeyi oluşturulur. Anahtar her durumda farklıdır:
1. örnek: Önceden paylaşılmış anahtar, sahteciliğe karşı ortak/özel anahtar çiftine ve her eşleştirme denemesinde değişecek olan Arayan'ın kendi ortak/özel anahtar çiftine dayanır.
- Sağlayıcı, eşleme modundadır.
- İsteyen, Sağlayıcı'nın sahteciliğe karşı koruma özel anahtarına sahip olduğunu doğrular.
Eşleme modundayken Sağlayıcı'nın, Fast Pair'in anahtar tabanlı eşlemesini desteklemeyen bir cihazla eşlemek gibi normal şekilde de eşleme yapabileceğini unutmayın.
2. durum: Önceden paylaşılan anahtar, hesap anahtarlarından biridir.
- Sağlayıcı genellikle eşleme modunda değildir. (Ancak bu bir zorunluluk değildir. Sağlayıcı, eşleme modundayken bile hesap anahtarı kullanımını desteklemelidir.)
- İsteyen ve Sağlayıcı, diğer tarafın hesap anahtarına sahip olduğunu doğrular.
Her iki durum da, kullanılan önceden paylaşılmış anahtar dışında son derece benzer olduğundan prosedürde birleştirilmiştir.
Veri Biçimi
Her biçimin nasıl kullanıldığıyla ilgili prosedürü inceleyin.
| Sekizlik | Veri türü | Açıklama | Değer | Zorunlu mu? |
|---|---|---|---|---|
| 0 - 15 | uint128 |
Şifrelenmiş İstek | değişir | Zorunlu |
| 16 - 79 | Ortak Anahtar | değişir | İsteğe bağlı |
Tablo 1.1: Arayan tarafından özelliğe yazılan şifrelenmiş istek.
| Sekizlik | Veri türü | Açıklama | Değer | Zorunlu mu? |
|---|---|---|---|---|
| 0 | uint8 |
Mesaj türü | 0x00 = Anahtara Dayalı Eşleme İsteği |
Zorunlu |
| 1 | uint8 |
İşaretler
|
değişir | Zorunlu |
| 2 - 7 | uint48 |
Şunlardan biri:
|
değişir | Zorunlu |
| 8 - 13 | uint48 |
Arayanın BR/EDR adresi | değişir | Yalnızca Flags Bit 1 veya 3 ayarlanmışsa gösterilir. |
| n - 15 | Rastgele değer (tuz) | değişir | Zorunlu |
Tablo 1.2.1: Ham İstek (tür 0x00). Decrypted from the Encrypted Request in Table 1.1.
| Sekizlik | Veri türü | Açıklama | Değer | Zorunlu mu? |
|---|---|---|---|---|
| 0 | uint8 |
Mesaj türü | 0x10 = İşlem İsteği |
Zorunlu |
| 1 | uint8 |
İşaretler
|
değişir | Zorunlu |
| 2 - 7 | uint48 |
Şunlardan biri:
|
değişir | Zorunlu |
| 8 | uint8 |
Mesaj grubu | değişir | Flags Bit 0 ayarlanmışsa zorunludur. |
| 9 | uint8 |
Mesaj kodu | değişir | Flags Bit 0 ayarlanmışsa zorunludur. |
| 10 | uint8 |
Bayraklara bağlıdır:
|
değişir | Flags Bit 0 veya 1 ayarlanmışsa zorunludur. |
| 11 - n | Ek veriler | değişir | İsteğe bağlı | |
| n - 15 | Rastgele değer (tuz) | değişir | Zorunlu |
Tablo 1.2.2: Ham İstek (tür 0x10). Decrypted from the Encrypted Request in Table 1.1.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 | uint8 |
Mesaj türü | 0x01 = Anahtara Dayalı Eşleştirme Yanıtı |
| 1 - 6 | uint48 |
Sağlayıcının herkese açık (BR/EDR) adresi | değişir |
| 7 - 15 | Rastgele değer (tuz) | değişir |
Tablo 1.3: Ham Yanıt. Tablo 1.4'te Şifrelenmiş Yanıt'ı oluşturmak için şifrelenir.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 -15 | uint128 |
Şifrelenmiş Yanıt | değişir |
Tablo 1.4: Sağlayıcı tarafından bir notify aracılığıyla Talep Sahibi'ne gönderilen Şifrelenmiş Yanıt.
Özellik: Geçiş anahtarı
Bu özellik, anahtar tabanlı eşleme prosedürü sırasında kullanılır.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - 15 | uint128 |
Şifrelenmiş geçiş anahtarı bloğu | değişir |
Tablo 2.1: Şifrelenmiş Geçiş Anahtarı Bloğu. Kullanım için Anahtar tabanlı eşleme prosedürü başlıklı makaleyi inceleyin.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 | uint8 |
Mesaj türü | Şunlardan biri:
|
| 1 - 3 | unit32 |
6 basamaklı geçiş anahtarı | değişir |
| 4 - 15 | Rastgele değer (tuz) | değişir |
Tablo 2.2: Ham Geçiş Anahtarı Bloğu. Tablo 2.1'in şifresi çözülmüş sürümü.
Özellik: Hesap Anahtarı
Eşleme işleminden sonra Hızlı Eşleme Arayıcı, Hızlı Eşleme Sağlayıcı'ya bir Hesap Anahtarı yazar.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - 15 | uint128 |
Hesap anahtarı (şifrelenmiş) | değişir |
Yazma isteği alındığında Hızlı Eşleme Sağlayıcı aşağıdaki işlemleri yapmalıdır:
- Prosedürdeki 4. adımda oluşturulan paylaşılan gizli bilgileri kullanarak hesap anahtarının şifresini çözün.
- Teminat gerektiren sağlayıcılar için (yaygın):
- Şifreyi çözmeden önce, 12. adımda oluşturulan geçiş anahtarı isteğinin şifresini çözmek için paylaşılan gizli bilgilerin kullanıldığını doğrulayın. Bu adım, bu gizli anahtar kullanılarak geçilmediyse bu yazma işlemini yoksayın ve çıkın.
- Bu noktada, paylaşılan gizli bilgiler (prosedürdeki K) bu eşleme için tekrar kullanılmaz. Bu anahtarla şifrelenmiş olarak gelen ve prosedür yeniden başlatılmadan gönderilen tüm istekler reddedilmelidir.
- Teminat gerektiren sağlayıcılar için (yaygın):
- Şifresi çözülen değerin
0x04veya0xFFile başladığını doğrulayın. Aksi takdirde, bu yazma işlemini yoksayın ve çıkın.- Değer
0x04ise:- Kalıcı Hesap Anahtarı listesinde yeni değer için yer olup olmadığını kontrol edin.
- Aksi takdirde, listeden en son kullanılan değeri silin.
- Yeni değeri listeye ekleyin.
- Değer
0xFFise:- Bunu geçici bir eşleme oturumu olarak değerlendirin ve herhangi bir işlem yapmayın.
- Bu durum, Hesap anahtarını geriye dönük olarak yazma akışında yaşanabilir.
- Anahtarı saklamayın ve hesap anahtarı listesinde, şifrelemede veya MAC hesaplamalarında kullanmayın.
- Bağ kaldırma, özelliğe özgü bir etkinlik veya zaman aşımı tarafından tetiklenir. LE Audio Sharing için geçici oturumun bağlantısı kesildikten 10 dakika sonra BLE bağının ve bağlantı anahtarının kaldırılması önemle tavsiye edilir.
- Değer
Listedeki hesap anahtarları, anahtar tabanlı eşleme sırasında kullanılır.
Özellik: Donanım Yazılımı Düzeltmesi
Bu özellik, İstemci'nin gerektiğinde Sağlayıcı'nın donanım yazılımı sürümünü okumasına olanak tanır. Her zaman aşağıdaki verileri döndürmelidir:
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - var | utf8s |
Donanım yazılımı düzeltme kodu | değişir |
Sağlayıcıda birden fazla yazılım olsa bile (ör. sol kulaklık, sağ kulaklık ve kılıf için 3 yazılım) tek bir UTF8 dizesi olarak kapsüllenmelidir. Sağlayıcı, özel durumlar için belirli dizeleri de döndürebilir:
status-updating: Sağlayıcı şu anda yeni bir donanım yazılımına güncelleniyorsa. Alternatif olarak, Sağlayıcı, aşamalı donanım yazılımının sürümünü döndürebilir.
status-abnormal: Sağlayıcı anormal durumdaysa. Örneğin, donanım yazılımı güncellemesi başarısız olduğundan cihaz arızalanmıştır. Bu değer, Arayıcı'nın kullanıcıya hemen güncelleme yapması gerektiğini bildiren bir mesaj göstermesine neden olur.
Sağlayıcı, cihaz takibini önlemek için Firmware Revision özelliğine erişimi sınırlandırmalıdır. Önerilen kısıtlamalar:
- eşlenmiş cihazlar her zaman erişime sahip olmalıdır
- Sağlayıcı bulunabilir olduğunda herhangi bir cihaz erişebilir
Özellik: Ek Veriler
Bu hizmet aşağıdaki özelliğe sahip olmalıdır.
| Hızlı Eşleme Hizmeti özelliği | Şifrelenmiş | İzinler | UUID |
|---|---|---|---|
| Veriler | Hayır | Yazma ve bildirim gönderme | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| Eski Hızlı Eşleme Hizmeti özelliği (1/1/2021'de desteği sonlandırılacak) | Şifrelenmiş | İzinler | UUID |
|---|---|---|---|
| Veriler | Hayır | Yazma ve bildirim gönderme | 0x1237 |
Bu özellikle ilgili yazma veya bildirimde bulunmadan önce, paylaşılan gizli bilgiler için FE2C1234-8366-4814-8EB0-01DE32100BEA özelliği üzerinden el sıkışma işlemi yapılması gerekir. Bu özellikten akan verileri şifrelemek için AES-CTR kullanılır. Bu algoritma aşağıda tanımlanmıştır. Bu mod, tek bir 16 baytlık bloktan daha büyük verilerde daha güvenlidir. Veri bütünlüğünü sağlamak için HMAC-SHA256 kullanılacaktır. Bu da aşağıda tanımlanmıştır.
| Sekizlik | Açıklama | Değer |
|---|---|---|
| 0 - 7 | HMAC-SHA256'nın ilk 8 baytı. | değişir |
| 8 - 15 | AES-CTR şifrelemesi tarafından kullanılan nonce. | değişir |
| 16 - var | Şifrelenmiş veriler. | değişir |
Tablo 3.1: Sağlayıcı tarafından Arayıcı'ya bir bildirim aracılığıyla veya Arayıcı tarafından Sağlayıcı'ya bir yazma işlemi aracılığıyla gönderilen veri paketi.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - var | byte array |
Veriler | değişir. Tablo 1.2.2'nin veri kimliğine göre kodunu çözün:
|
Tablo 3.2: Ham veriler. Tablo 3.1'deki şifrelenmiş verilerden şifresi çözülmüştür.
Bildirim istendiğinde (ör. Tablo 1.2.1'deki Bit 2 aracılığıyla kişiselleştirilmiş ad isteğinde bulunulduğunda) Hızlı Eşleme Sağlayıcı aşağıdaki işlemleri yapmalıdır:
- Nonce için kriptografik olarak rastgele 8 bayt oluşturun.
Verileri AES-CTR kullanarak şifreleyin. Burada her 16 baytlık blok,
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))burada
- AES anahtarı, prosedürdeki 4. adımda paylaşılan gizli bilgidir.
- clearBlock[i], data[i * 16] ile başlayan 16 baytlık bir bloktur. Son blok 16 bayttan kısa olabilir.
Şifrelenmiş verileri oluşturmak için concat(encryptedBlock[0], encryptedBlock[1],...) işlevini uygulayın.
Aşağıdaki yöntemle HMAC-SHA256 oluşturun:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))burada
- K, concat(shared_secret, 48-byte ZEROs) ile oluşturulur. shared_secret, prosedürdeki 4. adımdan alınır.
- opad, 64 baytlık dış dolgudur ve değeri
0x5Colan tekrarlanan baytlardan oluşur. - ipad, 64 baytlık iç dolgudur ve değeri
0x36olan tekrarlanan baytlardan oluşur.
Data packet'in öneki olarak HMAC-SHA256'dan ilk 8 baytı alın.
Yazma isteği alındığında Hızlı Eşleme Sağlayıcı aşağıdaki işlemleri yapmalıdır:
- HMAC-SHA256'nın ilk 8 baytını kontrol ederek verilerin bütünlüğünü doğrulayın.
Şifrelenmiş verilerin şifresini AES-CTR kullanarak çözün. Burada her blok,
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))burada
- encryptedBlock[i], encrypted_data[i * 16] ile başlayan 16 baytlık bir bloktur. Son blok 16 bayttan kısa olabilir.
- AES anahtarı, el sıkışma işleminden oluşturulur veya tanımlanır. Örneğin:
- Adlandırma akışı 1'de ECDH'den alınır ve bu eşleme için tekrar kullanılmaz. Prosedür yeniden başlatılmadan bu anahtarla şifrelenmiş olarak gelen tüm istekler reddedilmelidir.
- Adlandırma akışı 2'de ise hesap anahtarıdır.
Ham verileri oluşturmak için concat(clearBlock[0], clearBlock[1],...) işlevini uygulayın.