<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.27 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-davidben-x509-policy-graph-01" category="std" consensus="true" updates="5280" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.0 -->
  <front>
    <title abbrev="Updates to X.509 Policy Validation">Updates to X.509 Policy Validation</title>
    <seriesInfo name="Internet-Draft" value="draft-davidben-x509-policy-graph-01"/>
    <author initials="D." surname="Benjamin" fullname="David Benjamin">
      <organization>Google LLC</organization>
      <address>
        <email>davidben@google.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="28"/>
    <area>General</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document updates RFC 5280 to replace the algorithm for X.509 policy
validation with an equivalent, more efficient algorithm. The original algorithm
built a structure which scaled exponentially in the worst case, leaving
implementations vulnerable to denial-of-service attacks.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC5280"/> defines a suite of extensions for specifying certificate policies,
along with a mechanism for mapping policies between subject and issuer policy
domains in cross-certificates. This mechanism, when evaluated according to the
algorithm in <xref section="6.1" sectionFormat="comma" target="RFC5280"/> produces a policy tree, describing
policies asserted by each certificate, and mappings between them. This tree can
grow exponentially in the depth of the certification path. This can lead to a
denial-of-service attack in X.509-based applications.</t>
      <section anchor="summary-of-changes-from-rfc-5280">
        <name>Summary of Changes from RFC 5280</name>
        <t>The algorithm for processing certificate policies and policy mappings is
replaced with one which builds an equivalent, but much more efficient structure.
This new algorithm does not change the validity status of any certification
path, nor which certificate policies are valid for it.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="x509-policy-trees">
      <name>X.509 policy trees</name>
      <t>The <tt>valid_policy_tree</tt>, defined in <xref section="6.1.2" sectionFormat="of" target="RFC5280"/>, is a tree of
certificate policies. The nodes at any given depth in the tree correspond to
policies asserted by a certificate in the certificate path. A node's
parent policy is the policy in the issuer certificate which was mapped to this
policy, and a node's children are the policies it was mapped to in the subject
certificate.</t>
      <t>For example, suppose a certificate chain contains:</t>
      <ul spacing="normal">
        <li>An intermediate certificate which asserts policy object identifiers (OIDs)
OID1, OID2, and OID5. It contains mappings OID1 to OID3, and OID1 to OID4.</li>
        <li>An end-entity certificate which asserts policy OIDs OID2, OID3, and OID6.</li>
      </ul>
      <t>This would result in the tree shown in <xref target="basic-tree"/>.</t>
      <figure anchor="basic-tree">
        <name>An Example X.509 Policy Tree</name>
        <artwork type="ascii-art"><![CDATA[
                         +-----------+
        Root:            | anyPolicy |
                         +-----------+
                         |{anyPolicy}|
                         +-----------+
                          /          \
                         /            \
                        v              v
               +------------+      +------------+
Intermediate:  |    OID1    |      |    OID2    |
               +------------+      +------------+
               |{OID3, OID4}|      |   {OID2}   |
               +------------+      +------------+
                     |                   |
                     |                   |
                     v                   v
               +------------+      +------------+
  End-entity:  |    OID3    |      |    OID2    |
               +------------+      +------------+
]]></artwork>
      </figure>
      <t>The complete algorithm for building this structure is described in steps (d),
(e), and (f) of <xref section="6.1.3" sectionFormat="of" target="RFC5280"/>, steps (h), (i), (j) of <xref section="6.1.4" sectionFormat="of" target="RFC5280"/>, and steps (a), (b), and (g) of <xref section="6.1.5" sectionFormat="of" target="RFC5280"/>.</t>
      <section anchor="exponential-growth">
        <name>Exponential growth</name>
        <t>The algorithm described in <xref target="RFC5280"/> grows exponentially in the worst case. In
step (d.1) of <xref section="6.1.3" sectionFormat="of" target="RFC5280"/>, a single policy P can produce
multiple child nodes if multiple issuer policies map to P. This can cause the
tree size to increase in size multiplicatively at each level.</t>
        <t>In particular, consider a certificate chain where every intermediate certificate
asserts policies OID1 and OID2, and then contains the full Cartesian product of
mappings:</t>
        <ul spacing="normal">
          <li>OID1 maps to OID1</li>
          <li>OID1 maps to OID2</li>
          <li>OID2 maps to OID1</li>
          <li>OID2 maps to OID2</li>
        </ul>
        <t>At each depth, the tree would double in size.
