<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-nro-sidrops-ta-constraints-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" consensus="true">

<front>
<title abbrev="RPKI Trust Anchor Constraints">RPKI Trust Anchor Constraints</title><seriesInfo value="draft-nro-sidrops-ta-constraints-00" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="T." surname="Harrison" fullname="Tom Harrison"><organization>APNIC</organization><address><postal><street></street>
</postal><email>tomh@apnic.net</email>
</address></author><author initials="T." surname="Bruijnzeels" fullname="Tim Bruijnzeels"><organization>RIPE NCC</organization><address><postal><street></street>
</postal><email>tbruijnzeels@ripe.net</email>
</address></author><author initials="C." surname="Martinez-Cagnazzo" fullname="Carlos Martinez-Cagnazzo"><organization>LACNIC</organization><address><postal><street></street>
</postal><email>carlos@lacnic.net</email>
</address></author><author initials="M." surname="Kosters" fullname="Mark Kosters"><organization>ARIN</organization><address><postal><street></street>
</postal><email>markk@arin.net</email>
</address></author><author initials="Y." surname="Chadee" fullname="Yogesh Chadee"><organization>AFRINIC</organization><address><postal><street></street>
</postal><email>yogesh@afrinic.net</email>
</address></author><date/>
<area>Internet</area>
<workgroup></workgroup>

<abstract>
<t>Resource Public Key Infrastructure (RPKI) Relying Parties (RPs) are
commonly configured with five Trust Anchors (TAs), one for each of the
Regional Internet Registries (RIRs). Each TA operator is able to make
arbitrary RPKI statements about resources independently of the other
TA operators: for example, one TA could issue a Route Origin
Authorization (ROA) for resources that have actually been assigned to
another TA.</t>
<t>This document specifies a protocol that allows a set of TAs to make
signed statements that assert their consensus as to the resources for
which each TA is authoritative.</t>
</abstract>

</front>

<middle>

<section anchor="requirements-notation"><name>Requirements notation</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and
&quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP
14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they appear in all
capitals, as shown here.</t>
</section>

<section anchor="introduction"><name>Introduction</name>

<section anchor="problem-statement"><name>Problem Statement</name>
<t>In the context of the Resource Public Key Infrastructure (RPKI)
<xref target="RFC6480"></xref>, validation is performed by Relying Party (RP) software.
RPs are configured with one or more Trust Anchor Locators (TALs)
<xref target="RFC8630"></xref>, each of which contains the public key and URI(s) for an
RPKI Trust Anchor (TA) certificate. An RP uses its configured TALs to
retrieve and validate the RPKI content published by the associated
TAs. In a conventional production configuration, an RP is configured
with five TALs, one for each of the Regional Internet Registries
(RIRs).</t>
<t>TALs operate as a layer of indirection, permitting a TA to reissue its
certificate and publish it at the URL(s) specified in the TAL without
requiring RPs to update their configuration. However, since TALs do
not themselves restrict the Internet Number Resources (INRs) that may
be claimed by a given TA, it is possible for a TA to reissue its
certificate with an arbitrary set of INRs, and have RPs trust the TA
with respect to those resources without any intervention on the part
of the RP's operator. This aspect of how TALs function leads to the
possibility of a TA claiming resources for which it is not considered
authoritative.</t>
</section>

<section anchor="goal-of-this-specification"><name>Goal of this Specification</name>
<t>The main goal of this specification is to prevent TAs from claiming
resources for which they are not authoritative. This is achieved by
having a set of TAs issue various signed objects that attest to their
shared understanding of the resources for which each TA is
authoritative.</t>
</section>

<section anchor="glossary"><name>Glossary</name>
<t>This section describes the terminology and abbreviations used in this
document.</t>

<ul spacing="compact">
<li>Internet Number Resources (INRs)</li>
</ul>
<t>IPv4 addresses, IPv6 addresses, and Autonomous System Numbers (ASNs).</t>

<ul spacing="compact">
<li>Resource Public Key Infrastructure (RPKI)</li>
</ul>
<t>The RPKI is the core infrastructure that is used to associate public
keys with specific INRs, allowing the holders of the corresponding
private keys to make attestations about those INRs, such as Route
Origin Authorizations (ROAs) <xref target="RFC9582"></xref>.</t>

<ul spacing="compact">
<li>Trust Anchor (TA)</li>
</ul>
<t>An apex of trust in the RPKI hierarchy. Trust Anchors (TAs) issue a
self-signed RPKI CA Certificate <xref target="RFC6487"></xref> which enumerates the INRs
for which the TA considers itself authoritative.</t>

<ul spacing="compact">
<li>TA Constraints</li>
</ul>
<t>For a set of TAs participating in a consensus, the details on the INRs
for which each TA is considered authoritative by that consensus.</t>

<ul spacing="compact">
<li>Participating TAs / Participants</li>
</ul>
<t>TAs that participate together, by way of the mechanisms described in
this document, in agreeing on constraints that apply to each
participant.</t>

<ul spacing="compact">
<li>Constraint Validator</li>
</ul>
<t>An entity that observes and validates constraint messages signed and
published by participants, in order to determine the INRs for which
the set of participants considers each TA authoritative.</t>
</section>

<section anchor="requirements"><name>Requirements</name>
<t>This section describes the requirements, divided into topical
subsections, that were taken into account in the design of this
specification.</t>

