6.1. RPL 安全字段 (RPL Security Fields)
每个 RPL 消息都有一个安全变体. 安全变体提供完整性和重放保护, 以及可选的机密性和延迟保护. 由于安全机制覆盖基本消息和选项, 在安全消息中, 安全信息位于校验和与基本部分之间, 如图 7 所示.
使用的安全级别和算法在协议消息中按如下方式指示:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|T| Reserved | Algorithm |KIM|Resvd| LVL | Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Identifier .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 8: 安全部分
消息认证码 (Message Authentication Codes, MACs) 和签名对整个未安全保护的 ICMPv6 RPL 控制消息提供认证, 认证范围包括所有字段已定义的 Security 部分, 但 ICMPv6 校验和会临时设置为零. 加密为安全 RPL ICMPv6 消息提供机密性, 范围从 Security 部分之后的第一个字节开始, 一直到分组的最后一个字节. 安全变换会生成一个安全 ICMPv6 RPL 消息, 其中包含密码学字段 (MAC, 签名等). 换言之, 安全变换本身, 例如正在使用的签名和/或算法, 将详细说明如何把密码学字段并入安全分组. Security 部分本身不显式携带这些密码学字段. Security 部分的使用在第 19 节和第 10 节中进一步详细说明.
- Counter is Time (T): 如果计数器的 Time 标志被设置, 则 Counter 字段是时间戳. 如果该标志被清零, 则计数器是递增计数器. 第 10.5 节描述 'T' 标志和 Counter 字段的细节.
- Reserved: 7 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
- Security Algorithm (Algorithm): Security Algorithm 字段指定网络使用的加密, MAC 和签名方案. 该字段支持的值如下:
| Algorithm | 加密/MAC | 签名 |
|---|---|---|
| 0 | CCM with AES-128 | RSA with SHA-256 |
| 1-255 | 未分配 | 未分配 |
图 9: Security Algorithm (Algorithm) 编码
第 10.9 节更详细地描述这些算法.
- Key Identifier Mode (KIM): Key Identifier Mode 是一个 2 位字段, 指示用于分组保护的密钥是隐式确定还是显式确定, 并指示 Key Identifier 字段的具体表示形式. Key Identifier Mode 设置为下表中的值之一:
| Mode | KIM | 含义 | Key Identifier 长度 (octets) |
|---|---|---|---|
| 0 | 00 | 使用组密钥. 密钥由 Key Index 字段确定. Key Source 不存在. Key Index 存在. | 1 |
| 1 | 01 | 使用成对密钥. 密钥由分组的源和目的地确定. Key Source 不存在. Key Index 不存在. | 0 |
| 2 | 10 | 使用组密钥. 密钥由 Key Index 和 Key Source Identifier 确定. Key Source 存在. Key Index 存在. | 9 |
| 3 | 11 | 使用节点的签名密钥. 如果分组被加密, 则使用组密钥, Key Index 和 Key Source 指定密钥. Key Source 可以存在. Key Index 可以存在. | 0/9 |
图 10: Key Identifier Mode (KIM) 编码
在模式 3 (KIM=11) 中, Key Source 和 Key Identifier 是否存在取决于下文描述的安全级别 (Security Level, LVL). 如果 Security Level 指示存在加密, 则这些字段存在. 如果它指示没有加密, 则这些字段不存在.
-
Resvd: 3 位未使用字段. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Security Level (LVL): Security Level 是一个 3 位字段, 指示所提供的分组保护. 该值可以按每个分组进行调整, 并允许不同级别的数据真实性, 以及可选的数据机密性. KIM 字段指示是否使用签名以及 Level 字段的含义. 注意, Security Level 的已分配值不一定有序, 更高的 LVL 值不一定等同于更高安全性. Security Level 设置为下表中的值之一:
KIM=0,1,2
| LVL | 属性 | MAC 长度 |
|---|---|---|
| 0 | MAC-32 | 4 |
| 1 | ENC-MAC-32 | 4 |
| 2 | MAC-64 | 8 |
| 3 | ENC-MAC-64 | 8 |
| 4-7 | 未分配 | N/A |
KIM=3
| LVL | 属性 | 签名长度 |
|---|---|---|
| 0 | Sign-3072 | 384 |
| 1 | ENC-Sign-3072 | 384 |
| 2 | Sign-2048 | 256 |
| 3 | ENC-Sign-2048 | 256 |
| 4-7 | 未分配 | N/A |
图 11: Security Level (LVL) 编码
MAC 属性指示该消息具有指定长度的 MAC. ENC 属性指示该消息已加密. Sign 属性指示该消息具有指定长度的签名.
-
Flags: 8 位未使用字段, 保留供标志使用. 发送方 MUST 将该字段初始化为零, 接收方 MUST 忽略该字段.
-
Counter: Counter 字段指示一个不重复的 4 octet 值, 该值用于构造实现分组保护并允许提供语义安全的密码学机制. 见第 10.9.1 节.
-
Key Identifier: Key Identifier 字段指示使用哪个密钥保护该分组. 该字段提供不同粒度级别的分组保护, 包括点对点密钥, 组密钥和签名密钥. 该字段按 Key Identifier Mode 字段指示的方式表示, 格式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Source .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Key Index .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 12: Key Identifier
-
Key Source: Key Source 字段存在时, 指示组密钥发起者的逻辑标识符. 当存在时, 该字段长度为 8 字节.
-
Key Index: Key Index 字段存在时, 允许唯一标识具有相同发起者的不同密钥. 每个密钥发起者负责确保其发布并正在使用的密钥具有不同的密钥索引, 且所有密钥索引的值均不等于 0x00. 值 0x00 保留给预安装的共享密钥. 当存在时, 该字段长度为 1 字节.
-
Security 部分的 未分配位 为保留位. 发送时 MUST 将其设置为零, 接收时 MUST 忽略.