AliGenie BLE Mesh Provisioning 整個(gè)過(guò)程
結(jié)合 Mesh Spec 1.0.1 和 AliGenie 5.0 版本,可知天貓精靈在和設(shè)備進(jìn)行 Provisioning 過(guò)程中,最終的路線圖如下:

Beacon
在 Provisioning 的開(kāi)始階段,需要由 Device 發(fā)送 Unprovisioned Beacon 廣播包,Mesh Beacon 的廣播包格式如下:

其中 Type 字段是 ?Mesh Beacon? ,而 Beacon Type 則有兩個(gè)值可以選,

這里為 0x00 代表 Unprovisioned Device Beacon 。
而對(duì)于 Unprovisioned Beacon 類型的 Beacon Data,Spec 規(guī)定了其格式為:

第 0 個(gè)字節(jié)的 0x00 代表上述的 Unprovisioned Beacon ,Device UUID 的 16 個(gè)字節(jié)由廠家定義,AliGenie 將其定義為:
| Field | Size(Octets) | Notes |
|---|---|---|
| CID | 2 | 公司ID,設(shè)置為0x01A8:Taobao |
| PID | 1 | Bit0-3 藍(lán)牙廣播包版本號(hào),目前是0x01<br />bit4為1:一機(jī)一密<br />bit5為1:支持OTA<br />bit6~7: 00:BLE4.0<br /> 01:BLE4.2<br /> 10:BLE5.0<br /> 11:BLE5.0以上 |
| ProductID | 4 | 阿里巴巴平臺(tái)頒發(fā),一型一號(hào) |
| MAC地址 | 6 | 阿里巴巴平臺(tái)頒發(fā),一機(jī)一號(hào) |
| FeatureFlag | 1 | bit7-1:uuid版本號(hào),目前版本為1<br />bit0 0:處于未配網(wǎng)廣播狀態(tài)<br /> 1:處于靜默廣播狀態(tài) |
| RFU | 2 | 0x00 Reserved for future use |
OOB Infomation 為全 0,代表不使用任何 OOB 手段傳輸公鑰(Public Key),而是直接通過(guò) BLE 廣播包傳輸公鑰(之后會(huì)有介紹)。

最后,Beacon 里不包含 URI Hash 。
對(duì)于 Unprovisioned Beacon,AliGenie 給出了兩種狀態(tài)
- 未配網(wǎng)狀態(tài):
Device UUID里的 FeatureFlag 的 bit0 為 0,廣播時(shí)長(zhǎng) 40ms,廣播間隔 100ms,廣播持續(xù)時(shí)間默認(rèn) 10 分鐘。 - 靜默廣播狀態(tài):
Device UUID里的 FeatureFlag 的 bit0 為 1,廣播時(shí)長(zhǎng) 120ms,廣播間隔 60s,不響應(yīng) Provionser 的配網(wǎng)消息。
當(dāng) Device 處于未配網(wǎng)狀態(tài),超時(shí)后也未被配網(wǎng)時(shí),自動(dòng)進(jìn)入靜默廣播狀態(tài)。
Invitation
天貓精靈收到 Unprovisioned Beacon 時(shí),會(huì)開(kāi)始進(jìn)行 1: Invitation & Capabilities 流程:

天貓精靈首先會(huì)向設(shè)備發(fā)送 Provisioning Invite PDU,其中包含參數(shù) Attention Duration,該參數(shù)用于 Device 進(jìn)行一些操作(例如燈閃爍,蜂鳴器響)來(lái)吸引人注意的持續(xù)時(shí)間。

之后 Device 返回 Provisioning Capabilities PDU,根據(jù) AliGenie 5.0 規(guī)定,我們需要將 Static OOB Type 位置 1,而 Public Key Type,Output OOB 和 Input OOB 都不需要。

Exchange public keys
在本階段 Provisioner 和 Device 通過(guò)橢圓曲線 diffie-hellman 密鑰交換算法(ECDH)方式共同協(xié)商出了一個(gè)密鑰(Session Key),用于后續(xù)信息的加密傳輸。
關(guān)于 ECDH 的詳細(xì)介紹可以參考 BLE安全機(jī)制從入門(mén)到放棄,下面僅簡(jiǎn)單介紹一些。
ECDH 利用了橢圓曲線中的數(shù)學(xué)問(wèn)題來(lái)解決密鑰傳輸問(wèn)題,公式可抽象為:
該公式已知橢圓曲線上的點(diǎn) 、基點(diǎn)
的時(shí)候,很難求出
。其中算術(shù)符號(hào)
表示的不是普通的乘法,而是一種在橢圓曲線上的特殊算法。
以 Bob 和 Alice 為例,看其如何在有 Eve 監(jiān)聽(tīng)的情況下協(xié)商出一個(gè)密鑰。