For example, if there are two intermediate certificates and one end-entity certificate, the resulting tree would be as depicted in <xref target="exponential-tree"/>.</t>
        <figure anchor="exponential-tree">
          <name>An Example X.509 Policy Tree with Exponential Growth</name>
          <artwork type="ascii-art"><![CDATA[
                        +-----------------------+
                        |        anyPolicy      |
                        +-----------------------+
                        |       {anyPolicy}     |
                        +-----------------------+
                         /                     \
                        /                       \
                       v                         v
            +------------+                      +------------+
            |    OID1    |                      |    OID2    |
            +------------+                      +------------+
            |{OID1, OID2}|                      |{OID1, OID2}|
            +------------+                      +------------+
             /         \                          /         \
            /           \                        /           \
           v             v                      v             v
  +------------+    +------------+    +------------+    +------------+
  |    OID1    |    |    OID2    |    |    OID1    |    |    OID2    |
  +------------+    +------------+    +------------+    +------------+
  |{OID1, OID2}|    |{OID1, OID2}|    |{OID1, OID2}|    |{OID1, OID2}|
  +------------+    +------------+    +------------+    +------------+
    |       |         |       |         |       |         |       |
    v       v         v       v         v       v         v       v
+------+ +------+ +------+ +------+ +------+ +------+ +------+ +------+
| OID1 | | OID2 | | OID1 | | OID2 | | OID1 | | OID2 | | OID1 | | OID2 |
+------+ +------+ +------+ +------+ +------+ +------+ +------+ +------+
]]></artwork>
        </figure>
      </section>
      <section anchor="policy-graph">
        <name>Policy graph</name>
        <t><xref target="RFC5280"/> describes a tree structure, but this is an unnecessarily
inefficient representation of this information. A single certificate policy may
produce multiple nodes, but each node is identical, with identical children.</t>
        <t>This document replaces the tree structure with a directed acyclic graph.
Where <xref target="RFC5280"/> adds multiple duplicate nodes, this document adds a single node with multiple parents.
See <xref target="updates"/> for the procedure for building this structure.
<xref target="exponential-tree-as-graph"/> shows the updated representation of the above example.</t>
        <figure anchor="exponential-tree-as-graph">
          <name>A More Efficient Representation of an X.509 Policy Tree</name>
          <artwork type="ascii-art"><![CDATA[
              +-----------+
              | anyPolicy |
              +-----------+
              |{anyPolicy}|
              +-----------+
              /           \
             /             \
            v               v
     +------------+  +------------+
     |    OID1    |  |    OID2    |
     +------------+  +------------+
     |{OID1, OID2}|  |{OID1, OID2}|
     +------------+  +------------+
          |      \    /     |
          |       \  /      |
          |        \/       |
          |        /\       |
          |       /  \      |
          v      v    v     v
     +------------+  +------------+
     |    OID1    |  |    OID2    |
     +------------+  +------------+
     |{OID1, OID2}|  |{OID1, OID2}|
     +------------+  +------------+
          |      \    /     |
          |       \  /      |
          |        \/       |
          |        /\       |
          |       /  \      |
          v      v    v     v
     +------------+  +------------+
     |    OID1    |  |    OID2    |
     +------------+  +------------+
]]></artwork>
        </figure>
        <t>This graph's size is bounded linearly by the total number of certificate
policies (<xref section="4.2.1.4" sectionFormat="of" target="RFC5280"/>) and policy mappings (<xref section="4.2.1.5" sectionFormat="of" target="RFC5280"/>). The policy tree from <xref target="RFC5280"/> is the tree of all paths from the root to a leaf in the policy graph,
so no information is lost in the graph representation.</t>
        <t>Implementations of X.509 SHOULD implement a policy graph structure instead of a policy tree.</t>
      </section>
      <section anchor="outputs">
        <name>Verification outputs</name>
        <t><xref section="6.1.6" sectionFormat="of" target="RFC5280"/> describes the entire <tt>valid_policy_tree</tt> structure as
an output of the verification process. Section 12.2 of <xref target="X.509"/> instead only
outputs the authorities-constrained policies, the user-constrained policies,
and their associated qualifiers.</t>
        <t>An implementation which outputs the entire tree may be unable switch the format
