Partial

RFC 4301 - Security Architecture for the Internet Protocol

Every requirement this repository extracted from RFC 4301, the tests bound to it, and what a reader has verified about them. This summary is enrolled and gated by ./le rfc check.

Overview

Positive

what Ze has

Tested both ways33.3%4 of 12 binding obligations

a positive test proves Ze does what the requirement demands and a negative one proves it refuses what the requirement forbids

One polarity plus reason58.3%7 of 12 binding obligations

the requirement admits no counter-case, so one polarity plus a recorded reason is the whole proof available for it

One polarity, unexcused0.0%0 of 12 binding obligations

one direction is tested, the other is neither tested nor excused, and nothing states which

Proven by a recorded break0.0%0 of 23 tagged units

a red was observed once under a recorded procedure, and the unit, the claim and the producer it rested on still hash to what was recorded. The break is not re-run. A test pair is not a proof until one has been observed

Neutral

measures that are neither good news nor bad

Gated MUSTs18of 21 this summary declares

MUST-level requirements the gate HOLDS. A population, not a result: the shares beside it are what says how Ze stands

Out of scope6of 18 gated MUSTs

a {not-applicable} annotation says the obligation does not bind Ze. Scope, not coverage: it is in no share below

Negative

what Ze owes

No test at all8.3%1 of 12 binding obligations

no test carries the requirement id, whether or not a gap states why

The 4 shares marked as a part above are the whole of the 12 obligations that bind Ze: they add to 100%. Proven by a recorded break is a share of TAGGED UNITS, a different population, so it is not one of them.

How to read the colors

A color names what the measure MEANS, not how well Ze scores on it. Green is a good outcome at any value, red is a bad one, and neither a population nor a scope count is an outcome, so both take no color. The number under the label is what says how far Ze has got.

CardTone hereWhy that color
Gated MUSTs neutral no color: a population is a scale, and a larger one is neither good news nor bad. It is the accounting total
Out of scope neutral no color: an obligation that never bound Ze is neither an achievement nor a failure, and counting it either way would be a claim
Tested both ways ok green at every value: a test pair is the outcome this gate exists to produce, and the share under the label is what says how far Ze has got
One polarity plus reason ok green at every value: where no counter-case exists, one polarity IS the complete answer, and a recorded reason is what the gate demands beside it
One polarity, unexcused ok green at zero, RED above it: half a proof with no reason for the other half
No test at all bad green at zero, RED above it: a binding obligation nothing exercises is a claim with nothing behind it, whether or not a reason is stated
Proven by a recorded break ok green at every value: an observed break is the outcome the discrimination gate exists to produce. The denominator is TAGGED UNITS, not obligations, so this share is not one of the parts above
Audit verdicts warn RED on the first weak, wrong or unimplemented verdict, amber while a verdict is no longer current or a gated MUST is unjudged, green when every one is judged sound and current

At a glance

FieldValue
Public status Partial
Enrolment Enrolled
Requirements 21
Gated MUST-level 18
Obligations that bind Ze 12
Not applicable, so out of scope 6
Declared gaps 1
Gated with no test 0
Nightly-only evidence 0
Test tags 23
Tagged units 23
Recorded audit verdicts 0
Discrimination records 0
Summary rfc/short/rfc4301.md
Requirement shard rfc/requirements/rfc4301.md
RFC text rfc/full/rfc4301.txt

Enrolment

Enrolled: Security Architecture for IP (RFC 4301): native control-plane SPD/SAD projected to kernel XFRM; 1 MET (no null-enc/no-integrity ESP) + 7 single-polarity positive (tunnel/transport modes, SPD present, negotiated selectors, manual+automated keying) + 1 gap (port/ICMP selectors) + 6 not-applicable (per-packet datapath kernel-delegated)

What the public ledger says

Status: Partial

What the ledger says is covered Native control-plane SPD/SAD model projected to kernel XFRM. The SPD carries PROTECT and BYPASS entries, and a selector holds the local and remote prefixes, the next-layer protocol, and a local and a remote port as an any-or-one-exact value. IKEv2 Child SAs install tunnel mode, or transport mode when USE_TRANSPORT_MODE is negotiated and echoed, and the RFC 4552 OSPFv3 path installs manual transport-mode ESP or AH. SAD entries carry the SPI, the address pair, the mode, the protocol, the algorithms, the replay window and a time-based lifetime. Per-packet SPD and SAD processing is kernel-delegated to XFRM.
What the ledger says remains

