1. Mesh数据加密流程
① AccessPDU由Opcode+Payload组成,在UTransport层进行加密,形成EncUTransportPDU,由EncAccessPDU+TransMIC组成。
② LTrans层将加密后的EncUTransportPDU和未加密的ControlPDU分包后,形成LTransportPDU。
③ Network层将目的地址DST+LTransportPDU进行加密,形成EncNetworkPDU,由EncDST和EncLTransportPDU+NetMIC组成。
④ 再将CTL,TTL,SEQ,SRC再进行混淆。
⑤ 最后在空口暴露的数据只有IVI和NID。
2. Mesh Secure Network Beacon
除了在配网期间,Mesh设备会发送Unprovisioned Beacon外,设备在运行期间还会周期的发送Secure Network Beacon,用以同步网络中的数据,维持网络的安全。
其数据格式如下:
Field | Size(octets) | Notes |
---|---|---|
Beacon Type | 1 | 0x01,表示当前Beacon类型为安全网络Beacon |
Flags | 1 | 当前网络状态。![]() Key Refresh Flag:0->未处于更新阶段;1->处于更新阶段。 IV Update Flag:0->未处于更新阶段;1->处于更新阶段。 |
Network ID | 8 | 当前的Network ID值 |
IV Index | 4 | 当前的IV Index值 |
Authentication Value | 8 | 当前网络Beacon数据的授权值,采用AES-CMAC生成。 |
其中Authentication Value计算如下:
A
u
t
h
e
n
t
i
c
a
t
i
o
n
_
V
a
l
u
e
=
A
E
S
_
C
M
A
C
B
e
a
c
o
n
K
e
y
(
F
l
a
g
s
∣
∣
N
e
t
w
o
r
k
_
I
D
∣
∣
I
V
_
I
n
d
e
x
)
[
0
−
7
]
Authentication\_Value=AES\_CMAC_{BeaconKey}(Flags||Network\_ID||IV\_Index)[0-7]
Authentication_Value=AES_CMACBeaconKey(Flags∣∣Network_ID∣∣IV_Index)[0−7]
安全网络Beacon是节点感知到网络不安全时,发送至网络中的消息,通知网络中的设备进行Key Refresh或IV Update程序。当节点收到Secure Network Beacon时,需要根据Beacon中的Flag域,在本地开启对应的更新程序。
为了避免网络中出现大量的Secure Network Beacon,需要对Beacon的量进行限制,期望每个节点在一个子网中大约每10s能收到一个Beacon。则每个节点发送Beacon的周期计算如下:
I
n
t
e
r
v
a
l
B
e
a
c
o
n
=
P
e
r
i
o
d
O
b
s
e
r
v
a
t
i
o
n
∗
N
O
b
s
e
r
v
e
d
+
1
N
E
x
p
e
c
t
e
d
Interval_{Beacon}=Period_{Observation}*\frac{N_{Observed}+1}{N_{Expected}}
IntervalBeacon=PeriodObservation∗NExpectedNObserved+1
在观察窗口期间,得到在此期间收到的Beacon数量
N
O
b
v
e
r
v
e
d
N_{Obverved}
NObverved,根据每个节点在一个子网中大约每10s能收到一个Beacon,即
P
e
r
i
o
d
O
b
s
e
r
v
a
t
i
o
n
=
10
∗
N
E
x
p
e
c
t
e
d
Period_{Observation}=10*N_{Expected}
PeriodObservation=10∗NExpected,得到此节点的Beacon发送周期。可以知道每个节点的Beacon发送周期都是不同的,是根据当前网络的状态实时计算出来的。
3. Key Refresh procedure
Key Refresh procedure的目的是删掉节点中key,用一个new key来替代它。秘钥刷新程序主要有三个阶段,分发new key,使用new key,抛弃old key。其示意图如下:
第一阶段:
① 配置客户端通过Device Key指定要更新的节点,未被更新的节点可视为被抛弃的节点。此时进入第一阶段。
② 配置客户端给每个需要更新的节点发送Config NetKey Update或者Config AppKey Update来分发new key。
③ 节点收到分发的new key后,响应给配置客户端status消息。
④ 在此阶段,节点使用old key发送消息,使用old/new key接收消息。
第二阶段:
① 当配置客户端收到所有更新节点的respond后,说明所有要更新的节点都有了new key。此时进入第二阶段。
② 配置客户端发送Secure Network Beacon,设置其中的Key Refresh flag域为1,并且使用new key进行加密。或者发送Config Key Refresh Phase Set消息给指定的节点,设置参数为0x02。
③ 当节点收到Key Refresh flag域为1的Secure Network Beacon消息或者参数为0x02的Config Key Refresh Phase Set消息时,表示节点应该进入阶段2。
④ 在此阶段,节点使用new key来发送消息,使用old/new key来接收消息,并且只接受使用new key加密的Secure Network Beacon。
第三阶段:
① 当配置客户端认为所有需要更新的节点都进入了阶段2时,此时进入第三阶段。
② 配置客户端发送Secure Network Beacon,设置其中的Key Refresh flag域为0,并且使用new key进行加密。或者发送Config Key Refresh Phase Set消息给指定的节点,设置参数为0x03。配置客户端在自己数据库删除old key。
③ 当节点收到Key Refresh flag域为0的Secure Network Beacon消息或者参数为0x03的Config Key Refresh Phase Set消息时,表示节点应该进入阶段3。若阶段1的节点收到此类消息,则跳过阶段2,直接进入阶段3。(因为阶段2到阶段3的转变时机是不能保证的,即配置客户端不能确保所有需更新的节点都进入了阶段2,但可以保证所有需更新的节点都收到了new key。因此节点拥有new key,并收到使用new key加密的第三阶段Secure Network Beacon或Config Key Refresh Phase Set,则可以直接进入阶段3)
④ 在此阶段,节点使用new key来发送消息,使用new key来接收消息。
在阶段描述中,使用第一二三阶段来描述配置客户端的状态,即当前网络的整体秘钥刷新状态,使用阶段123来描述每个节点的本地秘钥刷新状态。
Node Removal procedure: 通过Key Refresh程序移除该节点相关的key,然后配网者回收该节点的单播地址,在一次IV Update后,此时Sequence Number置为0,然后下次配网就可以使用此Unicast Address。
4. IV Update procedure
IV Update的发起者可以是主网中(Netkey Index=0x000)任意一个节点。当节点认为自己或者其他节点的Sequence Number在96h之后即将耗尽,则会发起IV更新,这也是为什么LPN的PollTimeout的最大值为96h的原因,保证LPN必定能收到一次IV Update的Secure Network Beacon。
① 在正常状态下,节点发送消息使用当前IV值,接收消息使用当前IV值和当前IV值减1。
② 在正常状态下,当收到Secure Network Beacon中的IV Index大于节点的当前IV值加1,则节点需要发起IV Index Recovery procedure。
③ 在正常状态下,当收到Secure Network Beacon中的IV Index等于节点的当前IV值加1,并且Secure Network Beacon中的IV Update Flag=0,则说明这个节点可能错过IV Update Flag=1的消息,要么直接更新IV或者发起IV Index Recovery procedure,或者无视这条消息。
④ 在正常状态下,当收到Secure Network Beacon中的IV Index大于节点的当前IV值加42,则该节点需要被重新配网,即设备关机48weeks则需要重新配网。
⑤ 正常使用96h后,如果检测到Sequence Number在96h后即将耗尽,此时会从正常状态转化为IV更新状态,发起IV Update程序,即广播IV Update Flag=1的Secure Network Beacon,并且把当前的IV值加1。
⑥ 在正常状态下,如果收到IV Update Flag=1的Secure Network Beacon,则进入IV更新状态,此时IV值加1。
⑦ 在IV更新状态下,发出的Secure Network Beacon消息和Friend Update消息里面的IV Update Flag都需要设置为1,并且消息发送使用当前IV值减1,接收消息使用当前IV值减1和当前IV值。
⑧ 在IV更新状态下至少96h,最多144h后,节点会从IV更新状态转换成正常状态,此时节点发送消息使用当前IV值,接收消息使用当前IV值和当前IV值减1,并且本地的Sequence Number设置为0x000000,此时向外广播的Secure Network Beacon,设置其IV Update Flag=0。(Secure Network Beacon是一直都有的,不同的设备发送的周期不同,保证整体上平均每个节点10s都能收到一次)
⑨ 在IV更新状态下,收到IV Update Flag=0的Secure Network Beacon,则转换为正常状态。
⑩ 在IV更新状态下,节点需要等待分段消息处理完毕,才能转换成正常状态,这样保证分段消息中的SeqAuth值是不变的。
总之:
IV Update是用来保证Sequence Number不会溢出设置的机制,因此更新过程中只要保证任何状态下都能收到对端的消息就行,能更新就更新,反正用不完,但又不能无限制的发起IV Update,所以就有了96h的限制。节点通过配网者加入网络时,此时若网络正处于IV更新状态下,则节点需要在96h内完成IV更新的操作转变为正常状态;若网络处于正常状态下,则节点在96h后才能响应网络中的IV更新。由于96h的时间限制,所以通过IV Update test mode可以移除96h的限制来对IV更新的功能进行测试。
IV Index Recovery procedure:
用来恢复本地IV值小于当前网络IV值减1且大于等于当前网络IV值减42的设备IV值,直接赋值为当前Secure Network Beacon中的IV Index值和IV Update Flag里的状态,并且维持96h不变。
在一个节点内IV Update和Recovery在192h内不能处理超过两次。