<?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-wullink-rpp-requirements-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" tocDepth="4">

<front>
<title abbrev="RPP - Requirements">RESTful Provisioning Protocol (RPP) - Requirements</title><seriesInfo value="draft-wullink-rpp-requirements-00" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="M." surname="Wullink" fullname="Maarten Wullink"><organization>SIDN Labs</organization><address><postal><street></street>
</postal><email>maarten.wullink@sidn.nl</email>
<uri>https://sidn.nl/</uri>
</address></author><author initials="P." surname="Kowalik" fullname="Pawel Kowalik"><organization>DENIC</organization><address><postal><street></street>
</postal><email>pawel.kowalik@denic.de</email>
<uri>https://denic.de/</uri>
</address></author><date/>
<area>Internet</area>
<workgroup>Network Working Group</workgroup>

<abstract>
<t>This document describes the requirement for the development of the RESTful Provisioning Protocol (RPP).</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>This document describes the set of requirements for the RESTful Provisioning Protocol (RPP), an Application Programming Interface (API) for provisioning objects in a shared database. RPP is based on the HTTP <xref target="RFC9110"></xref> protocol and the architectural principles of <xref target="REST"></xref>.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>In this document the following terminology is used.</t>
<t>REST - Representational State Transfer (<xref target="REST"></xref>). An architectural style.</t>
<t>RESTful - A RESTful web service is a web service or API implemented using HTTP and the principles of <xref target="REST"></xref>.</t>
<t>EPP RFCs - This is a reference to the EPP version 1.0 specifications <xref target="RFC5730"></xref>, <xref target="RFC5731"></xref>, <xref target="RFC5732"></xref> and <xref target="RFC5733"></xref>.</t>
<t>RESTful Provisioning Protocol or RPP - The protocol described in this document.</t>
<t>URL - A Uniform Resource Locator as defined in <xref target="RFC3986"></xref>.</t>
<t>Resource - An object having a type, data, and possible relationship to other resources, identified by a URL.</t>
<t>RPP client - An HTTP user agent performing an RPP request</t>
<t>RPP server - An HTTP server responsible for processing requests and returning results in any supported media type.</t>
</section>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</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;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in <xref target="RFC2119"></xref>.</t>
</section>

<section anchor="general"><name>General</name>
<t>A wel defined architecture MUST be defined for RPP, including a description of the responsibilities of the definded protocol layers.</t>
<t>The API MUST provide a clear, clean, easy to use and self-explanatory interface that can easily be integrated into existing software systems and includes language bindings for the most popular programming languages.</t>
<t>RPP MUST leverage widely deployed web standards, tools, and infrastructure components such as HTTP, JSON, OpenAPI specification, API gateways, load balancing, caching and delegate functional responsibility to the HTTP layer when possible. For example, authentication is part of the HTTP layer and not part of the RPP application layer.</t>
</section>

<section anchor="http"><name>HTTP</name>
<t>The Hypertext Transfer Protocol (HTTP) <xref target="RFC9110"></xref> MUST be used as the transport mechanism for RPP messages.</t>
<t>RPP SHOULD use the common best practices for designing a HTTP based application described in <xref target="BCP56"></xref>.</t>
<t>Consistent and meaningful URL structures MUST be used for for identifying, accessing resources and enable request routing.</t>
<t>RPP MUST use standard HTTP status codes and MAY define new RPP status and map these to HTTP status code, RPP MUST NIOT redefine HTTP status code semantics.</t>
</section>

<section anchor="rest"><name>REST</name>
<t>The RPP architecture MUST use the principles of the <xref target="REST"></xref> architectural style. A RPP server MUST conform to at least level 2 of the <xref target="RICHARDSON"></xref> Maturity Model (RMM).The RPP specification MUST specify all resource URLs used and therefore the URLs are already known and do not need to be dynamically discoverable, designing for RMM level 3 is not recommended.</t>
<t>When the semantics of a resource URL and HTTP method do not require a request message, the use of a request message MUST be optional.</t>
<t>RPP specifications SHOULD include an OpenAPI specification to facilitate documentation, testing, and code generation, and provide implementer-friendly extension descriptions.</t>
</section>

<section anchor="data-model"><name>Data Model</name>
<t>The base data model structures MUST be data format agnostic, it MUST be possible to map the data model to multiple data formats (JSON, XML, YAML etc.)</t>
<t>Commonly used EPP extensions MAY be added to the RPP core data model (example: DNSSEC)</t>
<t>RPP SHOULD provide mechanisms for registrars to signal data omission, indicating data collected but not transmitted to the registry.</t>
<t>RPP MUST allow for the use of different profiles to indicate required parts of the data model, mapping definitions, or functional subsets for compatibility.</t>
<t>The server MAY choose to let the client decide how strict the data validation must be. Use Prefer HTTP header &quot;handling=strict&quot; vs. &quot;handling=lenient” to make the server behave strictly about unknown attributes vs. ignoring unknown attributes. Another way would be with a more fine-granular approach like the “crit” claim in JWT.</t>
</section>