Lowered from Supported on 2026-08-30, after an extraction walk of rfc/full/rfc4301.txt found architecture obligations Ze does not meet. The implementation work is plan/spec-rfc4301-architecture-gaps.md, one phase per block.

Section 6, ICMP processing: no control lets an administrator accept or reject unauthenticated ICMP error messages per ICMP type, and no check compares a protected transit ICMP error message payload header against the traffic selectors of the SA that carried it. Sections 7.4 and D.4, BYPASS and DISCARD fragments: SPAction (internal/component/ike/dataplane/dataplane.go) defines PROTECT and BYPASS only, so a DISCARD entry cannot be expressed at all, and Ze holds no fragment state, so a forged non-initial fragment matching the port-scoped IKE bypass policies (ikeBypassPolicies, internal/component/ike/engine/bypass.go) is passed in the clear.

Section 8, DF bit and PMTU: the DF treatment of a tunnel-mode SA is not configurable, and no per-SA PMTU value is held or aged. Section 4.4.3.1, PAD matching: remoteIDMatches (internal/component/ike/engine/remote_id.go) compares an asserted identity exactly, so sub-tree matching of a distinguished name, a DNS name or an RFC 822 address is absent, and an address identity is one value rather than a range. Section 4.4.1, SPD ordering: policy precedence is two fixed constants, PriorityIKEBypass and PriorityChildSA, so an administrator cannot order SPD entries. Section 4.4.2.1, SAD lifetimes: newLifetimeState (internal/component/ike/engine/rekey.go) assigns a time lifetime only, softBytes is never assigned, and the byte-count arm of softExpired is unreachable in a running daemon; plan/spec-ipsec-lifetime-volume.md designs the byte-count lifetime. Section 5.1.2.1, outer header: the DSCP value of the outer tunnel header is not mapped for the domain the packet enters. Section 4.4.1.1, selectors: a port selector holds any port or one exact port rather than the range the section defines, and SPParams carries no ICMP type or code field. Only that last item is gated in rfc/short/rfc4301.md, as RFC4301-4.4.1.1-1, and its reason text is stale about ports.

Coverage

BucketCountWhat it counts
Positive and negative tests 4 one part of the gated population
Annotated instead of tested 14 one part of the gated population
One polarity only 0 one part of the gated population
No test and no annotation 0 one part of the gated population
Evidence that runs nightly only 0 an overlay: each of these is also counted by the part it falls in
Gated MUST-level requirements18every gated MUST falls in exactly one bucket above

Positive and negative tests (4): RFC4301-4.2-1, RFC4301-4.4.3.1-1, RFC4301-4.4.3.1-2, RFC4301-4.4.1-4

Annotated instead of tested (14): RFC4301-4.1-1, RFC4301-4.1-2, RFC4301-4.1-3, RFC4301-4.1-4, RFC4301-4.1-5, RFC4301-4.4.1-1, RFC4301-4.4.1-2, RFC4301-4.4.1.1-1, RFC4301-4.4.2-1, RFC4301-4.5-1, RFC4301-5.2-1, RFC4301-5.2-2, RFC4301-4.1-6, RFC4301-7-1

Requirements

RequirementLevelSectionTests
RFC4301-4.1-1Host implementations MUST support both transport and tunnel mode (§4.1)
MUST 4.1
negativeno testno negative test

{single-polarity}: ze projects both modes -- IKE child SAs install tunnel-mode ESP and OSPFv3 RFC 4552 installs transport-mode ESP/AH; a capability-presence MUST has no meaningful negative (internal/component/ike/engine/child.go:224, :253, internal/plugins/ospf/ipsec_install.go:413, :441)

RFC4301-4.1-2Security gateways MUST support tunnel mode (§4.1)
MUST 4.1
negativeno testno negative test

{single-polarity}: ze (a security gateway) installs tunnel-mode ESP for every IKE-negotiated peer SA and policy (internal/component/ike/engine/child.go:224, :253, :281, :295)

RFC4301-4.1-3SAs between a security gateway and any peer MUST use tunnel mode (two narrow exceptions for gateway-as-host) (§4.1)
MUST 4.1
negativeno testno negative test

{single-polarity}: the IKE child-SA path hardcodes tunnel mode for every peer SA, so a peer SA can never be transport (internal/component/ike/engine/child.go:40, :224, :253)

RFC4301-4.1-4IKE-created SA pairs MUST use the same mode (both tunnel or both transport) (§4.1)
MUST 4.1
negativeno testno negative test

