<?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 3.0.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-lamps-x509-policy-graph-00" category="std" consensus="true" submissionType="IETF" updates="5280" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="Updates to X.509 Policy Validation">Updates to X.509 Policy Validation</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-lamps-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="July" day="05"/>
    <area>sec</area>
    <workgroup>LAMPS</workgroup>
    <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"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <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"/>
            <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"/>
            <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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
CyoWOjxm74YbRf8LuUzIV9d5AAA=

-->

</rfc>