<section anchor="signing-outside-of-rpki-repository"><name>Signing Outside of RPKI Repository</name>
<t>Each current RIR TA issues a TA certificate that enumerates the
complete set of INRs (i.e. 0/0 for IPv4, ::/0 for IPv6, and
1-4294967295 for ASNs). This is because the alternative approach of
enumerating the resources for which the TA considers itself
authoritative would require that the TA be available for online
signing, in order to handle inter-RIR transfers in a timely manner,
and offline signing for the TA is preferred by the RIRs for various
reasons. The constraint validation process must operate in such a way
that TAs can continue to enumerate the complete set of INRs,
notwithstanding that constraint validation will apply additional
restrictions with respect to the set of INRs for which a given TA may
make statements.</t>
<t>Participating TAs must be able to use an offline signing process for
the RPKI TA certificate, and delegate the responsibility of signing
constraint-related statements to another key that can be used online.</t>
<t>The impact on the RPKI in terms of signed objects should be minimised,
in order to avoid overhead or issues with RPKI RP software that is
unable or unwilling to use TA constraint objects.</t>
</section>

<section anchor="initiating-participants-and-resource-distribution"><name>Initiating Participants and Resource Distribution</name>
<t>The TA constraints must be agreed among a set of participating TAs.</t>
<t>The initial set of participants must be agreed on by all participants.</t>
<t>TAs must agree on initial INR constraints that apply to each
participant. These INRs cannot overlap.</t>
</section>

<section anchor="robustness"><name>Robustness</name>
<t>It must not be possible for action taken by a single participant in a
consensus to cause an RP to skip constraint validation for the
consensus.</t>
</section>

<section anchor="transfers-between-participants"><name>Transfers between Participants</name>
<t>The TA that holds an INR in their constraints can transfer it to
another TA. For the transfer to take effect, the receiving TA needs to
accept the transfer, and the originating TA needs to confirm the
transfer. Prior to confirmation, the originating TA must have the
option to cancel the transfer.</t>
<t>An INR that is transferred from one TA to another is considered no
longer held by the former, and cannot be transferred again by that TA.</t>
<t>An INR that was transferred to a participating TA can be transferred
again by that TA to any other participant, including the TA from which
the INRs were originally received (local policies permitting).</t>
<t>If an INR transfer was completed in error, then the transfer cannot be
reversed. However, the recipient can initiate another transfer to
return the INR(s) in question.</t>
</section>

<section anchor="movement-of-inrs-into-or-out-of-the-consensus"><name>Movement of INRs into or out of the Consensus</name>
<t>Any participant can declare itself authoritative for resources that
are not currently part of the consensus (i.e. for which another TA is
not already considered authoritative).</t>
<t>Any participant can declare that it is no longer authoritative for any
INRs for which the consensus currently considers it authoritative.</t>
<t>As with transfers, such declarations cannot be reversed directly, but
the same effect can be achieved by making a compensating declaration.</t>
</section>

<section anchor="adding-and-removing-participants"><name>Adding and Removing Participants</name>
<t>New TAs can be included in the set, if all participants agree.</t>
<t>If a TA is no longer trusted by other participants, the remaining
participants can remove them from the set, essentially forming a new
set that no longer includes that participant.</t>
</section>
</section>
</section>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>
<t>Indentation and whitespace in examples are provided only to illustrate
element relationships, and are not a REQUIRED feature of this
protocol.</t>
<t>&quot;...&quot; in examples is used as shorthand for elements defined outside of
this document.</t>
</section>

<section anchor="resource-distribution-objects"><name>Resource Distribution Objects</name>
<t>Resource Distribution Objects comprise Resource Distribution State
(RDS) and Resource Distribution Event (RDE) objects. The use of these
objects in the wider context of signing and validating constraints is
described in the &quot;Protocol Walkthrough&quot; section later in this
document.</t>
<t>RDOs have the following formal definition:</t>

<artwork>DEFINITIONS EXPLICIT TAGS ::=
BEGIN

IMPORTS
 CONTENT-TYPE
 FROM CryptographicMessageSyntax-2010 -- in [RFC6268]
  { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
   pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) }

 IPAddressOrRange, ASIdOrRange
 FROM IPAddrAndASCertExtn -- in [RFC3779]
  { iso(1) identified-organization(3) dod(6) internet(1)
   security(5) mechanisms(5) pkix(7) mod(0)
   id-mod-ip-addr-and-as-ident(30) } ;

ct-resourceDistributionState CONTENT-TYPE ::=
 { TYPE ResourceDistributionState
  IDENTIFIED BY id-ct-resourceDistributionState }

id-ct-resourceDistributionState OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X1 }

ct-transferInitiation CONTENT-TYPE ::=
 { TYPE TransferInitiation
  IDENTIFIED BY id-ct-transferInitiation }

id-ct-transferInitiation OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X2 }

ct-transferAcceptance CONTENT-TYPE ::=
 { TYPE TransferAcceptance
  IDENTIFIED BY id-ct-transferAcceptance }

id-ct-transferAcceptance OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X3 }

ct-transferFinalisation CONTENT-TYPE ::=
 { TYPE TransferFinalisation
  IDENTIFIED BY id-ct-transferFinalisation }

id-ct-transferFinalisation OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X4 }

ct-transferCancellation CONTENT-TYPE ::=
 { TYPE TransferCancellation
  IDENTIFIED BY id-ct-transferCancellation }

id-ct-transferCancellation OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X5 }

ct-resourceInclusion CONTENT-TYPE ::=
 { TYPE ResourceInclusion
  IDENTIFIED BY id-ct-resourceInclusion }

id-ct-resourceInclusion OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X6 }

ct-resourceExclusion CONTENT-TYPE ::=
 { TYPE ResourceExclusion
  IDENTIFIED BY id-ct-resourceExclusion }

id-ct-resourceExclusion OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X7 }

URI    ::= IA5String
TaName   ::= IA5String
TransferId ::= IA5String
ResourceInclusionId ::= IA5String
ResourceExclusionId ::= IA5String

IPAddressFamily   ::= SEQUENCE { -- AFI &amp;amp; opt SAFI --
 addressFamily    OCTET STRING , -- (SIZE (2..3)), --
 addresses      SEQUENCE OF IPAddressOrRange }

IPAddrBlocks    ::= SEQUENCE OF IPAddressFamily

