[蓝牙 Mesh & Zephyr]-[005]-Key
1. Keys
Mesh Profile specification 定义了 2 种key:application keys (AppKey)和 network keys(NetKey)。AppKeys 用于保护 upper transport layer 的通信安全,NetKeys 用于保护 network layer 的通信安全。两类 key 在节点之间时共享的。有一个特殊的 application key 称为 device key(DevKey),每个节点都是唯一的,只有节点自己和 Configuration Client 知道,用于保护节点和 Configuration Client 之间的通信安全。
每个 Application key 都绑定到 一个 Network key,这意味着 application key 只可以在绑定到的 Network key 上下文使用;一个 device key 隐式绑定到所有 network key。
下面是一个 application keys 绑定到 network keys 的例子:
2. Application Keys
2.1. Device Key (特殊 App Key)
device key(DevKey)是 一个 access layer key,在节点加入网络时生成,只有节点和一个 Configuration Client 知道。这个 device key 会绑定到节点中所有的 Network key。绑定不可以更改。下图描述了 device key 的派生:
DevKey 应该派生于 ECDHSecret 和 ProvisioningSalt,如下面公式所示:
DevKey = k1(ECDHSecret, ProvisioningSalt, “prdk”)
ProvisioningSalt 定义在 章节 5.4.2.5,ECDHSecret 定义在 章节 5.4.2.3。
2.2. Application Keys
application key(AppKey)应该使用定义在 Volume 2, Part H, Section 2 of the Core Specification [1]. 的随机数生成器生成。
application key identifier(AID)用于识别 application key,Provisioner 使用 “Config AppKey Add ” 配置到节点上,AID的派生如下图所述:
3. Network keys
3.1. Network key
network key(NetKey)应该使用在 Volume 2, Part H, Section 2 of the Core Specification [1] 中的定义的随机数生成器生成,网络密钥层次结构如图3.38所示。
在配网过程中,Provisioner 使用 “Provisioning Data” 将第一个 NetKey 发送到节点上,如果需要将主网的节点添加到一个子网中,可以使用 “Config NetKey Add” 进行添加。
3.2. Encryption Key, and Privacy Key
Encryption Key, and Privacy Key 也是 NetKey,用于加密Network PDU 。
每个 Network PDU 都使用由 NID,Encryption Key 和 Privacy Key 组成的 security material 加密。
NID 是一个 7 bit 的值,用于标识用于加密 Network PDU 的 security material。
注意:每个 NID 最多可以对应 2的121次方个 key,NID 值只能指示用于保护此 Network PDU 的安 security material。
NID,EncryptionKey 和 PrivacyKey 由 k2 函数使用 security credentials 作为输入派生的。
Master security material 派生于 master security credentials:
- NID || EncryptionKey || PrivacyKey = k2(NetKey, 0x00)
Friendship security material 派生于 friendship security credentials:
- NID || EncryptionKey || PrivacyKey = k2(NetKey, 0x01 || LPNAddress || FriendAddress || LPNCounter || FriendCounter)
LPNAddress 是一个单播地址,是 Friend Request message 的源地址。
FriendAddress 是一个单播地址,是 Friend Offer message 的源地址。
LPNCounter 是Friend Request message 中的 LPNCounter 字段。
FriendCounter 是 Friend Offer message 中的 FriendCounter 字段。
对于在具有友谊关系的 Low Power node and Friend node 之间发送的 Network PDUs,使用Friendship security material。
对于所有其他 Network PDUs ,使用 Master security material。
3.3. IdentityKey
IdentifyKey 派生于 network key,每个 network key 生成一个 IdentifyKey。
salt = s1(“nkik”)
P = “id128” || 0x01
IdentityKey = k1 (NetKey, salt, P)
用于 Advertising with Node Identity 过程,生成一个 Hash值,如下:
3.4. BeaconKey
BeaconKey 派生于 network key,每个 network key 生成一个 BeaconKey。
salt = s1(“nkbk”)
P = “id128” || 0x01
BeaconKey = k1 (NetKey, salt, P)
Beacon Key 用于 Secure Network beacon ,生成一个校验值。