蓝牙mesh IV Index Update

IV Update就是指IV Index Update。是为了解决序列号SeqNumber耗尽的问题。

1.什么是IV Index

IV Index 是一个 32 位的值,它是共享网络资源(即,mesh网络中的所有节点共享相同的 IV Index 值并将其用于它们所属的所有子网)。

IV 索引从 0x00000000 开始,并在 IV 更新过程中递增。值增加的时间不必精确,因为最低有效位在每个网络 PDU 内进行通信。由于 IV Index 值是 32 位值,因此在 IV Index 结束之前,mesh网络可以运行大约 5 万亿年。

IV 索引通过安全网络信标(Secure Network beacon)在网络内共享。在子网上收到的 IV Update被处理并传播到该子网。设备通过给特定子网传输具有 IV Update IndexSecure Network beacons来进行传播。如果主子网上的设备接收到主子网上的更新,它应将 IV 更新传播到所有其他子网。如果主子网上的设备在任何其他子网上收到 IV 更新,则应忽略更新。

如果一个节点在一段时间内不在mesh网络中,它可以扫描安全网络信标或使用 IV 索引恢复过程。

2.蓝牙mesh安全网络信标

安全网络信标(Secure Network beacon)是蓝牙Mesh beacons 的一种, Mesh beacons 是由节点和未配网设备周期性发出的广播数据包。

2.1.安全网络信标(Secure Network beacon)

节点使用安全网络信标来识别子网及其安全状态。格式以及各字段的含义如下:


Secure Network beacon格式.png
字段(按顺序) 长度(字节) 注释
Beacon Type 1 Secure Network beacon (0x01)
Flags 1 Contains the Key Refresh Flag and IV Update Flag
Network ID 8 Contains the value of the Network ID
IV Index 4 Contains the current IV Index
Authentication Value 8 Authenticates security network beacon

第二个字节Flags的定义如下:

位数 定义
0 Key Refresh Flag
1 IV Update Flag
2~7 保留供以后使用

Network ID: 在包含多个网络时,每个网络都有一个唯一的id.

Authentication Value 字段的计算定义如下:

Authentication Value = AES-CMAC (Flags || Network ID || IV Index) [0–7],使用BeaconKey。
Secure Network beacon生成过程.png

2.2.安全网络信标行为(behavior)

当在已知子网上接收到安全网络信标并通过身份验证时,节点应监视 IV 索引更新密钥刷新过程。为了验证安全网络信标,节点计算验证值Authentication Value并检查它是否等于接收到的安全网络信标中的验证值Authentication Value字段。

可以为节点所属的每个子网发送安全网络信标,以识别子网并通知 IV 索引更新和密钥刷新过程。

Relay 和 Friend 节点建议发送信标,其他节点之间可以看情况发送信标。发送两个连续信标之间的时间称为信标间隔。一个实现可以定义信标间隔和一个回退过程,以防止其他节点因过多的信标而使网络过载。 预期的行为是每个节点大约每 10 秒收到一个给定子网的信标。

对于每个子网,为了确定信标间隔,节点应连续观察信标,并在给定观察期内保持子网信标数量的滚动计数。 信标间隔应使用以下公式确定:

Beacon Interval = Observation Period * (Observed Number of Beacons + 1) / Expected Number of Beacons

如果计算出的 Beacon Interval 小于 10 秒,则应将其设置为 10 秒。 如果计算的 Beacon Interval 大于 600 秒,则应将其设置为 600 秒。

以秒为单位的观察周期(Observation Period)通常应该是典型信标间隔的两倍。 每个子网都有一个单独的安全网络信标,因此,每个子网的预期信标数(Expected Number of Beacons)观察到的信标数(Observed Number of Beacons)和观察周期可能不同。

Observed Number of Beacon 是在观察期内为此子网观察到的信标数量。

预期的信标数量是观察周期除以 10 秒。

2.3.App端发送安全网络信标

手机App作为配网器节点,怎么实现发送Secure Network beacon?手机端是通过代理协议实现蓝牙mesh协议栈,手机端是主机角色,没法以从机身份向外发广播。好在代理协议本就支持mesh beacons消息,而不用手机发送。

