<?xml version="1.0"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced.
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC1918 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1918.xml">
<!ENTITY RFC1930 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1930.xml">
<!ENTITY RFC4193 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4193.xml">
<!ENTITY RFC6482 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6482.xml">
<!ENTITY RFC6491 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6491.xml">
<!ENTITY RFC6598 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6598.xml">
<!ENTITY RFC6810 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6810.xml">
<!ENTITY RFC6811 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6811.xml">
<!ENTITY RFC6996 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6996.xml">
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC4648 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC6487 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6487.xml">
<!ENTITY RFC8174 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8205 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8205.xml">
<!ENTITY RFC8208 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8208.xml">
<!ENTITY RFC8209 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8209.xml">
<!ENTITY RFC8210 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8210.xml">
<!ENTITY RFC8211 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8211.xml">
<!ENTITY RFC8259 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC4632 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4632.xml">
<!ENTITY RFC5952 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5952.xml">





]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<?rfc tocappendix="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="3"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<?rfc comments="no" ?>
<?rfc inline="yes" ?>
<rfc category="std" docName="draft-ietf-sidr-slurm-08" ipr="trust200902">

  <front>

    <title abbrev="RPKI Local Resource Management">Simplified Local internet nUmber Resource Management with the RPKI (SLURM)</title>

    <author fullname="Di Ma" initials="D." surname="Ma">
      <organization>ZDNS</organization>
      <address>
        <postal>
          <street>4 South 4th St. Zhongguancun</street>
          <city>Haidian</city>
          <code>100190</code>
          <region>Beijing</region>
          <country>China</country>
        </postal>
        <email>madi@zdns.cn</email>
      </address>
    </author>

    <author fullname="David Mandelberg" initials="D." surname="Mandelberg">
        <organization>Unaffiliated</organization>
        <address>
            <postal>
                <street></street>
                <city></city>
                <region></region>
                <code></code>
                <country></country>
            </postal>
            <email>david@mandelberg.org</email>
            <uri>https://david.mandelberg.org</uri>
        </address>
    </author>

    <author fullname="Tim Bruijnzeels" initials="T." surname="Bruijnzeels">
      <organization>RIPE NCC</organization>
      <address>
        <postal>
          <street>Stationsplein 11</street>
          <city>Amsterdam</city>
          <code>1012 AB</code>
          <country>Netherlands</country>
        </postal>
        <email>tim@ripe.net</email>
      </address>
    </author>

    <date/>

    <!-- Meta-data Declarations -->

    <area>Routing Area</area>
    <workgroup>SIDR</workgroup>

    <!-- <keyword>dns</keyword> -->

    <abstract>

      <t>The Resource Public Key Infrastructure (RPKI) is a global authorization
      infrastructure that allows the holder of Internet Number Resources (INRs) to make
      verifiable statements about those resources. Network operators, e.g., Internet
      Service Providers (ISPs), can use the RPKI to validate BGP route origin assertions.
      ISPs can also use the RPKI to validate the path of a BGP route. However, ISPs may
      want to establish a local view of exceptions to the RPKI data in the form of local
      filters and additions. The mechanisms described in this document provide a simple
      way to enable INR holders to establish a local, customized view of the RPKI,
      overriding global RPKI repository data as needed.</t>

    </abstract>

  </front>

<middle>