{single-polarity}: the inbound and outbound child SAs of a pair are both built with modeTunnel, so the pair is always same-mode (internal/component/ike/engine/child.go:224, :253)

RFC4301-4.1-5Implementation MUST permit multiple SAs between same endpoints with same selectors (QoS differentiation) (§4.1)
MUST 4.1
positiveno testno positive test
negativeno testno negative test

{not-applicable}: multiple SAs with identical selectors coexist by SPI in the kernel XFRM SAD and ze's SPI-keyed installs do not forbid this; the DSCP classification that selects among them for QoS is a datapath function ze does not model (internal/component/ike/dataplane/dataplane.go:81-108)

RFC4301-4.2-1MUST NOT instantiate an ESP SA with both NULL encryption and no integrity algorithm (§4.2)
MUST NOT 4.2
RFC4301-4.4.1-1Implementation MUST have at least one SPD (§4.4.1)
MUST 4.4.1
negativeno testno negative test

{single-polarity}: ze maintains an SPD policy model (SPParams) and installs at least the PROTECT entries into the kernel SPD via both the IKE and OSPFv3 paths (internal/component/ike/dataplane/dataplane.go:145, engine/child.go:276, :290, internal/plugins/ospf/ipsec_install.go:432-452)

RFC4301-4.4.1-2SPD MUST be consulted for ALL traffic crossing IPsec boundary, including IKE management traffic (§4.4.1, §5)
MUST 4.4.1
positiveno testno positive test
negativeno testno negative test

{not-applicable}: per-packet SPD consultation for every crossing packet is a kernel XFRM datapath function; ze populates the kernel SPD but does not process packets

RFC4301-4.4.1.1-1All implementations MUST support the defined selectors: remote/local IP, next-layer protocol, ports, ICMP type/code (§4.4.1.1)
MUST 4.4.1.1
positiveno testno positive test
negativeno testno negative test

{gap}: ze's policy model carries IP-prefix and next-layer-protocol selectors only; the IKE traffic-selector negotiation discards ports/protocol into an address-only net.IPNet, and SPParams has no port or ICMP-type/code field (internal/component/ike/dataplane/dataplane.go:110-130 exists; ports/ICMP missing at internal/component/ike/engine/sa.go:128-129, engine/initiator.go:325)

RFC4301-4.4.2-1Inbound SAD entries MUST be populated with negotiated selector values for packet verification (§4.4.2)
MUST 4.4.2
negativeno testno negative test

{single-polarity}: ze captures the RFC 7296-narrowed negotiated traffic selectors and projects them into the inbound require-policy; the per-packet check against them is kernel-enforced (internal/component/ike/engine/child.go:155-164, :276-288)

RFC4301-4.5-1Implementations MUST support both manual and automated (IKEv2) key management (§4.5)
MUST 4.5
negativeno testno negative test

{single-polarity}: ze implements automated keying via its native IKEv2 engine and manual keying via the OSPFv3 RFC 4552 config, both installing SAs through the same dataplane seam (internal/component/ike/engine/child.go:199-307, internal/plugins/ospf/ipsec_install.go:295-342)

RFC4301-5.2-1Inbound packets not matching SPD-I MUST be discarded (§5.2)
MUST 5.2
positiveno testno positive test
negativeno testno negative test

{not-applicable}: dropping inbound packets that fail the SPD-I match is a kernel XFRM datapath function; ze installs the inbound require-policies but does not process packets (internal/component/ike/engine/child.go:276)

RFC4301-5.2-2After decapsulation, inner packet selectors MUST be verified against SAD traffic selectors (§5.2)
MUST 5.2
positiveno testno positive test
negativeno testno negative test

{not-applicable}: post-decapsulation inner-selector verification against the SAD is a kernel XFRM datapath function; the kernel verifies the inner packet against the inbound policy ze installs

RFC4301-4.1-6Multicast-capable implementations MUST support multicast SAD lookup (three-step: SPI+dst+src, SPI+dst, SPI alone) (§4.1)
MUST 4.1
positiveno testno positive test
negativeno testno negative test

{not-applicable}: the three-step inbound SAD lookup (SPI+dst+src / SPI+dst / SPI) is a per-packet kernel XFRM function; ze performs no inbound SAD lookups

RFC4301-7-1AH/ESP MUST NOT be applied in transport mode to IPv4 fragments; use tunnel mode (§7)
MUST NOT 7
positiveno testno positive test
negativeno testno negative test