Delegation ::= SEQUENCE {
 taName        TaName,
 ips          IPAddrBlocks,
 asns         SEQUENCE OF ASIdOrRange }

ResourceDistributionState ::= SEQUENCE {
 version        INTEGER,
 date         GeneralizedTime,
 previousRDS      URI OPTIONAL,
 urlPrefix       URI,
 rdoIndex       INTEGER OPTIONAL,
 delegations      SEQUENCE OF Delegation }

TransferInitiation ::= SEQUENCE {
 id          TransferId,
 date         GeneralizedTime,
 recipientTaName    TaName,
 ips          IPAddrBlocks,
 asns         SEQUENCE OF ASIdOrRange }

TransferAcceptance ::= SEQUENCE {
 transferInitiationId TransferId,
 date         GeneralizedTime,
 sourceTaName     TaName,
 ips          IPAddrBlocks,
 asns         SEQUENCE OF ASIdOrRange }

TransferFinalisation ::= SEQUENCE {
 transferInitiationId TransferId,
 date         GeneralizedTime }

TransferCancellation ::= SEQUENCE {
 transferInitiationId TransferId,
 date         GeneralizedTime }

ResourceInclusion ::= SEQUENCE {
 id           ResourceInclusionId,
 date         GeneralizedTime,
 ips          IPAddrBlocks,
 asns         SEQUENCE OF ASIdOrRange }

ResourceExclusion ::= SEQUENCE {
 id           ResourceExclusionId,
 date         GeneralizedTime,
 ips          IPAddrBlocks,
 asns         SEQUENCE OF ASIdOrRange }

END
</artwork>
<t>These objects are not modelled as RPKI CMS objects, because in many
cases they are not about resources for which the signing TA is
actually authoritative. The RDS object itself is an example of this.</t>
</section>

<section anchor="resource-distribution-consensus-rdc-objects"><name>Resource Distribution Consensus (RDC) Objects</name>
<t>The use of Resource Distribution Consensus (RDC) objects in the wider
context of signing and validating constraints is described in the
&quot;Protocol Walkthrough&quot; section later in this document.</t>
<t>RDC objects have the following formal definition:</t>

<artwork>DEFINITIONS EXPLICIT TAGS ::=
BEGIN

IMPORTS
 CONTENT-TYPE
 FROM CryptographicMessageSyntax-2010 -- in [RFC6268]
  { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
   pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) }

 IPAddressOrRange, ASIdOrRange
 FROM IPAddrAndASCertExtn -- in [RFC3779]
  { iso(1) identified-organization(3) dod(6) internet(1)
   security(5) mechanisms(5) pkix(7) mod(0)
   id-mod-ip-addr-and-as-ident(30) }

  SubjectPublicKeyInfo
    FROM PKIX1Explicit-2009 -- in [RFC5912]
    { iso(1) identified-organization(3) dod(6) internet(1)
     security(5) mechanisms(5) pkix(7) id-mod(0)
     id-mod-pkix1-explicit-02(51) } ;

ct-ResourceDistributionConsensus CONTENT-TYPE ::=
 { TYPE ResourceDistributionConsensus
  IDENTIFIED BY id-ct-resourceDistributionConsensus }

id-ct-resourceDistributionConsensus OBJECT IDENTIFIER ::=
 { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
  pkcs-9(9) id-smime(16) id-ct(1) X5 }

URI   ::= IA5String
TaName  ::= IA5String
Filename ::= IA5String

ResourceDistributionConsensus ::= SEQUENCE {
 taDetails SEQUENCE (SIZE(1..MAX)) OF taDetail,
 otherTaDetails SEQUENCE (SIZE(1..MAX)) OF taDetail,
 bpkiTaKey SubjectPublicKeyInfo,
 uriRdrBase URI,
 bpkiTaFilename Filename,
 rdsFilename Filename }

taDetail ::= SEQUENCE {
 taName  TaName,
 taKey   SEQUENCE (SIZE(1..MAX)) OF SubjectPublicKeyInfo }

END
</artwork>
<t>This signed object is signed by an EE certificate issued by the TA
directly.</t>
<t>A non-normative guideline for naming this object is that the filename
be a value derived from the public key part of the entity's key pair,
using the algorithm described for CRLs in Section 2.2 of [RFC6481].</t>
<t>The filename extension of &quot;.rdc&quot; MUST be used to denote the object as
an RDC object.</t>
</section>

<section anchor="protocol-walkthrough"><name>Protocol Walkthrough</name>
<t>In this section we will give a walkthrough of how participating TAs
can use RDC, RDS and RDE objects to convey their consensus about INR
constraints, and how these messages can be validated by constraint
validators.</t>
<t>This section will follow the same subsection structure as was used by
the &quot;Requirements&quot; section.</t>

<section anchor="signing-outside-of-rpki-repository-1"><name>Signing Outside of RPKI Repository</name>
<t>Participating TAs each need to set up their Resource Distribution
Repository (RDR), used to distribute RDOs. This involves reserving a
base HTTPS URL for the RDR, and ensuring that they have the
infrastructure in place that allows them to publish RDOs objects here
such that they will be publicly available.</t>
<t>Furthermore, each participant MUST issue, or reuse, a BPKI TA
certificate.  These certificates are similar to the BPKI TA
certificates used in <xref target="RFC8183"></xref> <xref target="RFC8181"></xref> and <xref target="RFC6492"></xref>.</t>
<t>The BPKI TA certificate MUST be published under the RDR base URI. The
filename must not collide with any other filenames used for RDS or RDE
objects, and this filename MUST be used as the &quot;bpkiTaFilename&quot; in the
TA's RDC object so that constraint validators can find it.</t>
<t>The BPKI TA private key MUST be used to sign EE certificates for use
in the CMS for RDS and RDE objects issued by this participant. These
EE certificates MUST use single-use key pairs, and MUST have a
validity period that ensures that the object remains valid for so long
as the participant intends that the associated objects be used in
constraint validation. The specific validity period to use is a policy
matter for the TAs participating in the consensus group.</t>
</section>