to a more efficient one, as described in <xref target="policy-graph"/>. X.509 implementations
SHOULD NOT output the entire <tt>valid_policy_tree</tt> structure and instead SHOULD
limit output to just the set of authorities-constrained and/or user-constrained
policies, as described in <xref target="X.509"/>. X.509 implementations are additionally
RECOMMENDED to omit policy qualifiers from the output, as this simplifies the
process. Note <xref section="4.2.1.4" sectionFormat="of" target="RFC5280"/> conversely recommends that
certificate authorities omit policy qualifiers from policy information terms.
This document reiterates this and RECOMMENDS that certificate authorities omit
the policyQualifiers field in PolicyInformation structures.</t>
      </section>
      <section anchor="other-mitigations">
        <name>Other mitigations</name>
        <t>X.509 implementations that are unable switch to the policy graph structure
SHOULD mitigate the denial-of-service attack in other ways. This section
describes alternate mitigation and partial mitigation strategies.</t>
        <section anchor="limit-certificate-depth">
          <name>Limit certificate depth</name>
          <t>X.509 validators typically already allow limiting the depth of a certificate
chain. This can limit the attack, however a large depth limit may still admit
attacks. By modifying the example in <xref target="exponential-growth"/> to increase the
number of policies asserted in each certificate, an attacker could still achieve
O(N^(depth/2)) scaling or higher.</t>
        </section>
        <section anchor="limit-policy-tree-size">
          <name>Limit policy tree size</name>
          <t>If existing stable interfaces force the validator to build a full policy tree
(see <xref target="outputs"/>), the validator SHOULD limit the number of nodes in the policy
tree, and reject the certification path if this limit is reached.</t>
        </section>
        <section anchor="inhibit-policy-mapping">
          <name>Inhibit policy mapping</name>
          <t>If policy mapping is disabled via the initial-policy-mapping-inhibit setting
(see <xref section="6.1.1" sectionFormat="of" target="RFC5280"/>), the attack is mitigated. This also
significantly simplifies the X.509 implementation, which reduces the risk of
other security bugs. However, this will break compatibility with any existing
certificate paths which rely on policy mapping.</t>
          <t>To faciliate this mitigation, certificate authorities SHOULD NOT issue
certificates with the policy mappings extension (<xref section="4.2.1.5" sectionFormat="of" target="RFC5280"/>). Applications maintaining policies for accepted trust anchors are
RECOMMENDED to forbid this extension in participating certificate authorities.</t>
        </section>
        <section anchor="disable-policy-checking">
          <name>Disable policy checking</name>
          <t>An X.509 validator can mitigate this attack by disabling policy validation
entirely. This may be viable for applications which do not require policy
validation. In this case, critical policy-related extensions, notably the policy
constraints (<xref section="4.2.1.11" sectionFormat="of" target="RFC5280"/>), MUST be treated as unrecognized
extensions as in <xref section="4.2" sectionFormat="of" target="RFC5280"/> and be rejected.</t>
        </section>
        <section anchor="verify-signatures-first">
          <name>Verify signatures first</name>
          <t>X.509 validators SHOULD verify signatures in certificate paths before or in
conjunction with policy verification. This limits the attack to entities in
control of CA certificates. For some applications, this may be sufficient to
mitigate the attack. However, other applications may still be impacted. For
example:</t>
          <ul spacing="normal">
            <li>Any application that evaluates an untrusted PKI, such as a hosting provider
that evaluates a customer-supplied PKI</li>
            <li>Any application that evaluates an otherwise trusted PKI, but where untrusted
entities have technically-constrained intermediate certificates where policy
mapping and path length are unconstrained.</li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="updates">
      <name>Updates to RFC 5280</name>
      <t>This section provides updates to <xref target="RFC5280"/>.</t>
      <section anchor="updates-to-section-61">
        <name>Updates to Section 6.1</name>
        <t>This update replaces a paragraph of <xref section="6.1" sectionFormat="of" target="RFC5280"/> as follows:</t>
        <t>OLD:</t>
        <ul empty="true">
          <li>
            <t>A particular certification path may not, however, be appropriate for
  all applications.  Therefore, an application MAY augment this
  algorithm to further limit the set of valid paths.  The path
  validation process also determines the set of certificate policies
  that are valid for this path, based on the certificate policies
  extension, policy mappings extension, policy constraints extension,
  and inhibit anyPolicy extension.  To achieve this, the path
  validation algorithm constructs a valid policy tree.  If the set of
  certificate policies that are valid for this path is not empty, then
  the result will be a valid policy tree of depth n, otherwise the
  result will be a null valid policy tree.</t>
          </li>
        </ul>
        <t>NEW:</t>
        <ul empty="true">
          <li>
            <t>A particular certification path may not, however, be appropriate for
  all applications.  Therefore, an application MAY augment this
  algorithm to further limit the set of valid paths.  The path
  validation process also determines the set of certificate policies
  that are valid for this path, based on the certificate policies
  extension, policy mappings extension, policy constraints extension,
  and inhibit anyPolicy extension.  To achieve this, the path
  validation algorithm constructs a valid policy set, which may be empty if
  no certificate policies are valid for this path.</t>
          </li>
        </ul>
      </section>
      <section anchor="updates-to-section-612">
        <name>Updates to Section 6.1.2</name>
        <t>This update replaces entry (a) of <xref section="6.1.2" sectionFormat="of" target="RFC5280"/> with the following text:</t>
        <ol spacing="normal" type="(%c)"><li>
            <t><tt>valid_policy_graph</tt>:  A directed acyclic graph of certificate
