特性
快速配對服務
快速配對供應商應提供下列 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 |
|---|---|
| 裝置資訊服務 | 0x180A |
快速配對尋訊端會使用下列特性。
| 名稱 | 已加密 | 權限 | UUID |
|---|---|---|---|
| 韌體修訂版本 | 否 | 讀取 | 0x2A26 |
特徵:模型 ID
這項特性可讓尋找端在裝置以可偵測模式廣告以外的時間,視需要讀取型號 ID。一律應傳回下列資料:
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 - 2 | uint24 |
模型 ID | 不一 |
特徵:以金鑰為準的配對
這項特徵會控管金鑰配對程序。在這個程序中,系統會驗證搜尋者和提供者是否都擁有預先共用金鑰,藉此建立一定程度的信任。每種情況的金鑰都不同:
情況 1:預先共用金鑰是以防偽公開/私密金鑰組為基礎,以及 Seeker 自己的公開/私密金鑰組,每次嘗試配對時都會變更。
- Provider 處於配對模式。
- Seeker 會驗證 Provider 是否擁有防偽私密金鑰。
請注意,在配對模式下,供應商當然也可以透過一般方式配對,例如與不支援快速配對金鑰配對的裝置配對。
案例 2:預先共用金鑰是帳戶金鑰之一。
- Provider 通常不會處於配對模式。(但這並非必要條件,即使處於配對模式,提供者也應支援使用帳戶金鑰)。
- 「尋找者」和「提供者」各自驗證對方是否擁有帳戶金鑰。
由於這兩種情況極為相似,只有使用的預先共用金鑰不同,因此會合併在程序中。
資料格式
如要瞭解每種格式的使用方式,請參閱程序。
| 八位元 | 資料類型 | 說明 | 值 | 是否為必填欄位? |
|---|---|---|---|---|
| 0 - 15 | uint128 |
加密要求 | 各異 | 必填 |
| 16 - 79 | 公開金鑰 | 不一 | 選用 |
表 1.1:由尋找端寫入特徵的加密要求。
| 八位元 | 資料類型 | 說明 | 值 | 是否為必填? |
|---|---|---|---|---|
| 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:提供者透過通知傳送給搜尋者的加密回應。
特徵:密碼金鑰
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 - 15 | uint128 |
加密密碼金鑰區塊 | 不一 |
表 2.1:加密密碼金鑰區塊。請參閱「金鑰配對程序」一節,瞭解如何使用。
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 | uint8 |
訊息類型 | 擇一採用下列格式:
|
| 1 - 3 | unit32 |
6 位數密碼金鑰 | 不一 |
| 4 - 15 | 隨機值 (鹽) | 因人而異 |
表 2.2:原始密碼金鑰區塊。 表 2.1 的解密版本。
特徵:帳戶金鑰
配對完成後,快速配對搜尋器會將帳戶金鑰寫入快速配對供應商。
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 - 15 | uint128 |
帳戶金鑰 (已加密) | 不一 |
收到寫入要求後,快速配對供應商應執行下列操作:
- 使用程序步驟 4 產生的共用密鑰,解密帳戶金鑰。
- 需要綁定 (常見) 的供應商:
- 解密前,請確認共用密鑰已用於解密步驟 12 的密碼金鑰要求。如果這個步驟未使用此密鑰通過,請忽略此寫入並退出。
- 此時,共用密鑰 (程序中的 K) 不會再次用於這項配對。如果要求使用這組金鑰加密,但未重新啟動程序,就應拒絕。
- 需要綁定 (常見) 的供應商:
- 確認解密值開頭為
0x04或0xFF。如果不是,請忽略這次寫入並結束。- 如果值為「
0x04」:- 檢查持續性 Account Key list 是否有空間容納新值。
- 如果沒有,請從清單中刪除近期最少使用的值。
- 將新值新增至清單。
- 如果值為
0xFF:
- 如果值為「
清單中的帳戶金鑰會用於金鑰配對。
特徵:韌體修訂版本
這項特徵可讓 Seeker 視需要讀取 Provider 的韌體修訂版本。一律會傳回下列資料:
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 - var | utf8s |
韌體修訂版本代碼 | 不一 |
即使有多個韌體 (例如左耳機、右耳機和充電盒各有一個韌體),也應封裝成單一 utf8 字串。供應商也可以針對特殊情況傳回特定字串:
status-updating:如果供應商目前正在更新至新韌體。 或者,供應商可以傳回暫存韌體的版本。
status-abnormal:供應器處於異常狀態。例如,韌體更新失敗導致裝置故障。這個值會讓 Seeker 顯示訊息,告知使用者必須立即更新。
提供者應限制韌體修訂版本特性的存取權,防止裝置追蹤。建議的限制:
- 繫結裝置應隨時可存取
- 只要提供者可供偵測,任何裝置都應能存取
如果供應商支援「尋找中心」,則需要額外實作。詳情請參閱「『尋找中心』韌體更新」。
特徵:其他資料
這項服務應具備下列特性。
| 快速配對服務特性 | 已加密 | 權限 | UUID |
|---|---|---|---|
| 資料 | 否 | 撰寫並通知 | FE2C1237-8366-4814-8EB0-01DE32100BEA |
| 舊版快速配對服務特性 (預計於 2021 年 1 月 1 日淘汰) | 已加密 | 權限 | UUID |
|---|---|---|---|
| 資料 | 否 | 撰寫並通知 | 0x1237 |
寫入或通知這項特徵之前,必須透過特徵 FE2C1234-8366-4814-8EB0-01DE32100BEA 進行交握,才能取得共用密鑰。AES-CTR 會用於加密透過這項特徵傳輸的資料,其演算法定義如下。這個模式可確保資料安全,即使資料超過單一 16 位元組區塊也沒問題。HMAC-SHA256 將用於確保資料完整性,這也定義在下方。
| 八位元 | 說明 | 值 |
|---|---|---|
| 0 - 7 | HMAC-SHA256 的前 8 個位元組。 | 因人而異 |
| 8 - 15 | AES-CTR 加密使用的 Nonce。 | 不一 |
| 16 - var | 加密資料。 | 因人而異 |
表 3.1:資料封包,由供應端透過通知傳送給搜尋端,或由搜尋端透過寫入傳送給供應端。
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 - var | byte array |
資料 | 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] 是從 data[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],...) 建立原始資料。