{not-applicable}: ze applies transport mode only to IPv6 OSPFv3 traffic (IPv4-family IPsec is rejected at config), so transport-mode IPsec on an IPv4 fragment structurally cannot arise, and per-packet fragment handling is kernel-delegated (internal/plugins/ospf/config_ipsec.go:21-22)

RFC4301-4.4.1-3SPD SHOULD have a default final entry that discards unmatched traffic (§4.4.1)
SHOULD 4.4.1
positiveno testno positive test
negativeno testno negative test
RFC4301-7-2Encapsulator SHOULD perform Path MTU Discovery and adjust tunnel MTU (§7)
SHOULD 7
positiveno testno positive test
negativeno testno negative test
RFC4301-4.1-7Security gateways MAY support transport mode only when acting as a host (e.g., SNMP management traffic) (§4.1)
MAY 4.1
positiveno testno positive test
negativeno testno negative test
RFC4301-4.4.3.1-1Sub-tree matching MUST be supported for distinguished names, domain names and RFC 822 e-mail addresses in PAD entries (§4.4.3.1)
MUST 4.4.3.1
RFC4301-4.4.3.1-2For IPv4 and IPv6 addresses in PAD entries, the same address range syntax used for SPD entries MUST be supported (§4.4.3.1)
MUST 4.4.3.1
RFC4301-4.4.1-4A user or administrator MUST be able to order the SPD entries, and the management interface MUST support (total) ordering of them as seen via that interface (§4.4.1)
MUST 4.4.1

Gaps and untested MUSTs

RequirementStateReason
RFC4301-4.1-5 Implementation MUST permit multiple SAs between same endpoints with same selectors (QoS differentiation) (§4.1) no test no test carries this requirement id; annotated {not-applicable}: multiple SAs with identical selectors coexist by SPI in the kernel XFRM SAD and ze's SPI-keyed installs do not forbid this; the DSCP classification that selects among them for QoS is a datapath function ze does not model (internal/component/ike/dataplane/dataplane.go:81-108)
RFC4301-4.4.1-2 SPD MUST be consulted for ALL traffic crossing IPsec boundary, including IKE management traffic (§4.4.1, §5) no test no test carries this requirement id; annotated {not-applicable}: per-packet SPD consultation for every crossing packet is a kernel XFRM datapath function; ze populates the kernel SPD but does not process packets
RFC4301-4.4.1.1-1 All implementations MUST support the defined selectors: remote/local IP, next-layer protocol, ports, ICMP type/code (§4.4.1.1) {gap}, no test ze's policy model carries IP-prefix and next-layer-protocol selectors only; the IKE traffic-selector negotiation discards ports/protocol into an address-only net.IPNet, and SPParams has no port or ICMP-type/code field (internal/component/ike/dataplane/dataplane.go:110-130 exists; ports/ICMP missing at internal/component/ike/engine/sa.go:128-129, engine/initiator.go:325)
RFC4301-5.2-1 Inbound packets not matching SPD-I MUST be discarded (§5.2) no test no test carries this requirement id; annotated {not-applicable}: dropping inbound packets that fail the SPD-I match is a kernel XFRM datapath function; ze installs the inbound require-policies but does not process packets (internal/component/ike/engine/child.go:276)
RFC4301-5.2-2 After decapsulation, inner packet selectors MUST be verified against SAD traffic selectors (§5.2) no test no test carries this requirement id; annotated {not-applicable}: post-decapsulation inner-selector verification against the SAD is a kernel XFRM datapath function; the kernel verifies the inner packet against the inbound policy ze installs
RFC4301-4.1-6 Multicast-capable implementations MUST support multicast SAD lookup (three-step: SPI+dst+src, SPI+dst, SPI alone) (§4.1) no test no test carries this requirement id; annotated {not-applicable}: the three-step inbound SAD lookup (SPI+dst+src / SPI+dst / SPI) is a per-packet kernel XFRM function; ze performs no inbound SAD lookups
RFC4301-7-1 AH/ESP MUST NOT be applied in transport mode to IPv4 fragments; use tunnel mode (§7) no test no test carries this requirement id; annotated {not-applicable}: ze applies transport mode only to IPv6 OSPFv3 traffic (IPv4-family IPsec is rejected at config), so transport-mode IPsec on an IPv4 fragment structurally cannot arise, and per-packet fragment handling is kernel-delegated (internal/plugins/ospf/config_ipsec.go:21-22)

Proof state