policies with their optional qualifiers; each of the leaves
of the graph represents a valid policy at this stage in the
certification path validation.  If valid policies exist at
this stage in the certification path validation, the depth of
the graph is equal to the number of certificates in the chain
that have been processed.  If valid policies do not exist at
this stage in the certification path validation, the graph is
set to NULL.  Once the graph is set to NULL, policy processing
ceases.  Implementations MAY omit qualifiers if not returned
in the output.  </t>
            <t>
Each node in the <tt>valid_policy_graph</tt> includes three data objects:
the valid policy, a set of associated policy qualifiers, and a set of
one or more expected policy values.  </t>
            <t>
Nodes in the graph can be divided into depths, numbered starting from zero.
A node at depth x can have zero or more children at depth x+1, with the
exception of depth zero, one or more parents at depth x-1. No other edges
between nodes may exist.  </t>
            <t>
If the node is at depth x, the components of the node have
the following semantics:  </t>
            <ol spacing="normal" type="(%d)"><li>The <tt>valid_policy</tt> is a single policy OID representing a valid policy for the path of length x.</li>
              <li>The <tt>qualifier_set</tt> is a set of policy qualifiers associated with the valid policy in certificate x.
It is only necessary to maintain this field if policy qualifiers are returned to the application.
See Section 6.1.5, step (g).</li>
              <li>The <tt>expected_policy_set</tt> contains one or more policy OIDs that would satisfy this policy in the certificate x+1.</li>
            </ol>
            <t>
The initial value of the <tt>valid_policy_graph</tt> is a single node with
<tt>valid_policy</tt> anyPolicy, an empty <tt>qualifier_set</tt>, and an
<tt>expected_policy_set</tt> with the single value anyPolicy.  This node is
considered to be at depth zero.  </t>
            <t>
The graph additionally satisfies the following invariants:  </t>
            <ul spacing="normal">
              <li>For any depth x and policy OID P-OID, there is at most one node at depth x whose <tt>valid_policy</tt> is P-OID.</li>
              <li>The <tt>expected_policy_set</tt> of a node whose <tt>valid_policy</tt> is anyPolicy is always {anyPolicy}.</li>
              <li>A node at depth x whose <tt>valid_policy</tt> is anyPolicy, except for the one at
depth zero, always has exactly one parent: a node at depth x-1 whose
<tt>valid_policy</tt> is also anyPolicy.</li>
              <li>Each node at depth greater than 0 has either one or more parent nodes whose <tt>valid_policy</tt> is not anyPolicy,
or a single parent node whose <tt>valid_policy</tt> is anyPolicy.
That is, a node cannot simultaneously be a child of both anyPolicy and some non-anyPolicy OID.</li>
            </ul>
            <t>
<xref target="graph-initial"/> is a graphic representation of the initial state of the
<tt>valid_policy_graph</tt>.  Additional figures will use this format to
describe changes in the <tt>valid_policy_graph</tt> during path processing.  </t>
            <figure anchor="graph-initial">
              <name>Initial value of the valid_policy_graph State Variable</name>
              <artwork type="ascii-art"><![CDATA[
    +----------------+
    |   anyPolicy    |   <---- valid_policy
    +----------------+
    |       {}       |   <---- qualifier_set
    +----------------+
    |  {anyPolicy}   |   <---- expected_policy_set
    +----------------+
]]></artwork>
            </figure>
          </li>
        </ol>
      </section>
      <section anchor="updates-to-section-613">
        <name>Updates to Section 6.1.3</name>
        <t>This update replaces steps (d), (e), and (f) of <xref section="6.1.3" sectionFormat="of" target="RFC5280"/> with the following text:</t>
        <ol spacing="normal" type="(%c)" start="4"><li>
            <t>If the certificate policies extension is present in the