<section anchor="initiating-participants-and-resource-distribution-1"><name>Initiating Participants and Resource Distribution</name>

<section anchor="participant-set"><name>Participant Set</name>
<t>Consensus about constraints is asserted among a group of participating
TAs. Before signing any statements about the distribution of INRs, the
participants MUST first all agree which TAs form this group.</t>
<t>A participating TA is formally described in the &quot;taDetail&quot; element of
an RDC object. This element consists of a &quot;taName&quot; and a &quot;taKey&quot;
element, where the latter is a sequence of one or more
&quot;SubjectPublicKeyInfo&quot; elements for each TA key used by a participant.
(While a TA will generally have only one TA key at a given point in
time, it is possible for a TA to have multiple keys operating
concurrently, in order to facilitate key rollover. See <xref target="RFC9691"></xref> for
details on an in-band key rollover process.)</t>
<t>The full participant group is described in the &quot;taDetails&quot; element of
the RDC objects, as a sequence of &quot;taDetail&quot; elements. These elements
MUST be ordered by lexical order of their &quot;taName&quot;.</t>
</section>

<section anchor="initial-resource-distribution-state-objects"><name>Initial Resource Distribution State Objects</name>
<t>The participants then need to come to agreement on the set of
resources for which each participant is authoritative on an agreed
date. The way in which this distribution is initially determined is a
local policy matter for the participants, and out of scope for the
purposes of this document.</t>
<t>Once this is done, each participant generates an RDS object as
follows:</t>

<ul>
<li><t>The &quot;version&quot; element MUST be 1.</t>
</li>
<li><t>The &quot;date&quot; element MUST contain the agreed initial date, per the
first paragraph of this section.</t>
</li>
<li><t>The &quot;previousRDS&quot; element MUST NOT be present.</t>
</li>
<li><t>The &quot;urlPrefix&quot; element MUST reflect the base name that the
participant will use when publishing RDE objects in its RDR.</t>
</li>
<li><t>The &quot;rdoIndex&quot; element MUST NOT be present.</t>
</li>
<li><t>The &quot;delegations&quot; element MUST be present, containing the mapping of
INRs to each participant. Delegations MUST be disjoint among
participants.</t>
</li>
</ul>
<t>Each participant MUST publish their RDS object under their RDR using a
filename of their choosing. This name MUST be used as the
&quot;rdsFilename&quot; in the initial RDC object that the participate signs
(see next subsection).</t>
<t>A non-normative guideline is that this file be called &quot;current.rds&quot;,
so as to allow new RDS objects to be published under the same name
without requiring adjustments to the RDC object. When a new RDS object
is published, the previous RDS object can be republished under a new
name, and referred to by way of the &quot;previousRDS&quot; element in the new
RDS object.</t>
</section>

<section anchor="initial-resource-distribution-consensus-objects"><name>Initial Resource Distribution Consensus Objects</name>
<t>Once a TA has published the initial RDS object, it may publish the RDC
signed object using the details from the previous sections.</t>
<t>The TAs do not need to coordinate as to the timing of the publication
of RDS or RDC objects, but the additional validation provided by way
of this specification does not take effect unless each configured TA
(or each except for one) that is listed as participating in the
consensus is publishing those objects.</t>
<t>A participant MUST NOT publish more than one RDC object at a given
time.</t>
</section>

<section anchor="validation-of-participant-group"><name>Validation of Participant Group</name>
<t>Constraint validation may be performed by general purpose RP software
that is also used for validation of the RPKI tree, or by specialised
software that seeks to validate the constraints applicable to each
RPKI TA.</t>
<t>Constraint Validators can be configured with TALs for the participants
its operator wants to consider. Constraint Validators MUST validate
the TA certificate for each TAL, as well as its manifest and CRL, in
order to download and validate each TA's RDC object.</t>
<t>A consensus group exists where one or more TAs are publishing RDC
objects with matching taDetails and otherTaDetails fields, in that
each has entries for a given name and a common TA key, and the set of
common TA keys from the taDetails field is equal to or a superset of
the set of configured TA keys.  The RDC objects in the set for which
the most configured TAs are available are referred to as the relevant
RDC objects.</t>
<t>If more than one such consensus group is available, the Constraint
Validator MUST select the one for which it has the most configured
TAs, and MUST treat the rest as if they do not exist. This consensus
group is referred to as the selected consensus group. If no single
consensus group has the most configured TAs (i.e. if there is a tie
for most configured TAs among the available groups), the Constraint
Validator MUST proceed as though no consensus group exists. If no
consensus group exists, constraint validation cannot proceed.</t>
<t>If the Constraint Validator is configured with a TA key that was not
found in the selected consensus group, then the only constraint on
that TA is that it MUST NOT be allowed to use any INRs claimed by the
selected consensus group.</t>
<t>If the Constraint Validator does not have a TAL for one or more
participants in the selected consensus group, then it is RECOMMENDED
that the missing TALs are added so that constraint validation can be
performed optimally.</t>
<t>If a Constraint Validator is configured with TALs for only a subset of
the TAs listed in the taDetails fields of the RDCs of each TA from the
selected consensus group, it MAY continue to perform constraint
validation, albeit using modified procedures as described in the
applicable sections below.</t>
<t>The selected consensus group may refer to a TA in the common taDetails
fields for which the Constraint Validator has a configured TAL, but
which is not publishing a valid RDC object. If this is the case, then
the Constraint Validator SHOULD continue to perform constraint
validation on the basis of the selected consensus group, albeit using
modified procedures as described in the applicable sections below.
This behaviour is required in order to prevent constraint validation
being inhibited by the actions of a single participant TA.</t>
<t>On each validation run, Constraint Validators MUST check for new RDC
objects for each configured TA. In other words, Constraint Validators
MUST NOT rely on the absence of an RDC in a given validation run for
the purpose of not checking for that RDC on a subsequent validation
run.</t>
</section>

