• 浅述蓝牙Mesh的配网流程


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

    流程图:

    信标阶段:

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

    beacon包的数据格式:

    字段长度备注
    length1beacon包长度
    type1beacon包类型,值0x2B
    beacon包类型1为配网beacon包类型,值为0
    UUID16设备唯一ID
    OOB信息2OOB信息类型
    URL Hash4URL的Hash值

    link open 数据格式:

    字段长度备注
    opcode1link open = 0,GPCF = 3
    UUID16设备的UUID

    link ack数据格式: 

    字段长度备注
    opcode1link ACK = 0,GPCF = 3

    邀请阶段:


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

    Provisioning invite数据格式:

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

     Provisioning capability数据格式

    字段长度备注
    Number of ELements1设备含有的元素数
    Algorithm2配网算法,目前仅支持P-256ECDH
    Public Key Type1设备的公钥类型,是否支持OOB
    static OOB type1是否支持静态OOB
    Output OOB size1输出式OOB的最大信息长度
    Output OOB Action2输出式OOB的输出动作类型
    Input OOB Size1输入式OOB的最大信息长度
    Input OOB Action2输入式OOB的输入动作类型


    交换公钥阶段:


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

    数据格式:

    字段长度备注
    Algorithm1配网算法,目前仅支持P-256ECDH
    Public Key1设备端是否使用OB公钥
    Authentication Method1身份认证模式选择
    Authentication Action1OOB模式下的认证行为
    Authentication Size1OOB模式下的认证长度

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

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

    身份认证 阶段:

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


    输出带外(Output OOB)


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

                                                                             

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


     输入带外(Input OOB)


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

                                                                             


                                                         图 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)和成员。

  • 相关阅读:
    2024初三集训模拟测试1
    报错分析nest--嵌套
    0源码基础学习Spring源码系列(一)——Bean注入流程
    作业-11.23
    怎么安全加密文件?文件加密软件哪个安全?
    【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
    Fragment版本MVVM入门
    【web-攻击会话管理】(4.2.2)会话令牌生成过程中的薄弱:令牌可预测
    【web-攻击用户】(9.3.1)诱使用户执行操作--请求伪造——本站、跨站
    科技驱动固定资产管理变革:RFID技术的前沿应用
  • 原文地址:https://blog.csdn.net/qq_38531460/article/details/125509061