certificate and the <tt>valid_policy_graph</tt> is not NULL, process
the policy information by performing the following steps in
order:  </t>
            <ol spacing="normal" type="(%d)"><li>
                <t>For each policy P not equal to anyPolicy in the certificate policies extension,
let P-OID denote the OID for policy P and P-Q denote the qualifier set for policy P.
Perform the following steps in order:      </t>
                <ol spacing="normal" type="(%i)"><li>
                    <t>Let <tt>parent_nodes</tt> be the nodes at depth i-1 in the <tt>valid_policy_graph</tt> where P-OID is in the <tt>expected_policy_set</tt>.
If <tt>parent_nodes</tt> is not empty, create a child node as follows:
set the <tt>valid_policy</tt> to P-OID, set the <tt>qualifier_set</tt> to P-Q, set the <tt>expected_policy_set</tt> to {P-OID}, and set the parent nodes to <tt>parent_nodes</tt>.          </t>
                    <t>
For example, consider a <tt>valid_policy_tree</tt> with a node of depth i-1 where the <tt>expected_policy_set</tt> is {Gold, White},
and a second node where the <tt>expected_policy_set</tt> is {Gold, Yellow}.
Assume the certificate policies Gold and Silver appear in the certificate policies extension of certificate i.
The Gold policy is matched, but the Silver policy is not.
This rule will generate a child node of depth i for the Gold policy.
The result is shown as <xref target="exact-match"/>.          </t>
                    <figure anchor="exact-match">
                      <name>Processing an Exact Match</name>
                      <artwork type="ascii-art"><![CDATA[
    +-----------------+      +-----------------+
    |       Red       |      |       Blue      |
    +-----------------+      +-----------------+
    |       {}        |      |       {}        |   depth i-1
    +-----------------+      +-----------------+
    |  {Gold, White}  |      |  {Gold, Yellow} |
    +-----------------+      +-----------------+
                \                   /
                 \                 /
                  \               /
                   v             v
                 +-----------------+
                 |      Gold       |
                 +-----------------+
                 |       {}        |   depth i
                 +-----------------+
                 |     {Gold}      |
                 +-----------------+
]]></artwork>
                    </figure>
                  </li>
                  <li>
                    <t>If there was no match in step (i) and the <tt>valid_policy_graph</tt> includes a node of depth i-1 with the <tt>valid_policy</tt> anyPolicy,
generate a child node with the following values:
set the <tt>valid_policy</tt> to P-OID, set the <tt>qualifier_set</tt> to P-Q, set the <tt>expected_policy_set</tt> to {P-OID},
and set the parent node to the anyPolicy node at depth i-1.          </t>
                    <t>
For example, consider a <tt>valid_policy_graph</tt> with a node
of depth i-1 where the <tt>valid_policy</tt> is anyPolicy.
Assume the certificate policies Gold and Silver appear
in the certificate policies extension of certificate
i.  The Gold policy does not have a qualifier, but the
Silver policy has the qualifier Q-Silver.  If Gold and
Silver were not matched in (i) above, this rule will
generate two child nodes of depth i, one for each
policy.  The result is shown as <xref target="unmatched-anypolicy"/>.          </t>
                    <figure anchor="unmatched-anypolicy">
                      <name>Processing Unmatched Policies when a Leaf Node Specifies anyPolicy</name>
                      <artwork type="ascii-art"><![CDATA[
                  +-----------------+
                  |    anyPolicy    |
                  +-----------------+
                  |       {}        |
                  +-----------------+   depth i-1
                  |   {anyPolicy}   |
                  +-----------------+
                     /           \
                    /             \
                   /               \
                  /                 \
    +-----------------+          +-----------------+
    |      Gold       |          |     Silver      |
    +-----------------+          +-----------------+
    |       {}        |          |   {Q-Silver}    |   depth i
    +-----------------+          +-----------------+
    |     {Gold}      |          |    {Silver}     |
    +-----------------+          +-----------------+
]]></artwork>
                    </figure>
                  </li>
                </ol>
              </li>
              <li>
                <t>If the certificate policies extension includes the policy anyPolicy with the qualifier set AP-Q and either (a)
<tt>inhibit_anyPolicy</tt> is greater than 0 or (b) i&lt;n and the certificate is self-issued, then:      </t>
                <t>
