藍牙地址
public address
- 一般寫在 固件中,不能改變的地址
- BR/EDR也同樣使用該地址
- 在log 中爲BD_ADDR參數
random address
- 另一種類型的地址,可以分爲兩種,static address和private address
- random static address 一般是開機自動產生,有host通過set random address傳遞給control
- private address 分爲resolvable 和Non-resolvable兩種類型
- 重點關注resolvable private address,這類地址可以被解析。
- 當設備同時擁有對端IRK和本地IRK的時候,就可以將resolvable private address解析成indentify address。
indentify address
- 這類地址是一個抽象的概念,故名思意,其作用就是識別設備的地址
- 如果一個設備僅支持public address, 那麼該public address 可以作爲這個設備的indentify address,在配對過程中使用
- 如果一個設備支持random static address,同樣可以作爲indentify address使用
- 如果一個設備使用的是resolvable private address, 通過IRK解析之後的地址,纔是indentify address。
RPA(resolvable private address)
IRK
- IRK是設備配對過程中,SMP 交換的信息
- 自己的IRK和對端的IRK,用來解析私有地址
- 所有已經配對過設備的IRK,在resolving list這個表中維護
RPA產生
- 爲了連接過程中的安全,我們可以用RPA地址與對端設備連接
- 每次連接,RPA地址並不是固定的地址,但是擁有IRK的設備,能夠解析RPA地址,指向相同的設備
- RPA通過IRK和pRand 產生
- 可以產生自己的RPA,也可以產生對端設備的RPA
RPA解析
- localHash = ah(IRK,pRand)
- 接收到對端的RPA之後,可以計算出對端的peerHash值,前24bit 即爲對端的hash
- localHash 與peerHash對比,就能解析出是否是曾經配對過的設備
- RPA解析的目的是:將random address轉化爲indetify address, 然後獲取到正確的LTK或者GATT cache
resolving list
- 這個列表保護一些列對端和自己的IRK配對記錄
- 列表維護在controller中,可以不經過host,完成解析RPA功能
- 此列表中的地址是inditify address,一個設備一個地址,通過確定的地址,找到正確的IRK
RPA flow
注意事項
此次bluedroid 有一個google bug
在enable RPA 之前,應該停掉所有adv,包括mutil adv
不然enable RPA 會出現錯誤error:command disallow,導致RPA功能不能正常啓動