<section anchor="validation-of-the-resource-distribution"><name>Validation of the Resource Distribution</name>
<t>Once the selected consensus group is determined, the Constraint
Validator MUST first check whether each configured TA in that group
has issued an RDS object that matches one issued by each other TA. The
Constraint Validator first retrieves the current object for each TA by
concatenating urlPrefix and rdsFilename, verifying it against the BPKI
TA certificate retrieved by way of the RDC object, and comparing the
version numbers, dates and delegation details for each file. If there
is no match, the RP works backwards through the previousRDS links for
each TA in order to find a matching set of RDS objects for each TA.
Note that the previousRDS links may yield 404 Not Found, if the TA has
since removed the previous RDS objects. It is also possible for a
previousRDS link to cause a loop, in which case the RP should simply
stop attempting to retrieve previousRDS files for that TA.</t>
<t>If it is not possible to find a set of matching RDS objects, one for
each TA in the selected consensus group, then the Constraint Validator
MUST repeat the above process to find a set for all TAs minus one
participant. If the Constraint Validator is able to find such a set,
the Constraint Validator SHOULD proceed with a selected consensus
group that contains only those TAs present in the smaller set, albeit
using modified procedures as described in the applicable sections
below. If the Constraint Validator is not able to find such a set,
then constraint validation cannot proceed.</t>
<t>Furthermore, the Constraint Validator MUST NOT apply the initial
resource distribution until it has processed all further changes
(RDEs) that were published by each TA in the selected consensus group
since their selected RDS object was published.</t>
</section>
</section>

<section anchor="transfers-between-participants-1"><name>Transfers between Participants</name>
<t>Resources can be transferred from one participant, the current holder, to
another. For this, the protocol uses RDE objects. These objects are
always signed and published by one participant, and are published only
in that participant's repository.</t>
<t>The filename of an RDE object is determined by concatenating:</t>

<ul spacing="compact">
<li>the &quot;urlPrefix&quot; from the relevant RDS object;</li>
<li>the RDE index number (an integer); and</li>
<li>the suffix &quot;.cms&quot;.</li>
</ul>
<t>This allows other participants and Constraint Validators to actively
poll each participant's RDR for the appearance of new RDEs.</t>

<section anchor="transfer-initiation"><name>Transfer Initiation</name>
<t>Transfers of INRs are initiated by the participant that currently
holds them.</t>
<t>To do so, the participant MUST create a &quot;TransferInitiation&quot; RDE as
follows:</t>

<ul spacing="compact">
<li>They generate a locally unique value to use as the &quot;TransferId&quot;.
These are namespaced by way of the initiating TA, so they are not
globally unique. The identifier used in the transfer initiation
object then carries through to the remaining objects that relate to
that transfer.</li>
<li>They include a date which SHOULD reflect the moment of initiation.</li>
<li>They include the recipient's TA name, per the RDC object.</li>
<li>They include one or more INRs to be transferred.</li>
<li>They publish the RDE using the next available index number.</li>
</ul>
<t>The issuing participant MUST NOT publish RDEs that would be invalid.</t>
<t>Other participants, as well as Constraints Validators, observe that
this new RDE is published. They MUST validate the RDE is correctly
signed by the issuer. The content of the Transfer Initiation RDE is
further validated as follows:</t>

<ul>
<li><t>The issuer MUST be the current holder of the INRs in question.
Participants are considered the current holder of INRs if they have
them by way of the matching RDS state for the selected consensus
group, or if they received them through a completed transfer or
inclusion (see below) since then and they have not subsequently
transferred them to another TA since that point. Participants are
also considered the current holder of INRs where the resources are
part of an accepted transfer, but the initiator of the relevant
transfer is not part of the selected consensus group (i.e. the
transfer is implicitly finalised on an attempt by the recipient to
initiate a transfer for the resources).</t>
</li>
<li><t>There MUST NOT be any other unfinished transfer for overlapping
INRs. A transfer is unfinished if it was initiated, but no Transfer
Finalisation or Transfer Cancellation RDE has been published for it.</t>
</li>
</ul>
<t>If this validation fails, the transfer initiation RDE MUST be rejected
(i.e. treated as though it did not exist). The issuing participant
SHOULD NOT publish a Transfer Initiation that would be rejected.</t>
<t>If the Transfer Initiation is validated successfully, this does not
yet lead to a change in the constraints of participants. That change
takes effect once the transfer has been accepted by the recipient as
described below. However, if the Constraint Validator's selected
consensus group does not include the TA that is nominated as the
recipient of the transfer, then it MUST treat the Transfer
Initiation as implicitly accepted by the recipient.</t>
</section>

<section anchor="transfer-acceptance"><name>Transfer Acceptance</name>
<t>Participants SHOULD monitor the RDR of all other participants for the
publication of transfer-related RDEs in which they are nominated as
the recipient.</t>
<t>When a participant discovers a valid Transfer Initiation RDE where they
are the recipient, they are will need to make a choice whether to
accept the transfer or not.  If the recipient accepts the transfer,
they MUST create a Transfer Accepted RDE as follows:</t>

<ul spacing="compact">
<li>They include the TransferId used by the initiator.</li>
<li>They include a date which SHOULD reflect the moment of acceptance.</li>
<li>They include the TA name of the initiator, per the RDC object.</li>
<li>They include the INRs from the Transfer Initiation RDE.</li>
<li>They publish the RDE using the next available index number.</li>
</ul>
<t>Other participants, as well as Constraints Validators, observe that
this new RDE is published. They MUST validate the RDE is correctly
signed by the issuer.</t>
<t>If the Constraint Validator's selected consensus group does not
include the TA that is nominated as the initiator of the transfer,
then it MUST treat the Transfer Acceptance as implicitly initiated by
the initiator. Otherwise, it must verify the transfer as follows:</t>