For each policy OID P-OID (including anyPolicy) which appears in the <tt>expected_policy_set</tt> of some node in the <tt>valid_policy_graph</tt> for depth i-1,
if P-OID does not appear as the <tt>valid_policy</tt> of some node at depth i, create a single child node with the following values:
set the <tt>valid_policy</tt> to P-OID, set the <tt>qualifier_set</tt> to AP-Q, set the <tt>expected_policy_set</tt> to {P-OID},
and set the parents to the nodes at depth i-1 where P-OID appears in <tt>expected_policy_set</tt>.      </t>
                <t>
This is equivalent to running step (1) above, as if the certificate policies extension contained a policy with OID P-OID and qualifier set AP-Q.      </t>
                <t>
For example, consider a <tt>valid_policy_graph</tt> with a node of depth i-1 where the <tt>expected_policy_set</tt> is {Gold, Silver},
and a second node of depth i-1 where the <tt>expected_policy_set</tt> is {Gold, Bronze}.
Assume anyPolicy appears in the certificate policies extension of certificate i with policy qualifiers AP-Q, but Gold and Silver do not appear.
This rule will generate two child nodes of depth i, one for each policy.
The result is shown below as <xref target="anypolicy-in-extension"/>.      </t>
                <figure anchor="anypolicy-in-extension">
                  <name>Processing Unmatched Policies When the Certificate Policies Extension Specifies anyPolicy</name>
                  <artwork type="ascii-art"><![CDATA[
    +-----------------+   +-----------------+
    |       Red       |   |       Blue      |
    +-----------------+   +-----------------+
    |       {}        |   |       {}        |   depth i-1
    +-----------------+   +-----------------+
    |  {Gold, Silver} |   |  {Gold, Bronze} |
    +-----------------+   +-----------------+
            |         \            |
            |          \           |
            |           \          |
            |            \         |
            |             \        |
            v              v       v
    +-----------------+   +-----------------+
    |     Silver      |   |       Gold      |
    +-----------------+   +-----------------+
    |     {AP-Q}      |   |      {AP-Q}     |   depth i
    +-----------------+   +-----------------+
    |    {Silver}     |   |      {Gold}     |
    +-----------------+   +-----------------+
]]></artwork>
                </figure>
              </li>
              <li>
                <t>If there is a node in the <tt>valid_policy_graph</tt> of depth i-1 or less without any child nodes, delete that node.
Repeat this step until there are no nodes of depth i-1 or less without children.      </t>
                <t>
For example, consider the valid_policy_graph shown in <xref target="pruning"/> below.
The two nodes at depth i-1 that are marked with an 'X' have no children, and they are deleted.
Applying this rule to the resulting graph will cause the nodes at depth i-2 that is marked with a 'Y' to be deleted.
In the resulting graph, there are no nodes of depth i-1 or less without children, and this step is complete.      </t>
                <figure anchor="pruning">
                  <name>Pruning the valid_policy_graph</name>
                  <artwork type="ascii-art"><![CDATA[
                  +-----------+
                  |           | depth i-3
                  +-----------+
                  /     |     \
                 /      |      \
                /       |       \
    +-----------+ +-----------+ +-----------+
    |           | |           | |     Y     | depth i-2
    +-----------+ +-----------+ +-----------+
          |     \       |             |
          |      \      |             |
          |       \     |             |
    +-----------+ +-----------+ +-----------+
    |     X     | |           | |     X     | depth i-1
    +-----------+ +-----------+ +-----------+
                   /    |    \
                  /     |     \
                 /      |      \
    +-----------+ +-----------+ +-----------+
    |           | |           | |           | depth i
    +-----------+ +-----------+ +-----------+
]]></artwork>
                </figure>
              </li>
            </ol>
          </li>
          <li>If the certificate policies extension is not present, set the <tt>valid_policy_graph</tt> to NULL.</li>
          <li>Verify that either <tt>explicit_policy</tt> is greater than 0 or the <tt>valid_policy_graph</tt> is not equal to NULL;</li>
        </ol>
      </section>
      <section anchor="updates-to-section-614">
        <name>Updates to Section 6.1.4</name>
        <t>This update replaces step (b) of <xref section="6.1.4" sectionFormat="of" target="RFC5280"/> with the following text:</t>
        <ol spacing="normal" type="(%c)" start="2"><li>
            <t>If a policy mappings extension is present, then for each issuerDomainPolicy ID-P in the policy mappings extension:  </t>
            <ol spacing="normal" type="(%d)"><li>
                <t>If the policy_mapping variable is greater than 0, if there is a
