[蓝牙 Mesh & Zephyr]-[005]-Key

[蓝牙 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 ,生成一个校验值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值