<section title="Introduction">
   <t>The Resource Public Key Infrastructure (RPKI) is a global authorization
   infrastructure that allows the holder of Internet Number Resources (INRs) to make
   verifiable statements about those resources.  For example, the holder of a block of
   IP(v4 or v6) addresses can issue a Route Origin Authorization (ROA)
   <xref target="RFC6482" /> to authorize an Autonomous System (AS) to originate routes
   for that block. Internet Service Providers (ISPs) can then use the RPKI to validate
   BGP routes. (Validation of the origin of a route is described in 
   <xref target="RFC6811" />, and validation of the path of a route is described in 
   <xref target="RFC8205" />.)</t>

   <t>However, an "RPKI relying party" (RP) may want to override some of the information
   expressed via configured Trust Anchors (TAs) and the certificates downloaded from the
   RPKI repository system. For instances, <xref target="RFC6491" /> recommends the
   creation of ROAs that would invalidate public routes for reserved and unallocated
   address space, yet some ISPs might like to use BGP and the RPKI with private address
   space (<xref target="RFC1918" />, <xref target="RFC4193" />, <xref target="RFC6598" />)
   or private AS numbers (<xref target="RFC1930" />, <xref target="RFC6996" />). Local use
   of private address space and/or AS numbers is consistent with the RFCs cited above, but
   such use cannot be verified by the global RPKI. This motivates creation of mechanisms
   that enable a network operator to publish exception to the RPKI in the form of filters
   and additions (for its own use and that of its customers) at its discretion.
   Additionally, a network operator might wish to make use of a local override capability
   to protect routes from adverse actions <xref target="RFC8211" />, until the results of
   such actions have been addressed. The mechanisms developed to provide this capability
   to network operators are hereby called Simplified Local internet nUmber Resource
   Management with the RPKI (SLURM).</t>

   <t>SLURM allows an operator to create a local view of the global RPKI by generating
   sets of assertions.  For Origin Validation <xref target="RFC6811" />, an assertion is a
   tuple of {IP prefix, prefix length, maximum length, AS number (ASN)} as used by
   rpki-rtr (the RPKI to Router Protocol) version 0 <xref target="RFC6810" /> and rpki-rtr
   version 1 <xref target="RFC8210" />.  For BGPsec <xref target="RFC8205" />, an
   assertion is a tuple of {ASN, subject key identifier, router public key} as used by
   rpki-rtr version 1. (For the remainder of this document, these assertions are called
   ROA Prefix Assertions and BGPsec Assertions, respectively.)</t>

    <section title="Terminology">
        <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>

<section title="RP with SLURM">
    <t>SLURM provides a simple way to enable an RP to establish a local, customized view
    of the RPKI, by overriding RPKI repository data if needed. To that end, an RP with
    SLURM filters out (removes from consideration for routing decisions) any assertions in
    the RPKI that are overridden by local ROA Prefix Assertions and BGPsec Assertions.</t>

    <t>In general, the primary output of an RP is the data it sends to routers over the
    rpki-rtr protocol <xref target="RFC8210" />.  The rpki-rtr protocol enables routers to
    query an RP for all assertions it knows about (Reset Query) or for an update of only
    the changes in assertions (Serial Query).  The mechanisms specified in this document
    are to be applied to the result set for a Reset Query, and to both the old and new 
    sets that are compared for a Serial Query.  RP software may modify other forms of
    output in comparable ways, but that is outside the scope of this document.</t>
    
    <figure anchor="figure_ex" title="SLURM‘s Position in the RP Stack"><artwork><![CDATA[
+--------------+   +---------------------------+   +------------+
|              |   |                           |   |            |
| Repositories +--->Local cache of RPKI objects+---> Validation |
|              |   |                           |   |            |
+--------------+   +---------------------------+   +-----+------+
                                                         |
       +-------------------------------------------------+
       |
+------v-------+   +------------+   +----------+   +-------------+
|              |   |            |   |          |   |             |
|    SLURM     +--->   SLURM    +---> rpki-rtr +---> BGP Speakers|
|   Filters    |   | Assertions |   |          |   |             |
+--------------+   +------------+   +----------+   +-------------+
    ]]></artwork></figure>

</section>