node in the <tt>valid_policy_graph</tt> of depth i where ID-P is the
valid_policy, set <tt>expected_policy_set</tt> to the set of
subjectDomainPolicy values that are specified as
equivalent to ID-P by the policy mappings extension.      </t>
                <t>
If no node of depth i in the <tt>valid_policy_tree</tt> has a
<tt>valid_policy</tt> of ID-P but there is a node of depth i with a
<tt>valid_policy</tt> of anyPolicy, then generate a child node of
the node of depth i-1 that has a <tt>valid_policy</tt> of anyPolicy
as follows:      </t>
                <ol spacing="normal" type="(%i)"><li>set the <tt>valid_policy</tt> to ID-P;</li>
                  <li>set the <tt>qualifier_set</tt> to the qualifier set of the
policy anyPolicy in the certificate policies
extension of certificate i; and</li>
                  <li>set the <tt>expected_policy_set</tt> to the set of
subjectDomainPolicy values that are specified as
equivalent to ID-P by the policy mappings extension.</li>
                </ol>
              </li>
              <li>
                <t>If the <tt>policy_mapping</tt> variable is equal to 0:      </t>
                <ol spacing="normal" type="(%i)"><li>delete the node, if any, of depth i in the <tt>valid_policy_graph</tt> where ID-P is the <tt>valid_policy</tt>.</li>
                  <li>If there is a node in the <tt>valid_policy_tree</tt> of depth
i-1 or less without any child nodes, delete that
node.  Repeat this step until there are no nodes of
depth i-1 or less without children.</li>
                </ol>
              </li>
            </ol>
          </li>
        </ol>
      </section>
      <section anchor="updates-to-section-615">
        <name>Updates to Section 6.1.5</name>
        <t>This update replaces step (g) of <xref section="6.1.5" sectionFormat="of" target="RFC5280"/> with the following text:</t>
        <ol spacing="normal" type="(%c)" start="7"><li>
            <t>Calculate the <tt>user_constrained_policy_set</tt> as follows.
The <tt>user_constrained_policy_set</tt> is a set of policy OIDs, along with associated policy qualifiers.  </t>
            <ol spacing="normal" type="(%d)"><li>If the <tt>valid_policy_graph</tt> is NULL, set <tt>valid_policy_node_set</tt> to the empty set.</li>
              <li>If the <tt>valid_policy_graph</tt> is not NULL, set <tt>valid_policy_node_set</tt> to the set of policy nodes
whose <tt>valid_policy</tt> is not anyPolicy and
whose parent list is a single node with <tt>valid_policy</tt> of anyPolicy.</li>
              <li>If the <tt>valid_policy_graph</tt> is not NULL and contains a node of depth n with the <tt>valid_policy</tt> anyPolicy, add it to <tt>valid_policy_node_set</tt>.</li>
              <li>
                <t>Compute <tt>authority_constrained_policy_set</tt>, a set of policy OIDs and associated qualifiers as follows. For each node in <tt>valid_policy_node_set</tt>:      </t>
                <ol spacing="normal" type="(%i)"><li>Add the node's <tt>valid_policy</tt> to <tt>authority_constrained_policy_set</tt>.</li>
                  <li>If returning policy qualifiers in the output, collect all qualifiers in the node, its ancestors, and descendants and associate them with <tt>valid_policy</tt>. Returning policy qualifiers in the output is NOT RECOMMENDED.</li>
                </ol>
              </li>
              <li>Set <tt>user_constrained_policy_set</tt> to <tt>authority_constrained_policy_set</tt>.</li>
              <li>
                <t>If the user-initial-policy-set is not anyPolicy:      </t>
                <ol spacing="normal" type="(%i)"><li>Remove any elements of <tt>user_constrained_policy_set</tt> which do not appear in user-initial-policy-set.</li>
                  <li>If anyPolicy appears in <tt>authority_constrained_policy_set</tt> with qualifiers AP-Q, for each OID P-OID in user-initial-policy-set which does not appear in <tt>user_constrained_policy_set</tt>, add P-OID with qualifiers AP-Q to <tt>user_constrained_policy_set</tt>.</li>
                </ol>
              </li>
            </ol>
          </li>
        </ol>
        <t>Additionally, this update replaces the final paragraph as follows:</t>
        <t>OLD:</t>
        <ul empty="true">
          <li>
            <t>If either (1) the value of <tt>explicit_policy</tt> variable is greater than
