这里快速配对流程分为两种情况:
初次做快速配对
- ①:Provider打开配对模式,然后进行广播
- ②: 如果Seeker发现自己感兴趣的广播,就会通过LE连接到Provider,Seeker会检查广播包的内容,发现没有account key filter,说明此设备还没有配对过。
- ③:Seeker首先发起key-based pairing request,这个request会有16字节加密数据和64字节Seeker的公钥。Provider收到此write request,利用收到的公钥和自己的私钥,通过secp256r1 ECDH产生256 bits AES key,然后调用SHA-256得到256 bits哈希值,最后取前128 bit作为AES key,我们命名为K。
- ④:Provider利用K去解析16字节加密数据,如果消息类型符合key-based pairing request数据格式,我们就认为此K有效,然后用K加密回复key-based pairing response,此response会包含6字节Provider的BR/EDR地址和9字节随机数salt,以便Seeker 发起BR连接。
- ⑤:Seeker准备开启配对之前,双方的IO Capability如果不是Display Yes/No的话,都需要临时改成Display Yes/No,这样是为了防止中间人攻击。
- ⑥:Seeker发起BR配对,配对方式是Numeric,双方会协商出6 digit也就是4字节的passkey。
- ⑦:Seeker利用K加密发送passkey request给Provider,如果Provider校验正确,则回复yes。
- ⑧:同理Provider利用K加密发送passkey request给Seeker,如果Seeker校验正确,也回复yes。
- ⑨:上述步骤都正确的话,Seeker会产生account key,这里就是K。
- ⑩: Seeker把account key通过写请求发给Provider。
- ⑪:Provider收到account key会在本地更新保持,并发个通知给Seeker。
- ⑫ 退回IO Capability到原始设置。
- ⑬:Seeker和Provider继续进行SDP,A2DP或者HFP连接。
后续做快速配对
- ①:Provider打开配对模式,然后进行广播
- ②: 如果Seeker发现自己感兴趣的广播,就会通过LE连接到Provider,发现广播包包含又account key filter,然后Seeker就会从谷歌云获取此设备的account key,再做布隆过滤器判断是否为其中的一个account key作为AES key K尝试去加密报文。
- ③:Seeker会用步骤2获取的account key加密数据发起key-based pairing request。
- ④:Provider会尝试利用本地的account key一一去解析16字节加密数据,如果某个account key解析出来的消息类型符合key-based pairing request数据格式,我们就认为此K有效,然后用K加密回复key-based pairing response,此response会包含6字节Provider的BR/EDR地址和9字节随机数salt,以便Seeker 发起BR连接。
- ⑤:Seeker准备开启配对之前,双方的IO Capability如果不是Display Yes/No的话,都需要临时改成Display Yes/No,这样是为了防止中间人攻击。
- ⑥:Seeker发起BR配对,配对方式是Numeric,双方会协商出6 digit也就是4字节的passkey。
- ⑦:Seeker利用K加密发送passkey request给Provider,如果Provider校验正确,则回复yes。
- ⑧:同理Provider利用K加密发送passkey request给Seeker,如果Seeker校验正确,也回复yes。
- ⑨:上述步骤都正确的话,Seeker会产生account key,这里就是K。
- ⑩: Seeker把account key通过写请求发给Provider。
- ⑪:Provider收到account key会在本地更新保持,并发个通知给Seeker。
- ⑫ 退回IO Capability到原始设置。
- ⑬:Seeker和Provider继续进行SDP,A2DP或者HFP连接。