<section title="SLURM File and Mechanisms">

    <section title="Use of JSON">
    	<t>SLURM filters and assertions are specified in JSON <xref target="RFC8259" />
    	format. JSON members that are not defined here MUST NOT be used in SLURM Files. An
    	RP MUST consider any deviations from the specification errors. Future additions to
    	the specifications in this document MUST use an incremented value for the
    	"slurmVersion" member.</t>
    </section>

    <section title="SLURM File Overview">

        <t>A SLURM file consists of a single JSON object containing the following members:
        <list style="symbols">
    		<t>A "slurmVersion" member that MUST be set to 1, encoded as a number</t>
            <t>A "validationOutputFilters" member (<xref target="validationOutputFilters"/>), whose value is an
                object. The object MUST contain exactly two members:<list style="symbols">
    			<t>A "prefixFilters" member, whose value is described in
    			<xref target="prefixFilters"/>.</t>
    			<t>A "bgpsecFilters" member, whose value is described in
    			<xref target="bgpsecFilters"/>.</t>
    		</list></t>
            <t>A "locallyAddedAssertions" member (<xref target="locallyAddedAssertions"/>), whose value is an
                object. The object MUST contain exactly two members:<list style="symbols">
    			<t>A "prefixAssertions" member, whose value is described in <xref target="prefixAssertions" />.</t>
    			<t>A "bgpsecAssertions" member, whose value is described in <xref target="bgpsecAssertions" />.</t>
    		</list></t>
        </list></t>

        <t>In the envisioned typical use case, an RP uses both Validation Output Filters
        and Locally Added Assertions.  In this case, the resulting assertions MUST be the
        same as if output filtering were performed before locally adding assertions.  i.e.
        locally added assertions MUST NOT be removed by output filtering.</t>

        <t>The following JSON structure with JSON members represents a SLURM file that has
        no filters or assertions:</t>

    	<figure title="Empty SLURM File">
        <artwork>
          <![CDATA[
{
  "slurmVersion": 1,
  "validationOutputFilters": {
    "prefixFilters": [],
    "bgpsecFilters": []
  },
  "locallyAddedAssertions": {
    "prefixAssertions": [],
    "bgpsecAssertions": []
  }
}
          ]]>
        </artwork>
      </figure>
    </section>


    <section anchor="validationOutputFilters" title="Validation Output Filters">
    	<section anchor="prefixFilters" title="Validated ROA Prefix Filters">
            <t>The RP can configure zero or more Validated ROA Prefix Filters (Prefix
            Filters in short).  Each Prefix Filter can contain either an IPv4 or IPv6
            prefix and/or an ASN.  It is RECOMMENDED that an explanatory comment is
            included with each Prefix Filter, so that it can be shown to users of the RP
            software.</t>

            <t>The above is expressed as a value of the "prefixFilters" member, as an
                array of zero or more objects. Each object MUST contain one of
                either, or one each of both following members:<list style="symbols">
                <t>A "prefix" member, whose value is string representing either an IPv4
                prefix (Section 3.1 of <xref target="RFC4632" />) or an IPv6
                prefix (<xref target="RFC5952" />).</t>
                <t>An "asn" member, whose value is a number.</t>
            </list>
            </t>
    
            <t>In addition, each object MAY contain one optional "comment" member, whose
            value is a string.</t>
            
            <t>The following example JSON structure represents a "prefixFilters" member
            with an array of example objects for each use case listed above:</t>


            <figure title="prefixFilters examples">
                <artwork>
                    <![CDATA[
        "prefixFilters": [
          {
            "prefix": "192.0.2.0/24",
            "comment": "All VRPs encompassed by prefix"
          },
          {
            "asn": 64496,
            "comment": "All VRPs matching ASN"
          },
          {
            "prefix": "198.51.100.0/24",
            "asn": 64497,
            "comment": "All VRPs encompassed by prefix, matching ASN"
          }
        ]
                    ]]>
                </artwork>
            </figure>

	    <t>Any Validated ROA Prefix (VRP, <xref target="RFC6811" />) that matches any
	    configured Prefix Filter MUST be removed from the RP's output.</t>
        
	    <t>A VRP is considered to match with a Prefix Filter if one of the following cases
	    applies:<list style="numbers">	      
          <t>If the Prefix Filter contains an IPv4 or IPv6 Prefix only, the VRP is
          considered to match the filter if the VRP prefix is equal to or covered by the
          Prefix Filter prefix.</t>
	      <t>If Prefix Filter contains an ASN only, the VRP is considered to match the
	      filter if the VRP ASN matches the Prefix Filter ASN.</t>
	      <t>If Prefix Filter contains both an IPv4 or IPv6 prefix and an ASN, the VRP is
	      considered to match if the VRP prefix is equal to or covered by the Prefix
	      Filter prefix and the VRP ASN matches the Prefix Filter ASN.</t>
	    </list></t>
        
    	</section>



    	<section anchor="bgpsecFilters" title="BGPsec Assertion Filters">
      
       <t> The RP can configure zero or more BGPsec Assertion Filters (BGPsec Filters in
       short).  Each BGPsec Filter can contain an ASN and/or the Base64
       <xref target="RFC4648" /> encoding of a Router Subject Key Identifier (SKI), as
       described in <xref target="RFC8209" /> and <xref target="RFC6487" />. It is
       RECOMMENDED that an explanatory comment is also included with each BGPSec Filter,
       so that it can be shown to users of the RP software.</t>


		<t>The above is expressed as a value of the "bgpsecFilters" member, as an array of
            zero or more objects. Each object MUST contain one of either, or one each of both following members:<list style="symbols">
			<t>An "asn" member, whose value is a number</t>
			<t>An "SKI" member, whose value is the Base64 encoding without trailing
			‘=‘ (Section 5 of <xref target="RFC4648" />) of the certificate’s Subject
			Public Key as described in Section 4.8.2. of <xref target="RFC6487"/> (This is
			the value of the ASN.1 OCTET STRING without the ASN.1 tag or length fields.)</t>
		</list></t>

		<t>In addition, each object MAY contain one optional "comment" member, whose value
		is a string.</t>

		<t>The following example JSON structure represents a "bgpsecFilters" member with
		an array of example objects for each use case listed above:</t>