參考上圖,Bob 利用公式 生成了公鑰
,根據(jù)上述信息可知,已知
和
很難求出
。Alice 也利用相同的方式生成了公鑰
。之后他們倆相互交換公鑰
,
,然后就可以計(jì)算出一個(gè)雙方都擁有的密鑰
:
$$
\begin{align}
DHkey &= sb * pa \
&= sb * sa * G \
DHkey &= sa * pb \
&= sa *pb * G
\end{align}
$$
上述運(yùn)算符 具有交換律,因此 Alice 和 Bob 計(jì)算的
值一致,可以用于后續(xù)加密計(jì)算。
而一直監(jiān)聽(tīng)的 Eve 只擁有數(shù)據(jù) ,
,
,根據(jù)上述公式特性,很難根據(jù)
,
, 或
計(jì)算出一個(gè)私鑰,因此無(wú)法得到上述的
,從而 Bob 和 Alice 成功在有竊聽(tīng)風(fēng)險(xiǎn)的環(huán)境中協(xié)商出了一個(gè)安全的密鑰。
再來(lái)看看 Provisioning 過(guò)程中的 Exchange public keys 階段,

天貓精靈向設(shè)備發(fā)送 Provisioning Start PDU,其攜帶的參數(shù)里 Authentication Method 表明選擇 Static OOB 認(rèn)證方式。之后雙方隨機(jī)生成一個(gè)私鑰,再根據(jù) ECDH 的公式計(jì)算出公鑰,雙方交換公鑰,再次利用 ECDH 公式即可協(xié)商出一個(gè)密鑰(ECDHKey)用于后續(xù)信息加密傳輸。當(dāng)然,在這一過(guò)程中我們走的是 2a:Start without OOB Public Key 這條路徑,如下圖:

其實(shí)還有 2b:Start using OOB Public Key 這條路徑,此時(shí) Provisioner 通過(guò) OOB 的方式獲取 Device 的公鑰,除此之外沒(méi)有其他區(qū)別,流程如下圖:

Authentication
在認(rèn)證階段,通信雙方都需要驗(yàn)證對(duì)方的身份,整體流程如下:

首先通信雙方通過(guò) Provisioning Confirmation 交換一個(gè) 128-bit 的 Confirmation 值:

Provisioner 的 Confirmation 值的計(jì)算公式如下:
其中輸入?yún)?shù)有一個(gè) RandomProvisioner 和一個(gè) AuthValue 值,Random 值是隨機(jī)生成的,而 AuthValue 則是由廠商定義,AliGenie 將其定義為:
將 ProductID,MAC,Secret 三元組通過(guò)字符串用英文逗號(hào)連接,然后進(jìn)行 SHA256 摘要計(jì)算,取前16字節(jié)。注:這里用于計(jì)算 SHA256 的英文字母全部為小寫(xiě)。SHA256 類似一個(gè) Hash 散列函數(shù),輸入是一個(gè)字符串,輸出是一個(gè) 256-bit 的散列值,AliGenie 取前 16 個(gè)字節(jié)。

Device 端也是類似的操作。
當(dāng)雙方都計(jì)算得到 Confirmation 值后,通過(guò) Provisioning Confirmation PDU 交換該值,之后 Provisioner 通過(guò) Provisioning Random PDU 發(fā)送 RandomProvisioner 值,這樣 Device 就可以利用自身的 AuthValue 和收到的 RandomProvisioenr 來(lái)驗(yàn)證收到的 Confirmation 是否正確,從而達(dá)到認(rèn)證的目的。
Distribution of provisioning data
認(rèn)證完成后,天貓精靈就準(zhǔn)備下放數(shù)據(jù)了,利用之前的 ECDHKey 生成一個(gè) session key,然后基于這個(gè) session key 將數(shù)據(jù)(network key, NetKey Index, Key Refresh Flag, IV Update Flag, IV index, unicast value)加密,通過(guò) Provisioning Data PDU 發(fā)送給 Device,若 Device 端成功接收,返回 Provisioning Complete,流程如下:

至此,Provisioning 過(guò)程結(jié)束,接下來(lái)就是 Configuration 過(guò)程了。