Özellikleri
Hızlı Eşleme Hizmeti
Hızlı Eşleme Sağlayıcı aşağıdaki GATT hizmetine sahip olmalıdır.
| Hizmet | UUID |
|---|---|
| Hızlı Eşleme Hizmeti | 0xFE2C |
Bu hizmet aşağıdaki özelliklere sahip olacaktı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 | Yaz ve bildir | 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 Bilgileri 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ı Sürümü | 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:
| Sekizli | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - 2 | uint24 |
Model Kimliği | değişir |
Özellik: Anahtar Tabanlı Eşleme
Bu özellik, anahtar tabanlı eşleme prosedürünü kontrol eder. Bu prosedürde, Arayan ve Sağlayıcı'nın ö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. durum: Önceden paylaşılmış anahtar, sahteciliğe karşı koruma için kullanılan ortak/özel anahtar çiftine ve her eşleştirme denemesinde değişecek olan Seeker'ın kendi ortak/özel anahtar çiftine dayanır.
- Sağlayıcı, eşleme modundadır.
- Arayan, Sağlayıcı'nın adres sahteciliğini önleme özel anahtarına sahip olduğunu doğrular.
Eşleme modundayken Sağlayıcı'nın, örneğin Hızlı Eşleme'nin anahtar tabanlı eşleme özelliğini desteklemeyen bir cihazla eşlemek için normal şekilde de eşlenebileceğ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.)
- Arayan 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ş İstek.
| Sekizli | 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 |
Şu yöntemlerden birini kullanın:
|
değişir | Zorunlu |
| 8 - 13 | uint48 |
Arayıcının BR/EDR Adresi | değişir | Yalnızca İşaretler Bit 1 veya 3 ayarlanmışsa gösterilir |
| n - 15 | Rastgele değer (salt) | değişir | Zorunlu |
Tablo 1.2.1: Ham İstek (tür 0x00). Tablo 1.1'deki Şifrelenmiş İstek'ten şifresi çözülmüştür.
| 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 |
Şu yöntemlerden birini kullanın:
|
değişir | Zorunlu |
| 8 | uint8 |
Mesaj grubu | değişir | Flags Bit 0 ayarlanmışsa zorunludur. |
| 9 | uint8 |
Mesaj kodu | değişir | İşaretler Bit 0 ayarlanmışsa zorunludur. |
| 10 | uint8 |
İşaretlere bağlıdır:
|
değişir | İşaretler Bit 0 veya 1 ayarlanmışsa zorunludur. |
| 11 - n | Ek veriler | değişir | İsteğe bağlı | |
| n - 15 | Rastgele değer (salt) | değişir | Zorunlu |
Tablo 1.2.2: Ham İstek (0x10 türü). Tablo 1.1'deki Şifrelenmiş İstek'ten şifresi çözülmüştür.
| Sekizli | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 | uint8 |
Mesaj türü | 0x01 = Anahtar Tabanlı Eşleme 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'teki Şifrelenmiş Yanıt'ı oluşturmak için şifrelenir.
| Sekizli | 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üne bakın.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 | uint8 |
Mesaj türü | Şunlardan biri:
|
| 1 - 3 | unit32 |
6 haneli 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ısı, Hızlı Eşleme Sağlayıcısı'na bir hesap anahtarı yazar.
| Sekizlik | Veri türü | Açıklama | Değer |
|---|---|---|---|
| 0 - 15 | uint128 |
Hesap anahtarı (şifrelenmiş) | değişir |
Yazma isteği alan Hızlı Eşleme Sağlayıcı aşağıdakileri 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 anahtarın 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ürde 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 işlemi, özelliğe özel bir etkinlik veya zaman aşımı ile tetiklenir. LE Ses Paylaşımı için geçici oturumun bağlantısı kesildikten 10 dakika sonra BDE 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ı Sürümü
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:
| Sekizli | 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 donanım yazılımı (ör. sol kulaklık, sağ kulaklık ve kılıf için 3 donanım yazılımı) olsa bile tek bir UTF-8 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 kullanılır. Alternatif olarak, Sağlayıcı, hazırlanan 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ğu için arızalanmış olabilir. Bu değer, Seeker'ın kullanıcıya uygulamanın güncellenmesi 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ı bulunabildiğinde herhangi bir cihaz erişebilir.
Sağlayıcı, Cihaz Takip Merkezi'ni destekliyorsa ek uygulama gerekir. Ayrıntılar için Cihaz Takip Merkezi donanım yazılımı güncellemeleri başlıklı makaleyi inceleyin.
Ö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 | Yaz ve bildir | 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 özelliğe yazmadan veya bildirim göndermeden önce, paylaşılan gizli bilgiye sahip olmak için FE2C1234-8366-4814-8EB0-01DE32100BEA özelliği aracılığıyla el sıkışma yapılmalıdır. Bu özellik üzerinden akan verileri şifrelemek için AES-CTR kullanılır. Algoritması 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ılır. Bu da aşağıda tanımlanmıştır.
| Sekizli | 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 tek seferlik rastgele sayı. | değişir |
| 16 - var | Şifrelenmiş veriler. | değişir |
Tablo 3.1: Sağlayıcı tarafından bildirim yoluyla Arayıcı'ya gönderilen veya Arayıcı tarafından yazma yoluyla Sağlayıcı'ya gönderilen veri paketi.
| Sekizli | 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ği) Hızlı Eşleme Sağlayıcı aşağıdakileri yapmalıdır:
- Nonce için kriptografik olarak rastgele 8 bayt oluşturun.
Verileri AES-CTR kullanarak şifreleyin. Her 16 baytlık blok, şu kullanılarak oluşturulur:
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))burada
- AES anahtarı, prosedürdeki 4. adımda paylaşılan gizli anahtardır.
- 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şlemini gerçekleştirin.
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) tarafından oluşturulur. shared_secret, prosedürdeki 4. adımdan alınır.
- opad,
0x5Cdeğerine sahip yinelenen baytlardan oluşan 64 baytlık dış dolgudur. - ipad,
0x36değerine sahip yinelenen baytlardan oluşan 64 baytlık iç dolgudur.
HMAC-SHA256'dan ilk 8 baytı veri paketinin ön eki olarak alın.
Yazma isteği alan Hızlı Eşleme Sağlayıcı aşağıdakileri 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üçük olabilir.
- AES anahtarı, el sıkışmadan 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.