<ul>
<li><t>There MUST be a matching valid Transfer Initiation object that has
the same TransferId, published under the RDR of the initiator. If no
such matching object is found, this may be caused by timing issues.
The Constraint Validator MUST reject the Transfer Acceptance object
(i.e. treat it as if it did not exist) on this validation run if
this happens.</t>
</li>
<li><t>The recipient name in the Transfer Initiation object MUST match that
of the participant that signed the Transfer Acceptance object.</t>
</li>
<li><t>The INRs in the Transfer Acceptance object MUST be identical to the
INRs in the Transfer Initiation object.</t>
</li>
</ul>
<t>If the initiator finds through monitoring of their intended
recipient's RDR that the recipient published a matching Transfer
Acceptance object that is invalid, the initiator MUST issue a Transfer
Cancellation RDE.</t>
<t>If a Constraint Validator successfully validates the Transfer
Acceptance object, it MUST treat the recipient as also having the
transferred resources from that point. Permitting both TAs to speak
for the resources for a period of time allows for the recipient TA to
create signed objects that correspond to those published by the source
TA, avoiding the need for there to be a gap in time during which such
objects are unavailable.</t>
<t>The recipient is not allowed to initiate a transfer of these INRs
until the transfer is fully completed, per the next phase of this
process.</t>
<t>If the recipient is not willing to accept the transfer, then they
simply do not publish an RDE accepting it. They SHOULD communicate
this to the initiator out-of-band. In this case, the initiator MUST
issue a Transfer Cancellation RDE.</t>
</section>

<section anchor="transfer-finalisation-and-cancellation"><name>Transfer Finalisation and Cancellation</name>
<t>A transfer can be finished in two mutually exclusive ways:
finalisation, and cancellation.</t>
<t>Cancellation of the transfer can happen regardless of whether the
recipient accepted the transfer. If the recipient accepted the
transfer, then they are simply no longer considered as having the
relevant resources per constraint validation. The recipient SHOULD
monitor for this and remove relevant issued RPKI certificates and
objects in the event of cancellation.</t>
<t>The initiator MUST only publish a Transfer Finalisation RDE where they
have observed a valid Transfer Acceptance RDE from the recipient. The
initiator is not required to publish the finalisation RDE immediately.
For example, as a matter of local policy, the two TAs may agree to
delay finalisation for a period of time in order to support the
creation of matching RPKI signed objects under the recipient's TA.</t>
<t>When other participants and Constraint Validators observe and validate
the Transfer Finalisation RDE, they conclude that the resource is now
uniquely held by the recipient. Under constraint validation, the
issuer is no longer considered to hold the resources. This also means
that they cannot transfer these INRs again.</t>
<t>Once a transfer is finalised, it cannot be undone as such. However, a
new transfer for the INRs can be initiated by the new holder (i.e. the
recipient of the finalised transfer). This can help in scenarios where
the recipient and issuer agree that the transfer was cancelled or
finalised in error.</t>
</section>
</section>

<section anchor="movements-of-inrs-into-or-out-of-the-consensus"><name>Movements of INRs into or out of the Consensus</name>
<t>Any participant can sign a Resource Inclusion RDE for any resources
that are not currently contained in the latest RDS, and that have not
not already been the subject of a Resource Inclusion RDE issued by
another partcipant.</t>
<t>In addition to this, any participant can sign a Resource Exclusion RDE
in order to disclaim its holdership of specific INRs.</t>
<t>Contrary to transfers between participants, these RDEs are signed by
one participant only, and take immediate effect. When these RDEs are
observed and validated by other participants and Constraint
Validators, they MUST shrink or extend the constraints of the issuer
with the cited INRs.</t>
</section>

<section anchor="updated-resource-distribution-set"><name>Updated Resource Distribution Set</name>
<t>Periodically, the TAs will need to publish new RDS objects, in order
to limit the work required for Constraint Validators that are not
caching the results from previous RDS and RDE retrieval operations.</t>
<t>Each participant agrees to a common date and time to be used in the
new RDS object.</t>
<t>The new RDS object MUST use the same URL prefix as the previous RDS
object, to ensure that RDEs issued after publication of this RDS
object can also be found by Constraint Validators that are still
relying on the previous RDS object.</t>
<t>The version number in the new RDS object is the next integer after the
one from the previously-issued object. Each subsequent RDS object also
contains the URL of the previous object, so that while only some TAs
have published the new file, the verification process can be applied
to the previous RDS objects and intervening RDEs, which will still be
published by each TA. As with RDC and RDS objects generally, if a
single configured TA is publishing an incorrect or invalid RDS object,
validation can still proceed on the basis of the remaining available
data.</t>
<t>The new RDS object's resource disposition MUST be equal to that of the
previous RDS object with the RDEs from one after the first RDS's
rdoIndex up to the last RDE with a date prior to the agreed date of
the new RDS object, plus the corresponding RDEs for the other TAs. In
principle, this can be used for auditing, but more importantly this
allows all participants to arrive at an agreed state for the
distribution of the new delegations for each participant
independently.</t>
<t>The rdoIndex of the new RDS object MUST be set to the integer value of
the last RDE published by the signing participant with a date and time
prior to the agreed date and time for the new RDS object.</t>
<t>Then, each participant publishes their new RDS object under the
&quot;rdsFilename&quot; used in their RDC object. The previous RDS file MUST be
republished under a different name and MUST be referred to by the
&quot;previousRDS&quot; in the new RDS object.</t>
<t>Since clients do not fetch previous RDEs, a participant that has
initiated an unfinalised transfer as at the time of RDS generation
will need to publish an additional transfer initiation object once the
new RDS has been published.  Similarly, new acceptance RDEs may need
to be republished as well. The content of these objects MUST be
identical to that of their previously published counterparts.</t>
<t>Constraint Validators that continue from a previous state MAY choose
not to use the new RDS file set. However, they MUST be aware that
because of the possible republication of prior RDEs, they may see RDEs
that are duplicates of RDEs they have already processed. If this
occurs, the Constraint Validator should treat the duplicate RDEs as if
they do not exist.</t>
<t>Finally, participants may periodically remove old RDS and RDE objects
in order to limit the size of the repository. If they do, it is
recommended that a public archive of these objects is made available
for auditing and research purposes, but note that the constraint
validation process does not depend on this.</t>
</section>