代理协议(proxy protocol使节点能够通过面向连接的承载器发送和接收网络 PDU、mesh beacons、代理配置消息和配网 PDU。

例如,一个节点可以支持 GATT,但不能广播 。 该节点将与另一个同时支持 GATT 承载器和广播承载器的节点建立 GATT 连接,使用 Proxy 协议在这些承载器之间转发消息。

2.3.1开启或关闭节点的安全网络信标

ConfigBeaconGet是一个确认消息,没有参数,用于获取节点当前的安全网络信标状态。返回消息是ConfigBeaconStatus

ConfigBeaconSet是一个确认消息,用于设置节点的安全网络信标状态。返回消息是ConfigBeaconStatus。包含一个参数:新的安全网络信标状态。

3.IV Update procedure

3.1概述

IV 索引为应用层和网络层中用于认证加密 (AES-CCM) 的随机数提供熵。 因此,必须经常更改它以避免在nonce中重复使用sequence numbers。 IV 更新过程由作为主子网成员的任何节点启动。 当节点认为它有耗尽其序列号的风险时,或者它确定另一个节点即将耗尽其序列号(sequence numbers)时,可以这样做。 节点更改其 IV 索引并向网络中的其他节点发送 IV 索引正在更新的指示。 然后,网络中的相同或某个其他节点会更改回正常操作

在密钥索引不同于 0x000 的连接子网上,至少一个安全网络信标状态设置为 1 的节点也必须位于主子网上。

IV 更新程序定义了两种操作状态:

  • Normal Operation: IV Update Flag = 0
  • IV Update in Progress:IV Update Flag = 1
  1. 在正常操作状态期间,安全网络信标和朋友更新消息中的 IV 更新标志应设置为 0。
  2. 当此状态处于活动状态时,节点应使用当前 IV Index进行传输,并应处理来自当前 IV Index 以及当前的 IV Index - 1的消息。

例如, IV Update Flag 设置为 0, current IV Index 等于 0x00101847 时,这个节点发送消息的 IV Index为0x00101847,接收消息的两种情况:

  • 网络层的 IVI 字段设置为 1时,IV Index为0x00101847。
  • 网络层的 IVI 字段设置为 0时,IV Index为 0x00101846 。

3.2 接收SNB处理

情况一

如果正常操作中的节点,接收到一个安全网络信标,其 IV Index大于最后一个已知 IV Index + 1 ,它可以启动 IV 索引恢复过程(IV Index Recovery procedure)。

情况二

如果正常操作中的节点,接收到一个安全网络信标,其 IV Index等于最后一个已知的 IV Index +1 并且 IV 更新标志设置为 0,则该节点根据

  1. 根据自上次 IV Update以来的时间
  2. 节点错过 IV update Flag设置为 1 安全网络信标的可能性

做出如下三种可能的选择

  • 可能会直接更新其 IV 而不进入 IV Update正在进行状态,
  • 或者它可能会启动 IV 索引恢复过程,
  • 或者它可能会忽略安全网络信标。

情况三

如果正常操作中的节点,接收到一个安全网络信标,其 IV Index小于最后一个已知 IV Index或大于最后一个已知 IV Index + 42 ,则应忽略安全网络信标。
注意:上述要求允许节点离开网络 48 周。 必须给离开网络超过 48 周的节点重新配网。

如果此节点是主子网的成员,并且在子网上接收到 IV Index大于主子网最后一个已知 IV 索引的安全网络信标,则应忽略安全网络信标。(这里可以应用于一个场景,可以给客人开一个子网络,客人用完后,刷新IV Index。)

3.3其他规定:

  1. 节点启动 IV Update过程的频率不得超过每 192 小时一次。

  2. 在正常操作中运行 96 小时后,节点可以通过转换到 IV 更新进行中状态来启动 IV 更新过程。 当节点从正常操作状态转换到 IV 更新进行中状态时,节点上的 IV 索引应增加 1。

  3. 从正常操作状态到 IV 更新进行中状态的转换必须在序列号用完之前至少 96 小时发生。

  4. 处于正常操作状态的节点接收并接受 IV 更新标志设置为 1 的安全网络信标(指示 IV 更新进行中状态)应尽快转换到 IV 更新进行中状态。

  5. 在 IV 更新进行中状态期间,安全网络信标和好友更新消息中的 IV 更新标志应设置为 1。当此状态处于活动状态时,节点应使用当前 IV Index - 1 进行传输,并处理接收消息 从current IV index - 1 以及current IV index。

    例如,如果在从 Normal Operation 状态转换到 IV Update in Progress 状态之前 IV Index 为 0x00101847,则转换后 ,IV Update Flag 将为 1,当前 IV Index 将为 0x00101848。节点应使用 IV 索引 0x00101847 进行发送,并接收如下两种情况的消息:

    (1)在网络层中的 IVI 字段设置为 1 时,使用 IV 索引 0x00101847 接收消息;

    (2)当网络层中的 IVI 字段设置为 0 时,使用 IV 索引 0x00101848 接收消息。

    这允许所有处于正常操作状态的节点使用旧的 IV 索引向该节点发送消息,该节点向那些尚未转换的节点发送消息。

  6. 在 IV Update in Progress 状态下运行 96 小时至 144 小时之间时,节点应转换回 IV Normal Operation 状态并且不更改 IV Index。 在转换点,节点应将序列号重置为 0x000000。

    例如,当转换回正常操作状态时,IV 更新标志将为 0,当前 IV 索引将为 0x00101848,节点应使用 IV 索引 0x00101848 发送,并接收如下两种情况的消息:

    (1)当网络层中的 IVI 字段设置为 1 时,使用 IV 索引 0x00101847 接收的消息

    (2)当网络层中的 IVI 字段设置为 0时,使用 IV 索引0x00101848接收的消息。

    这允许节点向网络中的所有节点发送消息,无论它们是否也处于正常操作状态或处于 IV 更新进行中状态。 它还允许节点从处于正常操作状态或 IV 更新进行状态的所有节点接收消息。

    下表提供了 IV 更新程序的摘要:

    IV Index Flag Procedure State Accepted transmitting
    n 0 Normal n-1, n n
    n+1 1 In Progress n,n+1 n
    n+1 0 Normal n,n+1 n+1
  1. 处于 IV 更新进行中状态的节点,接收并接受了 IV 更新标志设置为 0(指示正常操作状态)的安全网络信标,应尽快转换到正常操作状态。

    当节点已发送分段访问消息或分段控制消息而未接收到相应的分段确认消息时,节点应将状态更改从进行中的 IV 更新推迟到正常操作,如本程序所定义。当收到适当的段确认消息或达到此消息传递的超时时间时,应执行延迟的状态更改。

    注意:此要求是必要的,因为在完成 IV 更新过程后,序列号将重置为 0x000000,并且 SeqAuth 值将无效。

  2. 当一个节点被添加到网络中时,该节点被赋予一个 IV 索引。如果在网络处于正常运行状态时将节点添加到网络,则它应在正常运行状态下运行至少 96 小时。如果在网络处于 IV Update in Progress 状态时将节点添加到网络,则应赋予该节点新的 IV Index 值并在正常操作中运行至少 96 小时。

3.4 天猫精灵在IV Index Update的约定

天猫精灵蓝牙mesh基础规范

天猫精灵蓝牙mesh对IV Update的约定.png

4 IV Update test mode

为了实现 IV 更新过程的有效测试,节点应支持 IV 更新测试模式,用于与蓝牙认证过程相关的测试。 测试模式的激活应在本地执行(通过硬件或软件接口)。 IV Update 测试模式仅取消了 96 小时的限制; 设备的所有其他行为应保持不变。

IV 更新测试模式中定义了两个信号: • Transit to IV Update in Progress 信号 • 转为正常信号 当接收到 Transit to IV Update in Progress 信号时,节点应在 进度状态,忽略 96 小时限制。 当接收到 Transit to Normal 信号时,节点应转换到 Normal 状态,忽略 96 小时限制。

5 IV Index Recovery procedure

一个节点应该支持IV索引恢复过程,因为一个节点长时间远离网络可能会错过IV更新过程,在这种情况下它不能再与其他节点通信。为了恢复 IV 索引,节点必须侦听安全网络信标,其中包含网络 ID 和当前 IV 索引。在接收并成功验证其 IV 索引比当前已知 IV 索引高 1 或更多的主子网的安全网络信标后,节点应根据此安全网络中的值设置其当前 IV 索引及其当前 IV 更新过程状态信标。
注意:在 IV 指数恢复程序更新 IV 指数后,改变 IV 更新程序状态的 96 小时时间限制(如 IV 更新程序中定义)不适用。
鉴于节点每 10 秒集体传输一次安全网络信标,低占空比节点将必须平均侦听 5 秒以在传输和接收网格消息之前恢复当前的 IV 索引。如果 Low Power 节点没有足够的电量来监听 5 秒,那么它必须通过至少每 96 小时轮询一次它的 Friend 节点来保持与当前 IV 索引的最新状态。
节点在 192 小时内不得执行超过一次的 IV 索引恢复。

你可能感兴趣的:(蓝牙mesh IV Index Update)