<figure title="bgpsecFilters examples">
    <artwork>
        <![CDATA[
        "bgpsecFilters": [
          {
            "asn": 64496,
            "comment": "All keys for ASN"
          },
          {
            "SKI": "<Base 64 of some SKI>",
            "comment": "Key matching Router SKI"
          },
          {
            "asn": 64497,
            "SKI": "<Base 64 of some SKI>",
            "comment": "Key for ASN 64497 matching Router SKI"
          }
        ]
        ]]>
    </artwork>
</figure>

    <t>Any BGPsec Assertion that matches any configured BGPsec Filter MUST be removed from
    the RP's output. A BGPsec Assertion is considered to match with a BGPsec Filter if one
    of the following cases applies:<list style="numbers">
        <t>If the BGPsec Filter contains an ASN only, a BGPsec Assertion is considered to
        match if the Assertion ASN matches the Filter ASN.</t>
        <t>If the BGPsec Filter contains an SKI only, a BGPsec Assertion is considered to
        match if the Assertion Router SKI matches the Filter SKI.</t>
        <t>If the BGPsec Filter contains both an ASN and a Router SKI, then a BGPsec
        Assertion is considered to match if both the Assertion ASN matches the Filter ASN
        and the Assertion Router SKI matches the Filter Router SKI.</t>
    	</list>
    </t>

	</section>
        
        
    </section>

    <section anchor="locallyAddedAssertions" title="Locally Added Assertions">

      <section anchor="prefixAssertions" title="ROA Prefix Assertions">
          
          <t>Each RP is locally configured with a (possibly empty) array of ROA Prefix
          Assertions (Prefix Assertion in short). Each ROA Prefix Assertion MUST contain
          an IPv4 or IPv6 prefix and an ASN. It MAY include a value for the maximum
          length. It is RECOMMENDED that an explanatory comment is also included with
          each, so that it can be shown to users ofthe RP software.</t>
          
          <t>The above is expressed as a value of the "prefixAssertions" member, as an
          array of zero or more objects. Each object MUST contain one each of both following
          members:<list style="symbols">
          	<t>A "prefix" member, whose value is string representing either an IPv4 prefix
          	(Section 3.1 of <xref target="RFC4632" />) or an IPv6 prefix
          	(<xref target="RFC5952" />).</t>
          	<t>An "asn" member, whose value is a number.</t>
          </list></t>
          
          <t>In addition, each object MAY contain one of each of the following members:<list style="symbols">
          	<t>A "maxPrefixLength" member, whose value is a number.</t>
          	<t>A "comment" member, whose value is a string.</t>
          </list></t>
          
          <t>The following example JSON structure represents a "prefixAssertions" member
          with an array of example objects for each use case listed above:</t>

