a positive test proves Ze does what the requirement demands and a negative one proves it refuses what the requirement forbids
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
the requirement admits no counter-case, so one polarity plus a recorded reason is the whole proof available for it
one direction is tested, the other is neither tested nor excused, and nothing states which
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
MUST-level requirements the gate HOLDS. A population, not a result: the shares beside it are what says how Ze stands
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 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.
| Card | Tone here | Why 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
| Field | Value |
|---|---|
| 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
| Bucket | Count | What 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 requirements | 18 | every 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
| Requirement | Level | Section | Tests |
|---|---|---|---|
RFC4301-4.1-1 | Host implementations MUST support both transport and tunnel mode (§4.1) | ||
| MUST | 4.1 | negative
no 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-2 | Security gateways MUST support tunnel mode (§4.1) | ||
| MUST | 4.1 | negative
no 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-3 | SAs between a security gateway and any peer MUST use tunnel mode (two narrow exceptions for gateway-as-host) (§4.1) | ||
| MUST | 4.1 | negative
no 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-4 | IKE-created SA pairs MUST use the same mode (both tunnel or both transport) (§4.1) | ||
| MUST | 4.1 | negative
no 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-5 | Implementation MUST permit multiple SAs between same endpoints with same selectors (QoS differentiation) (§4.1) | ||
| MUST | 4.1 | positive
no testno positive testnegative
no 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-1 | MUST NOT instantiate an ESP SA with both NULL encryption and no integrity algorithm (§4.2) | ||
| MUST NOT | 4.2 | ||
RFC4301-4.4.1-1 | Implementation MUST have at least one SPD (§4.4.1) | ||
| MUST | 4.4.1 | negative
no 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-2 | SPD MUST be consulted for ALL traffic crossing IPsec boundary, including IKE management traffic (§4.4.1, §5) | ||
| MUST | 4.4.1 | positive
no testno positive testnegative
no 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-1 | All 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 | positive
no testno positive testnegative
no 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-1 | Inbound SAD entries MUST be populated with negotiated selector values for packet verification (§4.4.2) | ||
| MUST | 4.4.2 | negative
no 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-1 | Implementations MUST support both manual and automated (IKEv2) key management (§4.5) | ||
| MUST | 4.5 | negative
no 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-1 | Inbound packets not matching SPD-I MUST be discarded (§5.2) | ||
| MUST | 5.2 | positive
no testno positive testnegative
no 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-2 | After decapsulation, inner packet selectors MUST be verified against SAD traffic selectors (§5.2) | ||
| MUST | 5.2 | positive
no testno positive testnegative
no 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-6 | Multicast-capable implementations MUST support multicast SAD lookup (three-step: SPI+dst+src, SPI+dst, SPI alone) (§4.1) | ||
| MUST | 4.1 | positive
no testno positive testnegative
no 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-1 | AH/ESP MUST NOT be applied in transport mode to IPv4 fragments; use tunnel mode (§7) | ||
| MUST NOT | 7 | positive
no testno positive testnegative
no 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-3 | SPD SHOULD have a default final entry that discards unmatched traffic (§4.4.1) | ||
| SHOULD | 4.4.1 | positive
no testno positive testnegative
no testno negative test |
|
RFC4301-7-2 | Encapsulator SHOULD perform Path MTU Discovery and adjust tunnel MTU (§7) | ||
| SHOULD | 7 | positive
no testno positive testnegative
no testno negative test |
|
RFC4301-4.1-7 | Security gateways MAY support transport mode only when acting as a host (e.g., SNMP management traffic) (§4.1) | ||
| MAY | 4.1 | positive
no testno positive testnegative
no testno negative test |
|
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) | ||
| MUST | 4.4.3.1 | ||
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) | ||
| MUST | 4.4.3.1 | ||
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) | ||
| MUST | 4.4.1 | ||
Gaps and untested MUSTs
| Requirement | State | Reason |
|---|---|---|
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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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
| Polarity | Test | Kind and tier | Proof 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.