<section anchor="removing-participants"><name>Removing Participants</name>

<section anchor="remove-participant-from-consensus-group"><name>Remove Participant from Consensus Group</name>
<t>In this scenario a participant is removed from the consensus entirely
by the other participants and their resources are no longer part of
the resource distribution. Essentially this means that the remaining
participants no longer cooperate on constraint consensus with the
removed participant, but they do not wish to constrain the removed
participant's resource claims beyond that it MUST NOT be allowed to
use any INRs claimed by the trusted consensus group.</t>
<t>In order to do this, the remaining participants MUST each publish a
new RDC object where the participant is removed from the &quot;taDetails&quot;
field, and they MUST each publish an updated RDS objects where all
references to the participant are removed.</t>
</section>

<section anchor="remove-and-constrain-a-participant"><name>Remove and Constrain a Participant</name>
<t>In this scenario a participant is removed from the consensus by the other
participants, but the remaining participants still wish to constrain
resource use by the removed participant.</t>
<t>In order to do this, the remaining participants MUST each publish a
new RDC object where the participant is moved from &quot;taDetails&quot; to
&quot;otherTaDetails&quot;.</t>
<t>When Constraint Validators encounter a TA in &quot;otherTaDetails&quot; for
which they have a TAL, they need to use the following modifications to
the constraint validation process described in this document:</t>

<ul spacing="compact">
<li>They MUST constrain the INRs for it in accordance with the
constraints signed by the selected consensus group.</li>
<li>They MUST disregard any RDEs published by a TA listed in
&quot;otherTaDetails&quot;.</li>
<li>The implicit initiation/acceptance/finalisation behaviour applies
with respect to such TAs in the same way as for TAs that are part of
the consensus from the Constraint Validator's selected consensus
group, but which are not themselves part of that selected consensus
group.</li>
</ul>
<t>The remaining participants MAY publish new RDS objects in which the
INRs associated with a TA in &quot;otherTaDetails&quot; are removed. In this
case, the consensus group is expressing their shared belief that the
removed TA is not to be trusted for any INRs.</t>
<t>In order to undo the above, the remaining participants MUST each
publish a new RDC object where the removed participant is moved back
from &quot;otherTaDetails&quot; to &quot;taDetails&quot;. Any INRs that were no longer
associated with that participant can then be transferred back, or
included by the participant.</t>
</section>
</section>

<section anchor="adding-participants"><name>Adding Participants</name>
<t>To add a new participant into the consensus, they first need to set up
their signing infrastructure as described in section 6.1. Furthermore,
they SHOULD publish inclusion RDEs for any of their resources that are
not in the current RDS for the consensus.</t>
<t>Next, all current participants in the consensus set as well as the new
participant MUST publish an updated RDC object that includes the
extended set of TAs in the &quot;taDetails&quot; in accordance with the
description in section 6.2.1.</t>
<t>If the new participant published inclusion RDEs prior to joining the
consensus set, then all participants (including the new participant)
SHOULD publish renewed RDS objects as described in section 6.5.</t>
<t>From this point forward the new participant can participate in
transfers as described in section 6.3.</t>
<t>It is RECOMMENDED that Constraint Validators that do not have a TAL
configured for the newly-added participant to issue a notification to
operators prompting them to evaluate whether to add the TAL for the
new participant.</t>
<t>Note that Constraint Validators that do not have a TAL for the new
participant will treat it as a TA that is not part of the selected
consensus group, as described in the relevant sections of this
document.</t>
<t>When a Constraint Validator adds a TAL for a current participant, they
MUST retrieve the most recent common RDS as described in section 6.5,
and then process all subsequent RDEs for all participants in their set
of TALs, to rebuild the current resource constraint set as among the
participants.</t>
</section>
</section>

<section anchor="operational-considerations"><name>Operational Considerations</name>

<section anchor="publishing-new-rds-objects"><name>Publishing New RDS Objects</name>
<t>A new RDS object published by a TA must effectively be equivalent to
the final consensus resource set for the consensus as at the time
immediately before its publication.  Due to risks associated with race
conditions, TAs must coordinate on publication of new RDS objects.
For example, the TAs may agree not to publish any RDEs during some
window of time, so that the TAs can each generate and publish a new
RDS object on the basis of the existing state as at that point.</t>
</section>

<section anchor="removing-participants-1"><name>Removing Participants</name>
<t>This document describes a number of methods for removing a
participant, and the outcome in terms of verifiable intent of the
remaining participants. It intentionally does not prescribe which of
these is most appropriate, as this is highly dependent on the
circumstances and the trust relationship between the remaining and
removed participants.</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="adverse-action-by-a-ta"><name>Adverse Action by a TA</name>
<t>An important requirement of this specification is that a single
participant cannot cause constraint validation to fail for the
remaining participants.</t>
<t>A participant could cause the formation of the initial consensus group
and resource distribution to fail. They could also try to achieve this
by removing earlier signed RDC and/or RDS and RDE objects.</t>
<t>A participant can also fail to cooperate in transfers, but in doing so
they can only affect transfers that involve them. They cannot
successfully transfer resources to themselves without the consent of
the participant that is the current holder.</t>
<t>A participant can prevent new updated RDS objects from being accepted.
In this case, they can force constraint validators to use an earlier
RDS and replay more RDEs than would otherwise be needed.</t>
<t>In each of these cases, the remaining participants can coordinate to
remove the participant taking an adverse action from the consensus
group, if required.</t>
</section>