<section anchor="data-representation"><name>Data Representation</name>
<t>RPP MUST use JSON as its default data format, but support for multiple data formats (e.g. XML, YAML) MAY be included.</t>
<t>Validation of request and response message MUST be supported, in order to determine if the content is valid and no required attributes are missing.</t>
<t>A server MAY choose to include support for multiple media types.</t>
<t>A client MUST be able to signal to the server what media type the server should expect for the request content and to use for the response content.</t>
<t>Allow for the use of server profiles, indicating required parts for the data model and/or mapping definitions.</t>
<t>RPP SHOULD consider mechanisms for supporting data formats outside of core RPP domain. Especially formats, which lose their properties if transformed, like Verifiable Credentials for contacts which are digitally signed.</t>
<t>Partially updating an object MAY be supported, ussing HTTP PATCH method and <eref target="https://datatracker.ietf.org/doc/html/rfc7386">JSON Merge Patch</eref></t>
<t>Contact information MUST be provided using the JSContact <xref target="RFC9553"></xref> format.</t>
</section>

<section anchor="discoverability"><name>Discoverability</name>
<t>RPP MAY include a bootstrap mechanism te help clients locate RPP available services, possible solution include:</t>

<ul spacing="compact">
<li>IANA bootstrap Service Registry</li>
<li>DNS TXT record</li>
</ul>
<t>A discovery document MUST be made available in the well-known directory.</t>
<t>Server provided fucntionality, such as the set of supported extensions, MUST discoverable using the discovery document.</t>
<t>The API version MUST be discoverable and SHOULD be added to the discovery document.</t>
<t>Notices related to scheduled server maintenance timeslots MAY be included in the discovery document</t>
<t>A RPP service MAY choose to only support a subset of EPP functionality, this MUST be discoverable by the client.</t>
</section>

<section anchor="epp-compatibility"><name>EPP compatibility</name>
<t>RPP MUST provide functional equivalents for core EPP functionalities related to domain names, hosts, and contacts as defined in <xref target="RFC5731"></xref>, <xref target="RFC5732"></xref> and <xref target="RFC5733"></xref> mappings for core objects (domain, contact, host)</t>
<t>The automatic or mechanical mapping or conversion between EPP and RPP MUST be possible. Compatibility definitions for RPP to EPP mappings MAY be defined in compatibility profiles.</t>
<t>The most commonly used EPP extensions MAY be include in the core RPP specification.</t>
<t>Only the string based EPP token defined in <xref target="RFC5730"></xref> MUST be supported, any EPP token extensions MAY supported.</t>
</section>

<section anchor="security"><name>Security</name>
<t>RPP MUST support modern authentication and authorization schemes allowing for easy integration in modern HTTP infrastructure.</t>
<t>RPP MUST support modern authorization standards (OAuth, OpenId Connect)</t>
<t>Support for an easier and faster object transfer process MAY be included, where approval from the losing registar can be obtained interactively by the registrant during the transfer process</t>
<t>The authorisation model MUST support granular authorizations, using framework such as OAuth, beyond current auth-code based authorisation for transfers only, the following usecases MAY be supported:</t>

<ul spacing="compact">
<li>Domain transfers without first getting the &quot;normal&quot; transfertoken</li>
<li>DNS providers use the API to update the NS records</li>
<li>OpenID Connect to interactively allow for DNS provider to update NS records, directly at theregistry of indirectly through a supporting registar.</li>
<li>Renewals</li>
</ul>
<t>RPP MUST employ strong authentication and utilize encrypted transport (HTTPS) to protect sensitive data. Security mechanisms SHOULD be flexible to allow operators to choose appropriate methods and support federated authentication scenarios. RPP authorization models are intended to be fine-grained and go beyond simple auth-code based models, allowing for control at the operation and potentially attribute level.</t>
<t>RPP MAY include a mechanism for cryptographic verification of request and response messages as an additional security layer.</t>
</section>

<section anchor="extensibility"><name>Extensibility</name>
<t>The protocol MUST be extensible to accommodate new functionalities, data objects, and operations beyond the initial scope.</t>
<t>The RPP data model SHOULD aim for easy and natural extensibility to richer models compared to EPP, including attributes for VAT numbers, company numbers etc.</t>
<t>RPP MUST allow for flexibility in extending the data model (EPP object extension) e.g. adding new objects or a new attribute to an existing object MUST be possible.</t>
<t>Extensions for new operations (EPP protocol extension) on resources, e.g. registry-lock “/domains/example.nl/lock” MUST be supported.</t>
<t>EPP style command-response extensions MUST not be supported.</t>
<t>When a registry for RPP extensions is required, then IANA MUST be used for this function.</t>
<t>A namespace concept for JSON MUST be support, to prevent name collissions between the RPP core and a extension and between two or more extensions.</t>
</section>