A tagged unit reads unproven where no discrimination record exists for it: nothing in this tree has been observed to break it, so the claim its tag makes is unproven.

RFC4301-4.1-1

Host implementations MUST support both transport and tunnel mode (§4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven
positive TestIPsecSAIsWildcardWithOSPFSelector unit/verify unproven

RFC4301-4.1-2

Security gateways MUST support tunnel mode (§4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven

RFC4301-4.1-3

SAs between a security gateway and any peer MUST use tunnel mode (two narrow exceptions for gateway-as-host) (§4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven

RFC4301-4.1-4

IKE-created SA pairs MUST use the same mode (both tunnel or both transport) (§4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven

RFC4301-4.1-5

Implementation MUST permit multiple SAs between same endpoints with same selectors (QoS differentiation) (§4.1)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-4.1-5, so no unit is bound to it.

RFC4301-4.2-1

MUST NOT instantiate an ESP SA with both NULL encryption and no integrity algorithm (§4.2)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestIPsecESPRequiresIntegrity unit/verify unproven
positive TestIPsecESPRequiresIntegrity unit/verify unproven

RFC4301-4.4.1-1

Implementation MUST have at least one SPD (§4.4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven

RFC4301-4.4.1-2

SPD MUST be consulted for ALL traffic crossing IPsec boundary, including IKE management traffic (§4.4.1, §5)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-4.4.1-2, so no unit is bound to it.

RFC4301-4.4.1.1-1

All implementations MUST support the defined selectors: remote/local IP, next-layer protocol, ports, ICMP type/code (§4.4.1.1)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-4.4.1.1-1, so no unit is bound to it.

RFC4301-4.4.2-1

Inbound SAD entries MUST be populated with negotiated selector values for packet verification (§4.4.2)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInboundPolicyUsesNegotiatedTS unit/verify unproven
positive TestNarrowedSelectorsReachTheInstalledPolicy unit/verify unproven

RFC4301-4.5-1

Implementations MUST support both manual and automated (IKEv2) key management (§4.5)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
positive TestChildSAInstallsInDataplane unit/verify unproven
positive TestIPsecInstallOnInterfaceUp unit/verify unproven

RFC4301-5.2-1

Inbound packets not matching SPD-I MUST be discarded (§5.2)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-5.2-1, so no unit is bound to it.

RFC4301-5.2-2

After decapsulation, inner packet selectors MUST be verified against SAD traffic selectors (§5.2)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-5.2-2, so no unit is bound to it.

RFC4301-4.1-6

Multicast-capable implementations MUST support multicast SAD lookup (three-step: SPI+dst+src, SPI+dst, SPI alone) (§4.1)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-4.1-6, so no unit is bound to it.

RFC4301-7-1

AH/ESP MUST NOT be applied in transport mode to IPv4 fragments; use tunnel mode (§7)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC4301-7-1, so no unit is bound to it.

RFC4301-4.4.3.1-1

Sub-tree matching MUST be supported for distinguished names, domain names and RFC 822 e-mail addresses in PAD entries (§4.4.3.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestPadKeyIDStaysExact unit/verify unproven
negative TestPadSubtreeRefusesAPeerOutsideIt unit/verify unproven
positive TestPadSubtreeAdmitsAPeerBeneathIt unit/verify unproven
positive TestPadSubtreeStillBindsTheCertificate unit/verify unproven
positive TestVidPeerAuthorizationSetsCommitOnlyAsRemoteID unit/verify unproven

RFC4301-4.4.3.1-2

For IPv4 and IPv6 addresses in PAD entries, the same address range syntax used for SPD entries MUST be supported (§4.4.3.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestPadAddressRangeRefusesWhatIsOutsideIt unit/verify unproven
positive TestPadAddressRangeAdmitsAnAddressInsideIt unit/verify unproven
positive TestVidPeerAuthorizationSetsCommitOnlyAsRemoteID unit/verify unproven

RFC4301-4.4.1-4

A user or administrator MUST be able to order the SPD entries, and the management interface MUST support (total) ordering of them as seen via that interface (§4.4.1)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestSpdOrderCannotCaptureTheIKEControlPlane unit/verify unproven
negative TestSpdUnstatedOrderTakesTheDefaultRank unit/verify unproven
positive TestSpdOperatorOrdersOverlappingPeers unit/verify unproven

Extraction sign-off

No extraction sign-off exists for RFC 4301, so no reviewer has walked its text sentence by sentence.

Superseded

No document obsoletes RFC 4301, so its obligations are stated where they were written.