<figure title="prefixAssertions examples">
        <artwork>
          <![CDATA[
  "prefixAssertions": [
    {
      "asn": 64496,
      "prefix": "198.51.100.0/24",
      "comment": "My other important route"
    },
    {
      "asn": 64496,
      "prefix": "2001:DB8::/32",
      "maxPrefixLength": 48,
      "comment": "My other important de-aggregated routes"
    }
  ]
          ]]>
        </artwork>
      </figure>

			<t> Note that the combination of the prefix, ASN and optional maximum length
			describes a VRP as described in <xref target="RFC6811" />. The RP MUST add all
			Prefix Assertions found this way to the VRP found through RPKI validation, and
			ensure that it sends the complete set of PDUs, excluding duplicates when using
			the rpki-rtr protocol, see Section 5.6 and 5.7 of <xref target="RFC8210" />.</t>

      </section>

      <section anchor="bgpsecAssertions" title="BGPsec Assertions">
      
      <t>Each RP is locally configured with a (possibly empty) array of BGPsec Assertions.
      Each BGPsec Assertion MUST contain an AS number, a Router SKI, and the Router Public
      Key. It is RECOMMENDED that an explanatory comment is also included, so that it can
      be shown to users of the RP software.</t>
      
      <t>The above is expressed as a value of the "bgpsecAssertions" member, as an array
      of zero or more objects. Each object MUST contain one each of all of the following members:<list>
      	<t>An "asn" member, whose value is a number.</t>
      	<t>An "SKI" member, whose value is the Base64 encoding without trailing ‘=‘
      	(Section 5 of RFC4648 ) of the router’s public key equivalent to a certificate’s
      	Subject Public Key as described in Section 4.8.2. of <xref target="RFC6487"/>.
      	This is the value of the ASN.1 OCTET STRING without the ASN.1 tag or length
      	fields.</t>
      	<t>A "routerPublicKey" member, whose value is is the Base64 encoding without
      	trailing ‘=‘ (Section 5 of <xref target="RFC4648" />) of the equivalent to a
      	router certificate’s public key's subjectPublicKeyInfo value, as described in
      	<xref target="RFC8208"/>. This is the full ASN.1 DER encoding of the
      	subjectPublicKeyInfo, including the ASN.1 tag and length values of the
      	subjectPublicKeyInfo SEQUENCE.</t>
      </list></t>
      
      <t>The following JSON structure represents an array of "bgpsecAssertions" with one
      element as described above:</t>
      
<figure title="bgpsecAssertions examples">
<artwork>
          <![CDATA[
  "bgpsecAssertions": [
    {
      "asn": 64496,
      "SKI": "<some base64 SKI>",
      "publicKey": "<some base64 public key>",
      "comment": "My known key for my important ASN"
    }
  ]
          ]]>
</artwork>
</figure>  

	<t>Note that a bgpsecAssertion matches the syntax of the Router Key PDU described in
	section 5.10 of <xref target="RFC8210" />. Relying Parties MUST add any
	bgpsecAssertion thus found to the set of Router PDUs, excluding duplicates, when using
	the RPKI-RTR protocol <xref target="RFC8210" />.</t>
	
      </section>

    </section>

    <section title="Example of a SLURM File with Filters and Assertions">

    <t>The following JSON structure represents an example of a SLURM
    file that uses all the elements described in the previous sections:</t>

    <figure title="Example of Full SLURM File">
      <artwork>
        <![CDATA[
  {
    "slurmVersion": 1,
    "validationOutputFilters": {
      "prefixFilters": [
        {
          "prefix": "192.0.2.0/24",
          "comment": "All VRPs encompassed by prefix"
        },
        {
          "asn": 64496,
          "comment": "All VRPs matching ASN"
        },
        {
          "prefix": "198.51.100.0/24",
          "asn": 64497,
          "comment": "All VRPs encompassed by prefix, matching ASN"
        }
      ],
      "bgpsecFilters": [
        {
          "asn": 64496,
          "comment": "All keys for ASN"
        },
        {
          "SKI": "Zm9v",
          "comment": "Key matching Router SKI"
        },
        {
          "asn": 64497,
          "SKI": "YmFy",
          "comment": "Key for ASN 64497 matching Router SKI"
        }
      ]
    },
    "locallyAddedAssertions": {
      "prefixAssertions": [
        {
          "asn": 64496,
          "prefix": "198.51.100.0/24",
          "comment": "My other important route"
        },
        {
          "asn": 64496,
          "prefix": "2001:DB8::/32",
          "maxPrefixLength": 48,
          "comment": "My other important de-aggregated routes"
        }
      ],
      "bgpsecAssertions": [
        {
          "asn": 64496,
          "comment" : "My known key for my important ASN",
          "SKI": "<some base64 SKI>",
          "publicKey": "<some base64 public key>"
        }
      ]
    }
  }
        ]]>
      </artwork>
    </figure>

   </section>
</section>

