浅述蓝牙Mesh的配网流程

所谓配网就是将未配网的设备变为配网的节点,一般需要一个配网器与末配网设备进行配网交互、验证然后通过后将一些密钥交给对方的一个过程。
一般过程有5个阶段:
1. 信标(Beaconing)阶段
2.邀请 (Invitation)阶段
3. 交换公钥 (Exchange Public Keys)阶段
4. 身份认证 CAuthentication)阶段
5. 分发配网数据 (Distribution Of Provisioning Data)阶段

流程图:

浅述蓝牙Mesh的配网流程_第1张图片

信标阶段:

信标阶段就是让配网器发现并选择周边未配网设备,建立连接的过程,并不是实际建立了连接,一个意义上的连接。主要是通过beacon包中UUID来判断对应需要配网的设备。对应下图中的beacon、link open、link ack过程。

beacon包的数据格式:

字段 长度 备注
length 1 beacon包长度
type 1 beacon包类型,值0x2B
beacon包类型 1 为配网beacon包类型,值为0
UUID 16 设备唯一ID
OOB信息 2 OOB信息类型
URL Hash 4 URL的Hash值

link open 数据格式:

字段 长度 备注
opcode 1 link open = 0,GPCF = 3
UUID 16 设备的UUID

link ack数据格式: 

字段 长度 备注
opcode 1 link ACK = 0,GPCF = 3

邀请阶段:


邀请阶段主要是交互诸奶设备能力等信息,这些信息用于后续的配网流程。配网能力消息用来表示当前设各支持的配网能力,其参数包括加密算法、公钥类型、静态OOB 类型、最大输出 0OB 大小、是否支持 OOB 输出行为、最大输入 OOB大小、是否支持 OOB 输入行为。

Provisioning invite数据格式:

字段 长度 备注
Attention Timeout 1 提醒用户配网时间

 Provisioning capability数据格式

字段 长度 备注
Number of ELements 1 设备含有的元素数
Algorithm 2 配网算法,目前仅支持P-256ECDH
Public Key Type 1 设备的公钥类型,是否支持OOB
static OOB type 1 是否支持静态OOB
Output OOB size 1 输出式OOB的最大信息长度
Output OOB Action 2 输出式OOB的输出动作类型
Input OOB Size 1 输入式OOB的最大信息长度
Input OOB Action 2 输入式OOB的输入动作类型


交换公钥阶段:


蓝牙mesh 协议规定在交换公钥阶段,可以使用两种算法交换设备的 ECDH 公共密钥:通过蓝牙通道进行明文交换,通过00B 隧道进行交换。在邀请阶段,设备会告知配网器是否存在 00B 公钥,而配网器在交换公钥的第1条信息中,则告知设备是否使用 OOB 公钥。使用 00B 公钥交互方式可以较为可靠地预防中间人攻击,对安全性有很大的提升。当邀请阶段结束后,配网器即开始与末配网设备进入交换公钥的交互流程。
provisiooing start (配网开始)消息由配网器发送给未配网设备。
配网开始消息表示配网器告诉未配网设备公钥交换流程开始,配网需从前面的provisioning Capabiliy (配网能力) 消息中选择公钥交换流程的具体參数。

数据格式:

字段 长度 备注
Algorithm 1 配网算法,目前仅支持P-256ECDH
Public Key 1 设备端是否使用OB公钥
Authentication Method 1 身份认证模式选择
Authentication Action 1 OOB模式下的认证行为
Authentication Size 1 OOB模式下的认证长度

Provisioning Public Key
Provisioning Public Key(配网公钥)消息由配网器发送给设备,是配网器的公钥,配网公钥消息包含X和Y两部分。

字段 长度 备注
Public Key X 32 公钥X的部分
Public Key Y 32 公钥Y的部分

身份认证 阶段:

在此步骤中,启动配置设备使用所选的验证方法,对未经启动配置设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):输出OOB(Output OOB)、输入OOB(Input OOB)、以及静态OOB(Static OOB)或无OOB(No OOB)。 


输出带外(Output OOB)


    若选择的是输出带外(Output OOB)验证方法,则未经启动配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字。例如,如果未经启动配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有LCD屏幕,则可以将随机数显示为多位数值。启动配置设备(Provisioner)的用户需要输入观察到的数字,来验证未经启动配置的设备。输出带外验证方法的工作流程如图1所示。

                                                                         

浅述蓝牙Mesh的配网流程_第2张图片

  
                                                     图1 – 通过输出OOB进行验证
    输入随机数后,启动配置设备(Provisioner)生成并检查确认值。无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的,请继续往下看。


 输入带外(Input OOB)


    输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,但设备的角色相反。启动配置设备(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经启动配置的设备。以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数。
    与输出带外验证(Output OOB)相比,输入带外(Input OOB)方法需要发送一个附加的启动配置协议PDU。在完成认证操作之后,未经启动配置的设备向启动配置设备发送一个启动配置输入完成PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。

                                                                         

浅述蓝牙Mesh的配网流程_第3张图片


                                                     图 2 – 通过输入OOB进行验证

 静态带外(Static OOB) 或无带外(No OOB) 


    在输入带外或输出带外都不可用的情况下,启动配置设备(Provisioner)和未经启动配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:采用静态OOB信息;或静态OOB信息不可用,直接以数值0代替。在此情况下,启动配置设备和未经启动配置的设备各自生成一个随机数,然后进行检查确认值操作。
    检查确认值(Check Confirmation Value)
    无论采用何种验证方法,都会进行确认值生成和检查。根据蓝牙mesh规格,启动配置设备(Provisioner) 和未经启动配置设备应分别计算确认值。这两个值被称为ConfirmationProvisioner和ConfirmationDevice。这两个值的计算都使用一系列相同的函数,不同之处仅在于所使用的随机数输入。

确认值检查(Confirmation Value Check)

如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner不匹配,则启动配置(Provisioning)过程将被中止。
    如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner匹配,则未经启动配置设备将其RandomDevice值发送给启动配置设备。
    然后,启动配置设备(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。
    如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice不匹配,则启动配置(Provisioning)流程将被中止。
    如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice匹配,则表示验证成功。后续只要启动配置设备(Provisioner)和未经启动配置设备完成启动配置流程的第五步:启动配置数据分发,则未经启动配置设备就能成为蓝牙mesh网络中的节点(node)。  

分配配网数据

 为安全地进行启动配置数据分发,启动配置设备(Provisioner)采用AES-CCM ,借助共享的会话密钥(SessionKey)对启动配置数据(provisioning data)进行加密,启动配置设备和未经启动配置设备都会进行计算。 AES-CCM需要三个输入参数:会话密钥、会话随机数和纯文本。

启动配置设备(Provisioner)和未经启动配置设备都需要生成会话密钥(SessionKey)和会话随机数(SessionNonce)。当SessionKey和SessionNonce值准备就绪时,启动配置设备将对包含导出启动配置数据的启动配置数据PDU (Provisioning Date PDU) 进行加密,并将其发送至未经启动配置的设备。此处,相同的SessionKey和SessionNonce值也可用来对接收到的数据进行解密。
    至此,启动配置流程完成。两台对等设备都已知晓新的设备密钥(DevKey)和全网的网络密钥(NetKey),这就意味着我们的新设备已成为蓝牙mesh网络中的节点(node)和成员。

你可能感兴趣的:(嵌入式,BLE&BLE,MESH,协议,蓝牙,MESH,mesh配网)