<?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.23 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-davidben-x509-policy-graph-00" category="std" consensus="true" updates="5280" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.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-00"/>
    <author initials="D." surname="Benjamin" fullname="David Benjamin">
      <organization>Google LLC</organization>
      <address>
        <email>davidben@google.com</email>
      </address>
    </author>
    <date year="2023" month="February" day="22"/>
    <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 "valid_policy_tree", 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 OID3.</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.
<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"/>). It represents the same information as the policy tree. The policy
tree is the tree of all possibles from the root to a leaf in the policy graph.</t>
        <t>Implementations of X.509 SHOULD implement a policy graph structure, as described
in <xref target="updates"/>, 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 "valid_policy_tree" value 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 "valid_policy_tree" 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 to build the policy tree 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 trustanchors 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" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <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:
H4sIAGxi9mMAA+09aXMbx5Xf51f0UrUlMQYgkZKTmI5TSx2xWavLOuK41rvS
ANMAxxrMIHOQginkt++7+poD4JXaqq3wgwTMdL/u9/pd/d7rxng8juq0zvSR
er9K4lpXqi7U3yZfP/hGvS6ydLZWf42zFN6kRR7F02mpzy7VNClmebwEsEkZ
z+txEp+lyVTn48/QfLyi5uNFGa9Oxw8eRDOAtijK9ZGq6iSKGgZ/pL4+/OOD
KEpX5ZGqy6aqDx88+ObBYRSXOj5S3+tcl3EWfdLr86JMjtRJXusy1/X4KQ4Z
RVUd58mHOCtymMZaV9EqPVL/VRezkaqKsi71vIJP6yV++O8oipv6tCiPIjWO
FPylOUxg7+lEPdb5r/EyzffoMSO19xTxab0qykWcp78R/tDk+6JYZFo9f/6E
X+tlnGZAD6HEfyzo/WRWLAHFfF6US+h5pmECTNQj6iWL82f6ogBHaVjkqtaz
07zIisVajdWrlc7V23VV62Vl2wI9ZkWe6xm1H6t3p1o9TUv4TsR+3UxhHcZA
QAWUkl5xXZfptKm1mumyTucpLo6al4A3kPkTA7e0UoK4oT7NLM7UO51pwGzZ
5NgfnlXqfY58ge1xdY/UK5jFVJfq8MHBN/S40mWqKySFAXzy7v343ZF6Q6B0
zqzF1ImiaDweq3ha1WU8g9V+d5pWCriugYa1EhZSb/7yhLgIWbXUqyyeaVUD
FeIM+C2tT5cK6ClMzFwZnVkmVufQAkij9N+bFB4D4JFaFqVWeg50SXEgC2hC
1IXPixQJYJ9H0ybNoB2wdtnM6gZ6n5+ms1NVzQBiovTnFTBoXqdxlq2B62h6
QOmqVrO40iOVaeCYfBGly1WmETmh51mToQBMgccAuUTnAGFczMdAxrMU0ISF
jGefqgkTapkmSaaj6A4uVFkkDfFEFF1c/BvQCEm02QCQeZoD1WCyTQqrXsxh
erXOKxoQKVWt9Cydr2E+AXsQ6WDxRhGK20IIp5bAoSASFVN5Ga9W2NE0VlNd
n2tg26qZ/go8iUyo0qpqgClkLZIChAaGBrLMyqKqxt6gFVIc1twOMgLCAjQN
K9XA+0TFsxkoBhwSCARkjdyqA0CH+Ui9FRH5/eQAyLAi+hAdeB6gfTSsRKKr
GcgGLobFIa6A3jjYdK10DMvqzXBEGAnaDl2YyVLmjnBhmfNoURbn/ayQ6BXQ
ElYCvzjgONtVXJ8KIICBjJIgpnE0xAwIk3h9PAXWAgKtVpmRT+CTO3fU22a5
jMs1jvcEqLoADOdlsbRyhHLWlh4gFxCrGuIJIoLQ0dIirSIRx4SZBRAXuUB5
Saq22IFGUssGXrfkz0rVhDVArs+96SUFjJ8XIEqEDNGQ5Dut19A1rpsKUY3z
dUjaCEk7gp6lTKofsVKgERnSGkmonhT5Ga4hSgxi/hRlKqXvTDxUt2iwKrX3
4v3bd3sj/l+9fEWf3zz78f3Jm2dP8fPbH46fP7cfTIu3P7x6/xzeR/LJ9Xzy
6sWLZy+fcmd4qlqPXhz/vMdMuffq9buTVy+Pn+8xn8F6WN2JaAEbTTW8Ap2+
KjUJU2X4H75An8dPXquDRyJFhwcH34Dg8Jc/Hvzh0WYToTDyYEUO7MxfYQHW
yHY6LhEIMDqw7iqt4wxsMQxRnRbnuTrVuJ5ATF8xk7AIDfeI7B/4xQd8sTcS
7ZWwbHsSPTnENXZqbgTcB6JNslfMo76lZWWeFwmuck38sQDbnIs0imiy9BZl
qSsQXJS9fr0QB+wjnYNhSZCPacC74KfACsA6CNqoJk61/ca9RU36QJhRz4GI
KGU6YaUHC8s9eSliGQMEAqQMhuHVPvW4Oq1bQGRI0dI+vWCN/gKcrz/HaJvA
mWpWq6LSLYRB9lB/F2C50KmKot+p45x5a6mTNG65GowH068yaBdsIdIERWue
6rJS916dPK32wVOA/w9G+O8h4wifvp6ok9oO6dQONkWU4P+HtrF58mgiUwNP
Y4zj1OvdE8NJyNgB0IcTcUnOiyZLwPeoGvACfMZhVidmBW0Mfhg+3Wyg3z/+
8Q8YZpam47isxRXq+ftq7P6+ss3eFEV95Df7guwrDvqXq0Lr/H25sNA2N4em
7ruPvww3u+9/GW531vrabuhPavxV37PoxOPKI6SdYv7C/79wD/PskL5cY4xW
jy8XzDjIgRtvDHx8uLmdMbyZt5/duOlZ37NrTfmZlTuP9A+96dyY9CBZ0cWR
uuMEjjdY3+2B2D9jNRZuad+hbdmw1YFdCLyv2/4POSzkZaK8Ozc/bVlM2Jut
QG0l+6Pont5nTXFvvo/GKbRXD9v2SnqeQqd7Kf7za9grwl6P2r0QvvSMsdPU
jLnoGfNrNIWuN3uDz5xDqtBDBdN3ccfzUsf8cNP2CgO0Ly7cBgPbV7u2PKC7
8wgnDrSaHFyGPrBfAfpn1ki+Jn9Y3PhoCZo3xYUlmydWPZ0r+9zfc6AFBHOB
JuG151vP4qYiOxmx7k5/02waZ6WGKdPy4jOBSW7kmQbswHugbUGm4StQ9QTd
drApsyaLyxGaqAqMWtlrMs/RD4L9jC7Xg+YyCuwRzp7UlVghsYg17ousNURq
zxvwvJ7ARGDDbUlVIw8YW0l2mmDBk0pM5EHPs0N+dtjT7jBsFx0LMciLGjlT
yDYyKRrczAopJ6FrkdIGCMhB/sp5MUiQSlxOPWDGeVi2xyS0bgLg8ZKXu0pn
teFdn9uvaKAD3XMpe2i1rrPYqlfV3cIYnh2/9TFCg23/hi13f/stPfqMjrwJ
uvTZhPbfFtPZZ//bf1uM0k1Hv3Cu7WZo9KDNbY7uLcov/Z1bjaL+51u6B438
7uHyDix2q1HUh/HVn0R9qx6usf9kqM0tzqbDBVd/cnuzcWLgGPJKTyJ/6dwS
XulJ9JWZ4s0+RF94Cb+oL7xy8uGqT25tPsY/bVudy3ipHEfzXbbvyTtD7xWd
OWlKSRdw4/wczKYTB2b/zYZJrFPLgThydFOK0TWYXtBVFZdpto7S3EXmSr0C
K2vi1RzBxG4ug4EhD3HcOkEYjBWuI3HhnKtGzhtPgjwJ/I4z4cDALM5GTAb7
3QY6Ju0UgcQfK29H7iL0HL9OKFdCkeT1DCbFxJtEP5EnEpAsTpLKTTNp2Ae0
E66DoamxdVoJBxrR9ucIUDWJug7IOK5k0TYUQuD5c74j6SU6eDXT4kwbX2qH
/7Jt574tlLC135agwbZ+g/ah7TGEL9v2QlyCtnbrs31ttd5n3C8Fp6WQ+8z0
ZeC4SYkZZby/dN/iayFK31v1i6FY79v7v2x5e9+acP/tmfcff/4XndX/QzoP
2SSriKxxUi8wN/PMWoA3HWUU50PRFVCPBOxuxRtp+D4tmjwBnZaBVYlL2EtP
16yrixr0et4sMXsMQP3dsN0F33Mhg0eTQxMesfp6vzcr1en0dRR0oqiyVbGs
eat4qX2jhltIL16PlOJsgqQ0ydKkntVBssBmfFVUVQr7X0m40Sa1KGpK6GFq
b24CJSvPjmNAoZUWBnBMYkkO2bSxy2byqnk23c/tRLTtlfw5JUvyqsbMIs4z
wIq8ir/q0iUki6ZeNUCXizvyiRwLP3Tz+2AVPEcDMUPmKnuTO5hma3B3HsVm
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

-->

</rfc>