<section title="SLURM File Configuration">
    <section title="SLURM File Atomicity">

    <t>To ensure local consistency, the effect of SLURM MUST be atomic. That
      is, the output of the RP MUST be either the same as if SLURM
      file were not used, or it MUST reflect the entire SLURM configuration.
      For an example of why this is required, consider the case of two local
      routes for the same prefix but different origin ASNs.  Both routes
      are configured with Locally Added Assertions. If neither addition
      occurs, then both routes could be in the unknown state
      <xref target="RFC6811" />.  If both additions occur then both routes
      would be in the valid state.  However, if one addition occurs and the
      other does not, then one could be invalid while the other is valid.</t>

    </section>

    <section title="Multiple SLURM Files">

    <t> An implementation MAY support the concurrent use of multiple SLURM
      files.  In this case, the resulting inputs to Validation Output Filters
      and Locally Added Assertions are the respective unions of the inputs
      from each file.  The envisioned typical use case for multiple files is
      when the files have distinct scopes. For instance, operators of two
      distinct networks may resort to one RP system to frame routing decisions.
      As such, they probably deliver SLURM files to this RP respectively.
      Before an RP configures SLURM files from different sources it MUST make
      sure there is no internal conflict among the INR assertions in these
      SLURM files. To do so, the RP SHOULD check the entries of SLURM file with
      regard to overlaps of the INR assertions and report errors to the sources
      that created these SLURM files in question. The RP gets multiple SLURM files as a set, and the whole set MUST be rejected in case of any overlaps among SLURM files.</t>



    <t>If a problem is detected with the INR assertions in these SLURM files,
      the RP MUST NOT use them, and SHOULD issue a warning as error report in
      the following cases:</t>
    <t>
   <list><t><list style="numbers">
       <t>There may be conflicting changes to ROA Prefix Assertions if
         there exists an IP address X and distinct SLURM files Y, Z such that X
         is contained by any prefix in any &lt;prefixAssertions&gt; or
         &lt;prefixFilters&gt; in file Y and X is contained by any prefix in
         any &lt;prefixAssertions&gt; or &lt;prefixFilters&gt; in file Z.
       </t>
       <t>There may be conflicting changes to BGPsec Assertions if there exists
         an ASN X and distinct SLURM files Y, Z such that X is used in any
         &lt;bgpsecAssertions&gt; or &lt;bgpsecFilters&gt; in file Y and X is used in
         any &lt;bgpsecAssertions&gt; or &lt;bgpsecFilters&gt; in file Z.
       </t>
    </list></t></list>
   </t>
    </section>

</section>

<section title="IANA Considerations">
        <t>None</t>
</section>

<section title="Security Considerations">

    <t> The mechanisms described in this document provide a network operator
      with additional ways to control use of RPKI data while preserving
      autonomy in address space and ASN management.  These mechanisms are
      applied only locally; they do not influence how other network operators
      interpret RPKI data. Nonetheless, care should be taken in how these
      mechanisms are employed. Note that it also is possible to use SLURM to
      (locally) manipulate assertions about non-private INRs, e.g., allocated
      address space that is globally routed. For example, a SLURM file may be
      used to override RPKI data that a network operator believes has been
      corrupted by an adverse action.  Network operators who elect to use SLURM
      in this fashion should use extreme caution. </t>

    <t> The goal of the mechanisms described in this document is to enable an
      RP to create its own view of the RPKI, which is intrinsically a security
      function. An RP using a SLURM file is trusting the assertions made in
      that file. Errors in the SLURM file used by an RP can undermine the
      security offered by the RPKI, to that RP. It could declare as invalid
      ROAs that would otherwise be valid, and vice versa. As a result, an RP
      MUST carefully consider the security implications of the SLURM file being
      used, especially if the file is provided by a third party.</t>

    <t>Additionally, each RP using SLURM MUST ensure the authenticity and
      integrity of any SLURM file that it uses.  Initially, the SLURM file may
      be pre-configured out of band, but if the RP updates its SLURM file over
      the network, it MUST verify the authenticity and integrity of the updated
      SLURM file. Yet the mechanism to update SLURM file to guarantee authenticity and integrity is out of the scope of this document.</t>
</section>


<section title="Acknowledgments">
    <t>The authors would like to thank Stephen Kent for his guidance and
      detailed reviews of this document.  Thanks go to to Richard Hansen for his careful reviews,
      to Hui Zou and Chunlin An for their editorial assistance.</t>
</section>

</middle>

<back>

<references title="Informative References">
    &RFC1918;
    &RFC1930;
    &RFC4193;
    &RFC6482;
    &RFC6491;
    &RFC6598;
    &RFC6810;
    &RFC6996;
    &RFC8210;
    &RFC8211;
</references>

<references title="Normative References">
    &RFC2119;
    &RFC4632;
    &RFC5952;
    &RFC4648;
    &RFC6487;
    &RFC6811;
    &RFC8174;
    &RFC8205;
    &RFC8208;
    &RFC8209;
    &RFC8259;
    

</references>


  </back>
</rfc>