<section anchor="constraint-validation-failures"><name>Constraint Validation Failures</name>
<t>An RP may want to fall back to standard validation for one or more of
its configured TAs in the event of problems with the consensus
validation process.  Along similar lines, a consensus group may attest
to a resource set for an arbitrary TA that causes objects issued by
that TA to be treated as if they do not exist, due to overclaim, and
an RP may also want to use standard validation for that TA if that
occurs.  RP developers should offer configuration options accordingly.</t>
</section>

<section anchor="resource-inclusion"><name>Resource Inclusion</name>
<t>Resource inclusion for resources currently outside the consensus is
available to all participating TAs on their own initiative.  This is
obviously a weaker requirement than that imposed by RDS file
processing, where each TA has to agree to the current disposition of
resources in its entirety.  However, there are a number of
considerations that weigh in favour of this approach:</t>

<ul spacing="compact">
<li>unused resources tend to be much less of a security concern when
compared with used resources;</li>
<li>requiring approval from each other TA leads to substantial
additional complexity; and</li>
<li>subsequent RDS file publication acts to re-establish the consensus
for all resources.</li>
</ul>
<t>As with adverse action more generally, TAs may act to exclude a TA
from a consensus by revoking their existing consensus objects and
issuing new ones that exclude that TA.</t>
</section>

<section anchor="multiple-consensus-groups"><name>Multiple Consensus Groups</name>
<t>Only one consensus group can have effect on any given validation run,
but each configured TA is treated as equal when it comes to
determining the consensus group that has effect.  For example, an RP
is configured with five production TAs that publish consensus state
(e.g. the RIRs), along with six other TAs that do not.  If the six
other TAs begin to coordinate on the publication of consensus
objects, then the RP will start using that consensus information in
preference to that published by the production TAs.  RP software
should alert users to this possibility, as well as offering
configuration options around consensus preference, in order to limit
the chance of this sort of unexpected behaviour.</t>
</section>

<section anchor="other-routing-data-published-by-revoked-ta"><name>Other Routing Data Published by Revoked TA</name>
<t>A consensus group may effectively revoke any other TA.  Since a given
TA may also operate an IRR server, and it is common for RPs to use
both RPKI and IRR data when making routing decisions, RPs should
consider whether TA revocation by way of consensus information
publication should carry through to their use of associated IRR data.</t>
</section>

<section anchor="tak-objects"><name>TAK Objects</name>
<t>For TA revocation to be effective, it will likely be necessary for the
TAs still participating in the consensus to monitor for successor keys
for the revoked TA, adding those keys to the list of keys for the
revoked TA as they are published.</t>
</section>
</section>

<section anchor="general-considerations"><name>General Considerations</name>
<t>This document is intended to align with the emerging consensus in the
<eref target="https://www.nro.net/policy/internet-coordination-policy-2/">RIR Governance Requirements</eref>
document that arises from the ICP-2 update process. While the TA
constraints functionality is intended to be usable by any group of
RPKI TAs, the final specification will be such that the RIRs will be
able to implement the TA constraints functionality as well as
fulfilling all of the requirements from the governance requirements
document.</t>
</section>

<section anchor="alternative-solutions"><name>Alternative Solutions</name>

<section anchor="single-trust-anchor"><name>Single Trust Anchor</name>
<t>One alternative solution to the problem identified in the introduction
is to set up a single new TA that issues resource certificates to each
of the current TAs.  In the RIR context, for example, IANA might
operate that role.  However, assuming that such an operator can be
found in the first place, such a change will generally involve a large
amount of work in equipping the new TA operator to carry out their new
administrative role.  In the IANA context, for example, IANA would
have to keep track of inter-RIR transfers, where the volume of
transactions is much greater than those related to delegations from
IANA to the RIRs.</t>
</section>

<section anchor="single-ta-plus-peer-cas"><name>Single TA plus peer CAs</name>
<t>A slightly different approach is to have a single TA operator be
responsible only for the original delegations to the current TAs, with
the current TAs themselves operating as CAs for each other current TA
for transfers.  The problem with that approach is that either the
original recipient of the resources from the single TA has to be
involved in every subsequent transfer of those resources, which is an
additional administrative burden, or each transferror has to issue a
certificate to each transferree, which means that the certificate path
can become arbitrarily long, or that additional administrative work is
required around certificate maintenance.  (See generally
<eref target="https://blog.apnic.net/2020/04/21/rpki-and-trust-anchors/.)">https://blog.apnic.net/2020/04/21/rpki-and-trust-anchors/.)</eref></t>
</section>

<section anchor="single-synthetic-ta-based-on-delegated-statistics"><name>Single Synthetic TA Based On Delegated Statistics</name>
<t>Another approach is set out at <eref target="https://labs.apnic.net/nro-ta/">An experimental single TA for the RIR
with restrictions aligned to
delegated-nro-latest</eref>.  This involves
deploying a new TA which itself signs the existing operational CA
certificates issued by each RIR, but only for the resources that are
actually issued to the relevant RIR, so as to limit overclaiming by
each RIR.  To determine the resource disposition as at a given time,
the <eref target="https://ftp.ripe.net/pub/stats/ripencc/nro-stats/latest/nro-delegated-stats">NRO delegated
statistics</eref>
file is used, which means that this TA does not have to be run by an
RIR or a similarly-situated party, but could be run by anybody,
including by operators directly.  The fundamental problem with this
approach is that it depends on the correctness of the
previously-mentioned NRO delegated statistics file, which is unsigned,
and for which no verifiable assurances are provided as to its
correctness.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>TBD</t>
</section>

<section anchor="acknowledgments"><name>Acknowledgments</name>
<t>TBD</t>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6480.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6487.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6492.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8183.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8630.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9582.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9691.xml"/>
</references>
<references><name>Informative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8181.xml"/>
</references>

</back>

</rfc>