<section anchor="scalability"><name>Scalability</name>
<t>RPP MUST be stateless and MUST NOT maintain application state on the server required for processing future RPP requests. Every client request needs to provide all the information required for the server to be able to successfully process the request. The client MAY maintain application session state, for example by using a JWT token.</t>
<t>Server responses that are cacheable MUST not include RPP transaction related identifiers and values.</t>
<t>RPP MUST support load balancing at the level of request messages</t>
<t>Every request message MUST at most contain a single object for the server to operate on, with the exception of operations that are explicitely defined as a bulk operation, bulk operations MAY be processed asynchronously.</t>
</section>

<section anchor="performance"><name>Performance</name>
<t>RPP MUST allow optional or no request/response message when this is not required, improving performance and network bandwidth requirements for both client and server. Fewer messages have to be created, marshalled, and transmitted.</t>
<t>RPP MAY allow for common bulk operations, resource listing, and filtering capabilities where this does not impact scalability negatively.</t>
<t>RPP MAY support compound object create request having embedded contact/host vs. request serialization (client waiting for contact/host creation to succeed before sending a domain request). Return complete representation (similar to object info in EPP) after compound request completed or return redirect to newly created object location.</t>
</section>

<section anchor="representation"><name>Representation</name>
<t>A client MAY want to request different depth of data representations, depending on the use case:</t>

<ul spacing="compact">
<li>Minimal representation (ID, or ID+name)</li>
<li>Full representation (all data of the object)</li>
<li>Full representation + dereferenced referrals (for example domain with contact and host details)</li>
</ul>
<t>Different representations may be requested in different contexts:</t>

<ul spacing="compact">
<li>GET request to the resource itself</li>
<li>GET request to get a collection of objects</li>
<li>Responses to PUT/POST/PATCH requests</li>
</ul>
<t>Data representation in a responses MUST only contain the provisioning object itself, the transactional information MUST be represented in separate HTTP headers.</t>
<t>RPP MUST support internationalization, including for Contact objects, email addresses, and Internationalized Domain Names (IDNs).</t>
<t>Human-readable localized response mesages MUST be supported.</t>
</section>

<section anchor="new-features"><name>New features</name>
<t>The server MAY support generating a representation of a historical overview for an object, e.g. show all events linked to the object (create, update ...). The historical time window is determined by server policy and MUST be included in the discovery service document.</t>
</section>

<section anchor="other"><name>Other</name>
<t>The items below have been mentioned on the mailinglist and may need to be added as an requirement.</t>

<ul spacing="compact">
<li>Data Omission - what requirements will there be around a registrar's ability to signal that it has collected some data but has not transmitted it to the registry?<br />
</li>
<li>Registration attribution - will there be requirements for attribution of registration actions (who did what), and will cryptography be used?<br />
</li>
<li>Registrant verification - will there be requirements to support registrant verification (NIS2)?<br />
</li>
<li>Linking - will the protocol support linking to RDAP objects, other RPP objects, etc...<br />
</li>
<li>Include identification of legal vs. natural contacts.</li>
<li>Expanded common models (when compared to EPP), maybe there should be much more attributes then it is in EPP (Vatnumber / Company Number/ properties for Identity papers) Trademark information and more There are a lot of epp extensions in the wild that try to handle this.</li>
<li>include also DNS provisioning as potential use-case</li>
<li>possibility to seamlessly compose the API with other registry use-cases to have uniform API layer from the client perspective</li>
<li><t>investigate possible multi-party authorisation schemas. Use case: DNS operator would get authorisation to update DS or NS record through RPP.</t>

<ul spacing="compact">
<li>This may refer to roles not yet considered in EPP processes, e.g. a third-party DNSSEC signing authority. For a potential use case, see <eref target="https://mailarchive.ietf.org/arch/msg/dd/iTf8pEMq5-sismlxfNbrFpzAIKU/">the discussion on the DD mailing list on that topic</eref>, which discusses potential approaches for DNS, some of which would require modelling relationships between parent/child/signer zone authorities in a provisioning protocol.</li>
</ul></li>
<li>possibility of mobile app or direct browser integration (use case for registries which directly authenticate their domain holders and allow operations on a domain and/or if RPP would be exposed by a registrar)</li>
</ul>
</section>

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

<section anchor="internationalization-considerations"><name>Internationalization Considerations</name>
<t>TODO</t>
</section>

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

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.56.xml"/>
<reference anchor="REST" target="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">
  <front>
    <title>Architectural Styles and the Design of Network-based Software Architectures</title>
    <author fullname="Roy Fielding" initials="R." surname="Fielding">
      <organization></organization>
    </author>
    <date year="2000"></date>
  </front>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5731.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5732.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5733.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9553.xml"/>
<reference anchor="RICHARDSON" target="https://martinfowler.com/articles/richardsonMaturityModel.html">
  <front>
    <title>Richardson Maturity Model</title>
    <author fullname="Martin Fowler" initials="M." surname="Fowler">
      <organization></organization>
    </author>
    <date year="2010"></date>
  </front>
</reference>
</references>

</back>

</rfc>
