特性
GATT 服務的服務和特性
快速配對供應商應提供下列 GATT 服務。
服務 | UUID |
---|---|
快速配對服務 | 0xFE2C |
這項服務應具備下列特性。
自訂特性
快速配對服務特性 | 經過加密 | 權限 | UUID |
---|---|---|---|
模型 ID | 否 | 讀取 | FE2C1233-8366-4814-8EB0-01DE32100BEA |
金鑰配對 | 否 | 撰寫及通知 | FE2C1234-8366-4814-8EB0-01DE32100BEA |
密碼金鑰 | 否 | 撰寫及通知 | FE2C1235-8366-4814-8EB0-01DE32100BEA |
帳戶金鑰 | 否 | 寫入 | FE2C1236-8366-4814-8EB0-01DE32100BEA |
標準特性
名稱 | 經過加密 | 權限 | UUID |
---|---|---|---|
韌體修訂版本 | 否 | 讀取 | 0x2A26 |
特性:型號 ID
這個特性可讓 Seeer 視需要讀取模型 ID (裝置以探索模式放送廣告除外)。系統應一律會傳回下列資料:
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 至 2 次 | uint24 |
模型 ID | 不一定 |
特性:按鍵配對
這項特性可控制金鑰配對程序。在此程序中,會確認 Seeker 和 Provider 都擁有預先共用金鑰,藉此建立一定的信任程度。每個案例中的金鑰都不同:
案例 1:預先共用金鑰以防假冒公開/私密金鑰配對以及 Seeker 自己的公開/私密金鑰配對為基礎,每次配對時都會變更。
- 提供者處於配對模式。
- 搜尋器會驗證供應器是否擁有防假冒私密金鑰。
請注意,在配對模式下,供應商也可以照常使用配對功能,例如與不支援快速配對金鑰配對的裝置配對。
案例 2:預先共用金鑰是其中一個帳戶金鑰。
- 提供者通常不是配對模式。但這並非強制要求。即使在配對模式下,提供者仍應使用帳戶金鑰。
- 搜尋器和提供者會驗證另一個憑證是否屬於另一個帳戶金鑰。
由於這兩種情況都非常類似,除非使用了預先共用金鑰,否則會在程序中合併這些組合。
資料格式
請參閱程序,瞭解各種格式的使用方式。
小八 | 資料類型 | 說明 | 值 | 必填? |
---|---|---|---|---|
0 - 15 | uint128 |
加密要求 | 不一定 | 必填 |
16 - 79 人 | 公開金鑰 | 不一定 | 選用 |
表 1.1:加密要求,由 Seeker 描述的特性。
小八 | 資料類型 | 說明 | 值 | 必填? |
---|---|---|---|---|
0 | uint8 |
訊息類型 | 0x00 = 金鑰配對要求 |
必填 |
1 | uint8 |
旗幟
|
多樣性 | 必填 |
2 - 7 | uint48 |
方法:
|
多樣性 | 必填 |
8 - 13 個 | uint48 |
搜尋者的巴西 BR/EDR 地址 | 多樣性 | 只有在已設定標記 1 或 3 時才會顯示 |
n - 15 個 | 隨機值 (鹽) | 多樣性 | 必填 |
表 1.2.1:原始要求 (類型 0x00)。已從表 1.1 的加密要求解密。
小八 | 資料類型 | 說明 | 值 | 必填? |
---|---|---|---|---|
0 | uint8 |
訊息類型 | 0x10 = 動作要求 |
必填 |
1 | uint8 |
旗幟 | 多樣性 | 必填 |
2 - 7 | uint48 |
方法:
|
多樣性 | 必填 |
8 | uint8 |
訊息群組 | 多樣性 | 如果旗標 0 |
9 | uint8 |
訊息代碼 | 多樣性 | 如果旗標 0 |
10 | uint8 |
視旗標而定:
|
多樣性 | 如果旗標 0 或 1 已設定,就必須使用這項屬性 |
11 - n 鍵 | 額外資料 | 多樣性 | 選用 | |
n - 15 個 | 隨機值 (鹽) | 多樣性 | 必填 |
表 1.2.2:原始要求 (類型 0x10)。已從表 1.1 的加密要求解密。
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 | uint8 |
訊息類型 | 0x01 = 金鑰配對回應 |
1 至 6 個 | uint48 |
供應商的公開 (BR/EDR) 地址 | 多樣性 |
7 - 15 個 | 隨機值 (鹽) | 多樣性 |
表 1.3:原始回應。經過加密以產生表 1.4 中的加密回應。
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 至 15 個 | uint128 |
加密回應 | 多樣性 |
表 1.4:加密回應,由供應者透過通知傳送至 Seeker。
特性:密碼金鑰
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 - 15 | uint128 |
加密密碼區塊 | 多樣性 |
表 2.1:加密密碼區塊區塊。如要瞭解使用方式,請參閱金鑰式配對程序。
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 | uint8 |
訊息類型 | 下列其中一項權限:
|
1 至 3 個 | unit32 |
6 位數密碼金鑰 | 多樣性 |
4 - 15 人 | 隨機值 (鹽) | 多樣性 |
特性:帳戶金鑰
配對完成後,快速配對搜尋工具會將帳戶金鑰寫入快速配對提供者。
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 - 15 | uint128 |
帳戶金鑰 (已加密) | 多樣性 |
收到書寫要求時,快速配對提供者應執行下列事項:
- 使用程序中步驟 4 產生的共用密鑰來解密帳戶金鑰。
- 解密前,請確認共用密鑰是使用步驟 12 中的密碼金鑰要求解密。如果這個步驟並未使用這個密鑰完成,請忽略這個寫入並退出。
- 此時,共用密鑰 (程序中的 K) 不會再用於此配對。凡是使用這組金鑰加密且不重新啟動程序的要求,都應遭到拒絕。
- 確認解密值開頭為
0x04
。否則請忽略這個寫入並退出。 - 檢查保留的「Account Key list」(帳戶金鑰清單) 是否有新的值。
- 如果不是,請從清單中刪除最近使用的值。
- 在清單中加入新值。
清單中的帳戶金鑰在金鑰配對期間使用。
特性:韌體修訂版本
這項特性可讓 Finder 視需要讀取供應器韌體的修訂版本。系統應一律會傳回下列資料:
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 - var | utf8s |
韌體修改程式碼 | 多樣性 |
即使供應程式上有多個韌體 (例如:左耳機、右耳機和充電盒都有 3 個韌體),仍應封裝為單一 utf8 字串,提供者也可針對特殊情況傳回特定字串:
status-update:如果供應商正在更新至新韌體。 「供應商」也可能會傳回階段韌體的版本。
status-abnormal:如果供應商處於異常狀態時。例如,由於韌體更新失敗,所以故障了。這個值會讓 Finder 顯示訊息,通知使用者必須立即更新訊息。
特性:其他資料
這項服務應具備下列特性。
快速配對服務特性 | 經過加密 | 權限 | UUID |
---|---|---|---|
Data | 否 | 撰寫及通知 | FE2C1237-8366-4814-8EB0-01DE32100BEA |
舊的快速配對服務特性 (目標將於 2021 年 1 月 1 日淘汰) | 經過加密 | 權限 | UUID |
---|---|---|---|
Data | 否 | 撰寫及通知 | 0x1237 |
在寫入或通知這個特性之前,必須具有特性 FE2C1234-8366-4814-8EB0-01DE32100BEA
的握手,才能共用共用密鑰。AES-CTR 將用於加密透過此特性傳輸的資料,演算法的定義如下。此模式對擴充超過單一 16 位元組區塊的資料更為安全。HMAC-SHA256 將用於確保資料完整性,同時也定義如下。
小八 | 說明 | 值 |
---|---|---|
0 - 7 | HMAC-SHA256 的前 8 位元組。 | 多樣性 |
8 - 15 個 | Nonce,由 AES-CTR 加密使用。 | 多樣性 |
16 - var | 加密資料。 | 多樣性 |
表 3.1:資料供應器透過供應者發送通知至 Seeker,或由 Seeer 透過寫入傳送給供應商。
小八 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 - var | byte array |
Data | varies,依據表 1.2.2 的資料 ID 解碼:
|
表 3.2:原始資料。已從表 3.1 的加密資料解密。
如果需要通知時 (例如透過表 1.2.1 中的位元 2 要求個人化名稱),快速配對提供者應執行下列操作:
- 為 Nonce 產生隨機加密的 8 個位元組。
使用 AES-CTR 加密資料,其中每個 16 位元組區塊都是使用
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
其中
- AES 金鑰是程序中步驟 4 的共用密鑰。
- ClearBlock[i] 是從資料 [i * 16] 開始的 16 位元組區塊。最後一個區塊可以少於 16 個位元組。
執行 Concat(encryptedBlock[0], encryptedBlock[1],...) 以建立加密資料。
產生 HMAC-SHA256:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
其中
- K 是由 concat(shared_secret, 48-byte ZEROs) 產生,shared_secret 從程序的步驟 4 產生。
- opad 是 64 個位元組的外邊框間距,包含值為
0x5C
的重複位元組。 - ipad 的內部填充為 64 個位元組,由值為
0x36
的重複位元組所組成。
從 HMAC-SHA256 擷取前 8 個位元組做為資料包的前置字串。
收到書寫要求時,快速配對提供者應執行下列事項:
- 請檢查 HMAC-SHA256 的前 8 位元組,藉此驗證資料的完整性。
使用 AES-CTR 解密已加密的資料,其中每個區塊都會使用
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
其中
執行 Concat(clearBlock[0], clearBlock[1],...) 建立原始資料。