跳到主要内容

3.3.3. Integrity Check Value Calculation (完整性校验值计算)

AH ICV 计算覆盖:

  • AH 头部之前的 IP 或扩展头部字段, 这些字段在传输过程中是不可变的 (immutable) 或在到达 AH SA 的端点时是可预测的 (predictable)
  • AH 头部 (Next Header, Payload Len, Reserved, SPI, Sequence Number (低 32 位), 以及 ICV (在此计算中设置为零), 以及显式填充字节 (如果有))
  • AH 之后的所有内容都假定在传输过程中是不可变的
  • ESN 的高位 (如果使用), 以及完整性算法所需的任何隐式填充

3.3.3.1. Handling Mutable Fields (处理可变字段)​

如果字段可能在传输过程中被修改, 则为了 ICV 计算的目的, 该字段的值设置为零.如果字段是可变的, 但其在 (IPsec) 接收方的值是可预测的, 则为了 ICV 计算的目的, 将该值插入到字段中.完整性校验值字段也设置为零以准备此计算.请注意, 通过用零替换每个字段的值而不是省略该字段, 为 ICV 计算保留了对齐.此外, 零填充方法确保即使内容未被 ICV 明确覆盖, 在传输过程中也无法更改以这种方式处理的字段的长度.

当创建新的扩展头或 IPv4 选项时, 它将在其自己的 RFC 中定义, 并且应该 (SHOULD) 在 (安全考虑部分) 包含在计算 AH ICV 时应如何处理它的说明.如果 IP (v4 或 v6) 实现遇到它不识别的扩展头, 它将丢弃数据包并发送 ICMP 消息.IPsec 永远不会看到该数据包.如果 IPsec 实现遇到它不识别的 IPv4 选项, 它应该将整个选项清零, 使用选项的第二个字节作为长度.IPv6 选项 (在目标扩展头或逐跳扩展头中) 包含指示可变性的标志, 该标志确定此类选项的适当处理.

3.3.3.1.1. ICV Computation for IPv4 (IPv4 的 ICV 计算)​

3.3.3.1.1.1. Base Header Fields (基本头部字段)​

IPv4 基本头部字段分类如下:

Immutable (不可变):

  • Version
  • Internet Header Length
  • Total Length
  • Identification
  • Protocol (这应该是 AH 的值.)
  • Source Address
  • Destination Address (不使用松散或严格源路由)

Mutable but predictable (可变但可预测):

  • Destination Address (使用松散或严格源路由)

Mutable (可变, 在 ICV 计算之前清零):

  • Differentiated Services Code Point (DSCP) (6 位, 见 RFC 2474 [NBBB98])
  • Explicit Congestion Notification (ECN) (2 位, 见 RFC 3168 [RFB01])
  • Flags
  • Fragment Offset
  • Time to Live (TTL)
  • Header Checksum

DSCP - 路由器可能根据需要重写 DS 字段以提供所需的本地或端到端服务, 因此发送方无法预测其接收时的值.

ECN - 如果路由沿线的路由器遇到拥塞, 这将改变, 因此发送方无法预测其接收时的值.

Flags - 排除此字段是因为中间路由器可能设置 DF 位, 即使源没有选择它.

Fragment Offset - 由于 AH 仅应用于非分片的 IP 数据包, 因此偏移字段必须始终为零, 因此被排除 (即使它是可预测的).

TTL - 这在路由过程中被路由器作为正常处理过程的一部分进行更改, 因此发送方无法预测其在接收方的值.

Header Checksum - 如果这些其他字段中的任何一个发生变化, 这将改变, 因此发送方无法预测其接收时的值.

3.3.3.1.1.2. Options (选项)​

对于 IPv4 (与 IPv6 不同), 没有将选项标记为在传输过程中可变的机制.因此, IPv4 选项在附录 A 中明确列出, 并分类为不可变, 可变但可预测或可变.对于 IPv4, 整个选项被视为一个单元; 因此, 即使大多数选项中的类型和长度字段在传输过程中是不可变的, 如果选项被分类为可变, 则整个选项在 ICV 计算目的上清零.