zero or (2) the <tt>valid_policy_tree</tt> is not NULL, then path processing
has succeeded.</t>
          </li>
        </ul>
        <t>NEW:</t>
        <ul empty="true">
          <li>
            <t>If either (1) the value of <tt>explicit_policy</tt> variable is greater than
zero or (2) the <tt>user_constrained_policy_set</tt> is not empty, then path processing
has succeeded.</t>
          </li>
        </ul>
      </section>
      <section anchor="updates-to-section-616">
        <name>Updates to Section 6.1.6</name>
        <t>This update replaces <xref section="6.1.6" sectionFormat="of" target="RFC5280"/> with the following text:</t>
        <ul empty="true">
          <li>
            <t>If path processing succeeds, the procedure terminates, returning a
success indication together with final value of the <tt>user_constrained_policy_set</tt>,
the <tt>working_public_key</tt>, the <tt>working_public_key_algorithm</tt>, and the
<tt>working_public_key_parameters</tt>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document addresses a denial-of-service vulnerability in <xref target="RFC5280"/>'s
policy tree algorithm.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC5280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper">
              <organization/>
            </author>
            <author fullname="S. Santesson" initials="S." surname="Santesson">
              <organization/>
            </author>
            <author fullname="S. Farrell" initials="S." surname="Farrell">
              <organization/>
            </author>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen">
              <organization/>
            </author>
            <author fullname="R. Housley" initials="R." surname="Housley">
              <organization/>
            </author>
            <author fullname="W. Polk" initials="W." surname="Polk">
              <organization/>
            </author>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet.  An overview of this approach and model is provided as an introduction.  The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms.  Standard certificate extensions are described and two Internet-specific extensions are defined.  A set of required certificate extensions is specified.  The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions.  An algorithm for X.509 certification path validation is described.  An ASN.1 module and examples are provided in the appendices.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="X.509">
          <front>
            <title>Information technology - Open Systems Interconnection - The Directory: Public-key and attribute certificate frameworks</title>
            <author>
              <organization>International Telecommunications Union</organization>
            </author>
            <date year="2019" month="October"/>
          </front>
          <seriesInfo name="ITU-T" value="Recommendation X.509"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The author thanks Bob Beck, Adam Langley, Matt Mueller, and Ryan Sleevi for
many valuable discussions that led to discovering this issue, understanding it,
and developing the mitigation.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
n5TvkG2CZz/w920wPbKfUTymRyCHsHbFH8H7aC4jWQ1J1ahXpjjY3nermy+2
bm/K2JWBcXkmsd8iHieJNYd3qx7Xtp2QltHj803eXSn+IUP/RCFGW7KMfsAt
y3pKiYXGc285mBC8FoSDBXgsAH/Vj47E+ezCaos++ZmAMdxxVKR14U9g2cl9
i5qy0VJcgWFfWwGm6+daVyKhZLTVaOtkvtELvHGXbhjiA58UhNk85OBGGpfl
OjCo1mT37t1s5wDPUWePxi4T3M7Y8EjswMM9UOx/E72szNx43yhoCjc1gLcr
ekfBJNWn7e/Ig9EvOrqLPXqv7sDbwmRv+2DfrGn52EV3OTm0qIF2zMHTe4f7
gyAjMPsEsFunZaAdBM5VM5tpndDVKObmhX/aOLd53tbtEzsMeRidfDOATjZe
HzqMSIgrrfGYkZiLDeyF23ylA45q5NnIGBqhGhWqTmKv0ilONTGbOmdBCs9b
bpRxaJQK4S+vQi8flvSLrR8+6dXH0dCbD/a+hY82+Azt9JVEkV7gHRV0QOAO
sphvQ3si4XNz62J4LyQoXoln6NEJdy9MNL9LylelBT+0uV7fNT9Hx9eKuF9P
pV8mPX55vKXrM05SpZLxzPxw5Xg8VtN49gkbOZ59youLDM9Sk+EEuGmOgX+/
N4+zyv6cE1s3kudPlXpcTNVjjfcfHifxQj2PEciArL6I61q9aDR4uJL5+WYV
5+ptpvU5peRHC7TTdFsSakqSVrOmqty1lBkfS8XnBV5dZaL9FEIZKbykuKSf
KqZzpzXfCpvgzwUVSxMec3fDTaL/BSX+KDezeQAA

-->

</rfc>
