3.3. SRTP Packet Processing (SRTP 数据包处理)
3.3. SRTP Packet Processing (SRTP 数据包处理)
以下内容适用于 SRTP。SRTCP 在 Section 3.4 中描述。
假设加密上下文的初始化已通过密钥管理完成, 发送方应当执行以下操作来构造 SRTP 数据包:
-
按照 Section 3.2.3 中的描述确定要使用哪个加密上下文。
-
使用翻转计数器 (rollover counter), 加密上下文中的最高序列号 (highest sequence number), 以及 RTP 数据包中的序列号, 按照 Section 3.3.1 中的描述确定 SRTP 数据包的索引 (index)。
-
确定主密钥 (master key) 和主盐值 (master salt)。这是使用前一步骤中确定的索引或加密上下文中的当前 MKI 完成的, 根据 Section 8.1。
-
按照 Section 4.3 中的描述确定会话密钥 (session keys) 和会话盐值 (session salt) (如果转换使用它们), 使用加密上下文中的主密钥、主盐值、key_derivation_rate 和会话密钥长度以及在步骤 2 和 3 中确定的索引。
-
加密 RTP 负载以生成数据包的加密部分 (Encrypted Portion) (参见 Section 4.1 中定义的密码)。此步骤使用加密上下文中指示的加密算法、步骤 4 中找到的会话加密密钥和会话盐值 (如果使用) 以及步骤 2 中找到的索引。
-
如果 MKI 指示符设置为 1, 则将 MKI 附加到数据包。
-
对于消息认证 (message authentication), 按照 Section 4.2 中的描述计算数据包认证部分 (Authenticated Portion) 的认证标签 (authentication tag)。此步骤使用当前翻转计数器、加密上下文中指示的认证算法以及步骤 4 中找到的会话认证密钥。将认证标签附加到数据包。
-
如有必要, 使用步骤 2 中确定的数据包索引, 按照 Section 3.3.1 更新 ROC。
要认证和解密 SRTP 数据包, 接收方应当执行以下操作:
-
按照 Section 3.2.3 中的描述确定要使用哪个加密上下文。
-
运行 Section 3.3.1 中的算法以获取 SRTP 数据包的索引。该算法使用加密上下文中的翻转计数器和最高序列号以及 SRTP 数据包中的序列号, 如 Section 3.3.1 中所述。
-
确定主密钥和主盐值。如果上下文中的 MKI 指示符设置为 1, 则使用 SRTP 数据包中的 MKI, 否则使用前一步骤的索引, 根据 Section 8.1。
-
按照 Section 4.3 中的描述确定会话密钥和会话盐值 (如果转换使用), 使用加密上下文中的主密钥、主盐值、key_derivation_rate 和会话密钥长度以及在步骤 2 和 3 中确定的索引。
-
对于消息认证和重放保护 (replay protection), 首先使用重放列表 (Replay List) 和步骤 2 中确定的索引检查数据包是否已被重放 (Section 3.3.2)。如果判断数据包已被重放, 则必须丢弃该数据包, 并且应当记录该事件。
接下来, 使用步骤 2 中的翻转计数器、加密上下文中指示的认证算法以及步骤 4 中的会话认证密钥执行认证标签的验证。如果结果为 "AUTHENTICATION FAILURE" (认证失败) (参见 Section 4.2), 则必须丢弃该数据包而不进行进一步处理, 并且应当记录该事件。
-
使用加密上下文中指示的解密算法、步骤 4 中找到的会话加密密钥和盐值 (如果使用) 以及步骤 2 中的索引, 解密数据包的加密部分 (参见 Section 4.1 中定义的密码)。
-
使用步骤 2 中估计的数据包索引, 按照 Section 3.3.1 更新加密上下文中的翻转计数器和最高序列号 s_l。如果提供了重放保护, 还要按照 Section 3.3.2 中的描述更新重放列表。
-
如果存在, 从数据包中移除 MKI 和认证标签字段。