3.3.3.1.2. ICV Computation for IPv6 (IPv6 的 ICV 计算)​

3.3.3.1.2.1. Base Header Fields (基本头部字段)​

IPv6 基本头部字段分类如下:

Immutable (不可变):

  • Version
  • Payload Length
  • Next Header
  • Source Address
  • Destination Address (不使用路由扩展头)

Mutable but predictable (可变但可预测):

  • Destination Address (使用路由扩展头)

Mutable (可变, 在 ICV 计算之前清零):

  • DSCP (6 位, 见 RFC2474 [NBBB98])
  • ECN (2 位, 见 RFC3168 [RFB01])
  • Flow Label (*)
  • Hop Limit

(*) AHv1 中描述的流标签是可变的, 在 RFC 2460 [DH98] 中是潜在可变的.为了保持与现有 AH 实现的兼容性, AHv2 中流标签不包含在 ICV 中.

3.3.3.1.2.2. Extension Headers Containing Options (包含选项的扩展头)​

逐跳和目标扩展头中的 IPv6 选项包含一个位, 指示该选项在传输过程中是否可能 (不可预测地) 改变.对于内容可能在途中改变的任何选项, 在计算或验证 ICV 时, 必须将整个 "Option Data" 字段视为零值八位字节.Option Type 和 Opt Data Len 包含在 ICV 计算中.该位指示不可变性的所有选项都包含在 ICV 计算中.有关更多信息, 请参阅 IPv6 规范 [DH98].

3.3.3.1.2.3. Extension Headers Not Containing Options (不包含选项的扩展头)​

不包含选项的 IPv6 扩展头在附录 A 中明确列出, 并分类为不可变, 可变但可预测或可变.

3.3.3.2. Padding and Extended Sequence Numbers (填充和扩展序列号)​

3.3.3.2.1. ICV Padding (ICV 填充)​

如第 2.6 节所述, 如果需要确保 AH 头部是 32 位 (IPv4) 或 64 位 (IPv6) 的倍数, 则 ICV 字段可能包含显式填充.如果需要填充, 其长度由两个因素决定:

  • ICV 的长度
  • IP 协议版本 (v4 或 v6)

例如, 如果所选算法的输出为 96 位, 则 IPv4 或 IPv6 都不需要填充.但是, 如果由于使用不同的算法而生成不同长度的 ICV, 则可能需要填充, 这取决于长度和 IP 协议版本.填充字段的内容由发送方任意选择.(填充是任意的, 但不需要是随机的以实现安全性.) 这些填充字节包含在 ICV 计算中, 作为载荷长度的一部分计数, 并在 ICV 字段的末尾传输, 以使接收方能够执行 ICV 计算.禁止包含超过满足 IPv4/IPv6 对齐要求所需的最小量的填充.

3.3.3.2.2. Implicit Packet Padding and ESN (隐式数据包填充和 ESN)​

如果为 SA 选择了 ESN 选项, 则必须将 ESN 的高 32 位包含在 ICV 计算中.为了 ICV 计算的目的, 这些位在载荷结束之后以及任何隐式数据包填充之前 (隐式地) 附加.

对于某些完整性算法, 执行 ICV 计算的字节字符串必须是算法指定的块大小的倍数.如果 IP 数据包长度 (包括 AH 和 ESN 的高 32 位, 如果启用) 不匹配算法的块大小要求, 则必须 (MUST) 在 ICV 计算之前将隐式填充附加到数据包的末尾.填充八位字节必须 (MUST) 具有零值.块大小 (以及填充的长度) 由算法规范指定.此填充不与数据包一起传输.必须 (MUST) 查阅定义完整性算法的文档以确定是否需要如上所述的隐式填充.如果文档没有指定对此的答案, 则默认假设需要隐式填充 (根据需要将数据包长度与算法的块大小匹配).如果需要填充字节但算法没有指定填充内容, 则填充八位字节必须 (MUST) 具有零值.