<?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-01" 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-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="July" day="06"/>
    <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_graph</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_graph</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_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.</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:
H4sIAAAAAAAAA+09a3PbyJHf8Svm5LqylSVpS/Zustps6uRHElX8WsvOZuv2
zgaJIYU1CDAYQDJXZn779WOewICiLOWu6ir6YJPATE93T7+mp2c4Ho+TJm8K
eSTerbK0kUo0lfjb5OsH34rXVZHP1uKvaZHDm7wqk3Q6reX5Tk2zalamSwCb
1em8GeeymY+LdLlS40/QYbyiDuNFna7Oxg8OkhnAW1T1+kioJktUO13mSgGc
t+sVwDh59vaPSdLyqEfi68PfPUiSfFUfiaZuVXP44MG3Dw6TtJYp9Jez5KNc
X1R1Bh3LRtalbMZPEYsEHn5c1FW7OhLPj1+8Pk0S1aRl9j4tqhKGWUuVrPIj
8Z9NNRsJVdVNLecKPq2X+OG/kiRtm7OqPkrEOBHwl5eAzd7TiXgsy1/SZV7u
0WMmfO9pep5nnVdVvUjL/FfiETT5U1UtCimeP3/Cr+UyzQvgGfacyvI/FvR+
MquWQG85r+ol9DyXgAAz/oh66Qn8A30RQLRuWJWikbOzsiqqxVqMxauVLMXp
WjVyqWxbYNCsKks5o/Zj8fZMiqd5Dd9pOl63U5ipMXBUAKd0r7Rp6nzaNlLM
ZN3k8xynT8xroBtZzMAtr4Qm3EwHYZYW4q0sJFC2bEvsD8+UeFei7GB7nOoj
8QqwmMpaHD44+JYeK1nnUiErDOCTt+/Gb4/EGwIlSxY/5k6SJOPxWKRT1dTp
rEmSt2e5EiCZLTRshJYn8eaPT0ikUJxruSrSmRQNcCEtQCLz5mwpgJ9a0Flu
k3Mr6OICWgBrhPx7m8NjADwSy6qWQs6BLzkOZAFNiLvweZEjA+zzZNrmBbQD
4a/bWdNC74uzfHYm1AwgZkJ+WoGAlk2eFsUapI7QA06rRsxSJUeikCAx5SLJ
l6tCInGan+dtUco6nYKMAXGZLAHCuJqPgY3nOZAJE5nOPqoJM2qZZ1khk+QO
TlRdZS3JRJJcXv4b8AhZtNkAkHleAtcA2TaHWa/mgF4jS0UDIqfUSs7y+Rrw
CcSDWAeTN0pQ3RaacWIJEgoqoZjLy3S1wo6msZjK5kKC2IJJ+AVkEoVQgGlo
QSj0XGQVKA0MDWyZ1ZVSY29QhRyHObeDjICxAE3CTLXwPhPpbAaWAocEBgFb
EzfrANBRPhKnWkW+mRwAG1bEH+ID4wGmSMJMZFLNQDdwMiwNqQJ+42DTtZAp
TKuH4Ygo0mQ7cgGTpcYd4cI0lwlYrou4KGRyBbyEmcAvDjhiu0qbMw0IYKCg
ZEhpmgwJA8IkWR9PQbSAQatVYfQT5OTOHXHaLpdpvcbxngBXF0DhvK6WVo9Q
z7raA+wCZqkhmSAmaD5aXuQq0eqYsbAA4VovUF8y1VU7sEhi2cLrjv5ZrZqw
BSjlhYdeVsH4ZQWqRMQQD0m/82YNXdOmVUhqWq5D1ibI2hH0rDVSccJqDY3Y
kDfIQvGkKs9xDlFjkPKnqFM5fWfmoblFD6bE3ot3p2/3Rvy/ePmKPr959sO7
kzfPnuLn0z8fP39uP5gWp39+9e45vE/0J9fzyasXL569fMqd4anoPHpx/NMe
C+Xeq9dvT169PH6+x3IG82FtJ5IFYjSV8Aps+qqWpEzKyD98gT6Pn7wWB4+0
Fh0eHHwLisNffnfw20ebTYLKyINVJYgzf4UJWKPYybRGICDoILqrvEkL8MUw
hDqrLkpxJnE+gZm+YSZl0Tz8QGx/zy/e44sPI229MtZtT6MnhzjHzsyNQPpA
tUn3qnkSm1o25mWV4Sw3JB8L8M2l1katmqy9VV1LBYqLuhe3C2kgPrpzMCwp
8jENeBfiFJgBmAdNNpqJM2m/cW9tJn0gLKgXwETUMpmx0YOJ5Z48FakeAxQC
tAyG4dk+86Q6bzpA9JDaSvv8gjn6I0i+/JSib4Jgql2tKiU7BIPuof2uwHNh
UJUkvxHHJcvWUmZ52gk1mA7mnzJkV+wh8gxVa57LWol7r06eqn2IFOD/gxH+
e8g0wqevJ+KksUM6s4NNkST4/6FtbJ48mmjUINIY4zjN+mrEEAk9dgD0m4kO
SS6qtsgg9lAtRAG+4LCok7CCNYY4DJ9uNtDvH//4Bwwzy/NxWjc6FIr8fTV2
f1/ZZm+qqjnym31G8dVB/OfrQuv9fb600DY3hybuu48/Dze7738Zbnfe+dpt
6CM1/ir2LDnxpPIIeSdYvvD/z9zDPDukL18wRqfH50sWHJTAjTcGPj7c3M4Y
HubdZzdueh579kUoP7N657H+oYfOjVkPmpVcHok7TuF4gfX9Hqj9MzZj4bL3
LbTZ27DXgVUIvG+68Q8FLBRlor67MD/veExYm63AbGX7o+Se3GdLcW++j84p
9FcPu/5K9zyDTvdy/OeXsFeCvR51eyF83TPFTlMz5iIy5tfoCl1vjgafuYBU
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
x9p5AAA=

-->

</rfc>
