<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-venhoek-nts-pool-04" category="exp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="NTS pools">NTS extensions for enabling pools</title>
    <seriesInfo name="Internet-Draft" value="draft-venhoek-nts-pool-04"/>
    <author fullname="David Venhoek">
      <organization>Trifecta Tech Foundation</organization>
      <address>
        <email>david@tweedegolf.com</email>
      </address>
    </author>
    <author fullname="Folkert de Vries">
      <organization>Tweede golf B.V.</organization>
      <address>
        <email>folkert@tweedegolf.com</email>
      </address>
    </author>
    <author fullname="Marc Schoolderman">
      <organization>Tweede golf B.V.</organization>
      <address>
        <email>marc@tweedegolf.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="04"/>
    <area>INT</area>
    <workgroup>ntp</workgroup>
    <keyword>NTP</keyword>
    <keyword>NTS</keyword>
    <abstract>
      <?line 49?>

<t>The aim of this document is to describe a proof of concept system for NTS pools that are able to be used by clients without any knowledge beyond plain NTS. The work here focuses purely on creating an intermediate NTS Key Exchange server that can be configured with the addresses of multiple servers and distribute load between them. The parts of pool operation dealing with managing the list of servers are left out of scope for this work.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://pendulum-project.github.io/nts-pool-draft/draft-venhoek-nts-pool.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-venhoek-nts-pool/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/pendulum-project/nts-pool-draft"/>.</t>
    </note>
  </front>
  <middle>
    <?line 53?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>NTS <xref target="RFC8915"/> provides authenticity and limited confidentiality for NTP <xref target="RFC5905"/>. However, the key exchange preceding the actual time exchange makes it hard to implement a pool for NTS supporting servers in a manner similar to the DNS resolution approach taken to provide the NTP Pool <xref target="Pool"/>.</t>
      <t>This document aims to provide extensions to the NTS Key Exchange sessions that allow for an implementation of a pool for NTS that:</t>
      <ul spacing="normal">
        <li>
          <t>is usable without changes to the client,</t>
        </li>
        <li>
          <t>avoids constraining the time source's cookie format,</t>
        </li>
        <li>
          <t>avoids time sources having potential access to all traffic.</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>Throughout the text, the terms client and server will refer to those roles in an NTS Key Exchange session as specified in <xref target="RFC8915"/>. Please note that this means that the pool itself operates in both roles: As a server towards users of the pool, and as a client towards the time sources.</t>
      <t>Where further specificity of the role of a participant is needed, we will use the term user to indicate a user of a pool, the term pool to indicate the pool itself, and time source for the time servers that the pool delegates the actual providing of time to.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

</section>
    <section anchor="general-pool-architecture">
      <name>General pool architecture</name>
      <t>We propose a pool model where the pool provides an NTS Key Exchange service to the outside world. A major advantage of this model is that it avoids having to distribute certificates to all time sources. Contrary to <xref target="RFC8915"/>, there is no direct TLS connection between the client and the selected time source.</t>
      <t>In <xref target="RFC8915"/>, cookies are generated based on key material that is extracted from this TLS connection. Our proposed model instead establishes two TLS connections: between the client and the pool, and between the pool and the time source. Because cookies need to be generated using key material from the client, the pool extracts this key material and sends it to the time source. The time source uses this key material (rather than key material extracted from its connection with the pool) to generate cookies. This way, the pool can remain oblivious to the cookie format of the time source.</t>
    </section>
    <section anchor="communication-between-the-pool-and-time-sources">
      <name>Communication between the pool and time sources</name>
      <t>To facilitate communication between the pool and the time sources, 4 new NTS records are defined in <xref target="records"/>. Together these records provide a way for the pool to provide key exchange services to clients on behalf of the time sources.</t>
      <t>The Supported Next Protocol List (<xref target="supportedprotocol"/>), Supported Algorithm List (<xref target="supportedalgorithm"/>) and List Server Names (<xref target="listservernames"/>)) records allow the pool to ask a time source which protocols and algorithms it supports, and which server names are used in the NTP server records it generates. This information can be requested by the pool at any time, and can be cached for short periods of time to improve efficiency.</t>
      <t>Using knowledge of a time source's supported protocols and algorithms, the pool can then handle client connections for that time source, using the clients indicated desires to choose a concrete next protocol and AEAD algorithm. The pool can then extract the keys from the TLS connection and use the Fixed Key record (<xref target="fixedkey"/>) to request cookies for these keys from the time source. The response to a request containing a Fixed Key record will be the same as that for any regular NTS Key Exchange response, with the exception that the keys will be taken from the Fixed Key record instead of being derived from the TLS connection.</t>
      <t>The list of server names provided by the time source can be used by the pool to honor requests by the client to not repeat a certain server. This allows more efficient retrieval of multiple sources from a pool.</t>
      <t>As it is wasteful to setup a new TLS session between the pool and the time source for each of these interactions. To facilitate reuse of the TLS sessions, we further introduce the Keep Alive record (<xref target="keepalive"/>). This record allows the pool to indicate to the time source a desire to keep the session alive for more than a single request-response interaction.</t>
      <section anchor="poolauth">
        <name>Authenticating the pool to time sources</name>
        <t>Allowing arbitrary clients to keep connections alive for more that a single request-response interaction could open up the server to denial of service due to resource exhaustion. To prevent this, a pool wishing to use the keep alive functionality <bcp14>MUST</bcp14> authenticate itself to the time source using an Authentication Token record (<xref target="authentication"/>). Time sources <bcp14>MUST</bcp14> check that the content of the Authentication Token record matches the authentication string of a client that is on the list of requestors allowed to use the keep alive mechanism. By default, the list of requestors allowed to use the keep alive mechanism <bcp14>MUST</bcp14> be empty</t>
        <t>Furthermore, time sources <bcp14>MAY</bcp14> choose to also restrict the Fixed Key, Supported Next Protocol List and Supported Algorithm List to authenticated clients. If this choice is made, it is suggested that the server treat these records as unrecognized critical records on unauthenticated client's connections.</t>
      </section>
    </section>
    <section anchor="communication-between-clients-and-the-pool">
      <name>Communication between clients and the pool</name>
      <t>A client requesting time from the pool can make a normal NTS Key Exchange request to the pool. In the response to the client the pool needs to tell which NTP server is to be used to get the time. This can be done through the already existing NTP Server Record. However, the pool needs to ensure it is present, and therefore <bcp14>MUST</bcp14> add such a record to the response unless one is already provided by the time source.</t>
      <t>Clients that are aware they are talking to a pool may want to get multiple independent time sources from that pool. For this, they need to be able to tell the pool which time sources they already have, otherwise they might get a time source that they are already talking to. To achieve this, a client can use the NTP Server Deny record (<xref target="serverdeny"/>) to indicate it would rather not receive a particular server. Clients <bcp14>MUST</bcp14> use the precise name given by the pool in a previous NTP Server record, otherwise the pool may not recognize which time source the client is referring to.</t>
    </section>
    <section anchor="records">
      <name>New NTS record types</name>
      <section anchor="keepalive">
        <name>Keep Alive</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4000)
Critical bit: 0</t>
        <t>Indicates a desire to keep the TLS connection active for more than one message exchange. This can be used by a pool to reuse connections to a time source's NTS Key Exchange servers multiple times, reducing load on both the pool and time sources.</t>
        <t>When a client sends this record the body <bcp14>MUST</bcp14> have size 0. A client <bcp14>MUST NOT</bcp14> use Keep Alive unless the request contains a record type allowing the use of Keep Alive. Within this specification, that is limited to the Supported Protocol List and Fixed Key Request records. A server <bcp14>SHOULD</bcp14> ignore any body for the Keep Alive record.</t>
        <t>When supported by a server and allowed for the request in question, the server <bcp14>MAY</bcp14> include a Keep Alive record with a body of size 0 in the response and keep the TLS connection active after the response to handle further requests from the client. A client <bcp14>SHOULD</bcp14> ignore any body for the Keep Alive record. As keeping a connection active requires additional resources on the server, a server <bcp14>SHOULD NOT</bcp14> respond with a Keep Alive record to unauthenticated clients.</t>
        <t>When included in the request or response, the client respectively server <bcp14>MAY</bcp14>, contrary to the requirements in <xref target="RFC8915"/>, send another request or response. Any TLS "close_notify" <bcp14>SHALL</bcp14> be sent only after the last request or response respectively to use the connection.</t>
        <t>Once a Keep Alive record has been sent by a client, or honored by a server, the TLS connection over which it was sent <bcp14>MUST NOT</bcp14> be used for key extraction. Doing so anyway can result in the reuse of keys and may result in loss of confidentiality or authenticity of the resulting NTP exchanges.</t>
      </section>
      <section anchor="supportedprotocol">
        <name>Supported Next Protocol List</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4004)
Critical bit: 1</t>
        <t>This record can be used by a pool to query time sources about which next protocols they support.</t>
        <t>When a client sends this record the body <bcp14>MUST</bcp14> have size 0. Clients <bcp14>MAY</bcp14> use Keep Alive in combination with this record. Contrary to <xref target="RFC8915"/>, a request with this record <bcp14>SHOULD NOT</bcp14> include a "Next Protocol Negotiation", "AEAD Algorithm Negotiation" or "Fixed Key Request" record.</t>
        <t>When receiving this record, servers <bcp14>MUST</bcp14> ignore any client body sent and <bcp14>MUST</bcp14> send in the response a Supported Next Protocol List record with as data a list of 16-bit integers, giving the protocol IDs the server supports. A server <bcp14>MAY</bcp14> treat this record as unknown for clients that are not authenticated as described in <xref target="poolauth"/>.</t>
        <t>When included, the server <bcp14>MUST NOT</bcp14> negotiate a next protocol, AEAD algorithm, or keys for this request.</t>
      </section>
      <section anchor="supportedalgorithm">
        <name>Supported Algorithm List</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4001)
Critical bit: 1</t>
        <t>This record can be used by a pool to query time sources about which AEAD algorithms they support.</t>
        <t>When a client sends this record the body <bcp14>MUST</bcp14> have size 0. Clients <bcp14>MAY</bcp14> use Keep Alive in combination with this record. Contrary to <xref target="RFC8915"/>, a request with this record <bcp14>SHOULD NOT</bcp14> include a "Next Protocol Negotiation", "AEAD Algorithm Negotiation" or "Fixed Key Request" record.</t>
        <t>When receiving this record, servers <bcp14>MUST</bcp14> ignore any client body sent and <bcp14>MUST</bcp14> send in the response a Supported Algorithm List record with as data a list of tuples of two 16-bit integers, the first giving an algorithm ID for the AEAD and the second giving the length of the key for that algorithm ID. A server <bcp14>MAY</bcp14> treat this record as unknown for clients that are not authenticated as described in <xref target="poolauth"/>.</t>
        <t>When included, the server <bcp14>MUST NOT</bcp14> negotiate a next protocol, AEAD algorithm, or keys for this request.</t>
        <t>We include the algorithm key size in the response so that a pool does not itself need knowledge of which AEAD algorithms exist, and what their key sizes are. Instead, it can use the provided key length when extracting keys from the TLS connection between end user and pool. This allows adoption of new AEAD algorithms without any changes to the pool software.</t>
      </section>
      <section anchor="listservernames">
        <name>List Server Names</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4005)
Critical bit: 1</t>
        <t>This record can be used by a pool to query time sources about which server names they use in NTP server records in their responses.</t>
        <t>When a client sends this record the body <bcp14>MUST</bcp14> have size 0. Clients <bcp14>MAY</bcp14> use Keep Alive in combination with this record. Contrary to <xref target="RFC8915"/>, a request with this record <bcp14>SHOULD NOT</bcp14> include a "Next Protocol Negotiation", "AEAD Algorithm Negotiation" or "Fixed Key Request" record.</t>
        <t>Servers <bcp14>MUST NOT</bcp14> include this record in a response. When receiving this record, servers <bcp14>MUST</bcp14> ignore any body of this record sent by the client, and <bcp14>MUST</bcp14> send in the response one NTP server record for each server name the server may use responses to fixed key requests. If a server never sends a NTP server record in response to a fixed key request, it <bcp14>MAY</bcp14> opt to not provide one in response to this record.</t>
        <t>When receiving this record, a server <bcp14>MUST NOT</bcp14> negotiate a next protocol, AEAD algorithm, or keys for this request. A server <bcp14>MAY</bcp14> treat this record as unknown for clients that are not authenticated as described in <xref target="poolauth"/>.</t>
      </section>
      <section anchor="fixedkey">
        <name>Fixed Key Request</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4002)
Critical Bit: 1</t>
        <t>When a client is properly authenticated, the server <bcp14>SHOULD NOT</bcp14> perform Key Extraction but rather use the keys provided by the client in the extension field. In all other aspects, the response <bcp14>SHALL</bcp14> be the same as that from a regular key exchange session as specified in <xref target="RFC8915"/>. This allows a pool to do key negotiation on behalf of its users with the time source's NTS Key Exchange servers, even though it terminates the TLS connection.</t>
        <t>When used, the client <bcp14>MUST</bcp14> provide an AEAD Algorithm Negotiation record with precisely one algorithm, and a Next Protocol Negotiation record with precisely one next protocol. The data in the Fixed Key Request record must have length twice the key length N of the AEAD algorithm in the AEAD Algorithm Negotiation record. The first N bytes <bcp14>MUST</bcp14> be the C2S Key and the second set of N bytes <bcp14>MUST</bcp14> be the S2C key. Clients <bcp14>MAY</bcp14> use Keep Alive in combination with this record.</t>
        <t>This record <bcp14>MUST NOT</bcp14> be sent by a server. A server <bcp14>MAY</bcp14> treat this record as unknown for clients that are not authenticated as described in <xref target="poolauth"/>.</t>
      </section>
      <section anchor="serverdeny">
        <name>NTP Server Deny</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4003)
Critical Bit: 0</t>
        <t>When provided by a client, indicates a desire to connect to a server other than the server specified in the record. This can be used to ensure a client receives independent NTP servers from one NTS Key Exchange server without having to potentially try multiple times to get a new server.</t>
        <t>A client <bcp14>MAY</bcp14> send multiple of these records if desired. The data in the record <bcp14>SHOULD</bcp14> match that given through an NTPv4 Server Negotiation received in an earlier response from the same NTS Key Exchange server.</t>
        <t><bcp14>MUST NOT</bcp14> be sent by a server. Server <bcp14>MAY</bcp14> at its discretion ignore the request from the client and still provide the given server in an NTPv4 Server Negotiation record.</t>
      </section>
      <section anchor="authentication">
        <name>Authentication Token</name>
        <t>Record Type Number: To be assigned by IANA (draft implementations: 0x4005)
Critical Bit: 0</t>
        <t>When provided by a client, gives a proof of their identity through a pre-shared secret token. This can be used to allow only certain clients, for example pools, to use certain functionality of an NTS key exchange server. In particular, it can be used to prevent misuse of the keep alive mechanism by clients other than the pool, preventing resource exhaustion denial of service attack.</t>
        <t>This record <bcp14>MUST</bcp14> be sent before records that may be refused if not properly authenticated. A client <bcp14>MUST NOT</bcp14> send more than 1 of this record. The data in the record should be an ASCII string, previously agreed through an out of scope mechanism.</t>
        <t>The Authentication Token record <bcp14>MUST NOT</bcp14> be sent by a server. A server <bcp14>MAY</bcp14> use the record to gate acceptance of other records such as the Keep Alive, Fixed Key Request, List Server Names, Supported Algorithm List and Supported Next Protocol List records. A server supporting this record <bcp14>MUST</bcp14> support keys of length at least 64 characters. Keys <bcp14>SHOULD</bcp14> be chosen such that they have at least 128 bits of entropy.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="pools-position">
        <name>Pool's position</name>
        <t>In the pool design presented above, the pool effectively acts as a man in the middle between the user and the ultimate time source during the NTS Key Exchange portion of the session. This means that the pool has access to the key material of these sessions. Although this is a small additional risk, we consider this acceptable because the pool could already always assign sessions for a user to time servers it controls anyway.</t>
        <t>The fact that the pool also gets access to key material makes it less advisable to have a pool as a time source for another pool, as this increases the number of actors with access to the key material even further.</t>
        <t>The design above does avoid sharing key material between all time sources. As a consequence, a time source in the pool will not be able to break confidentiality or authenticity of traffic with other time sources of the pool. Furthermore, any traffic directly with the time source has no key material involved that is known to the pool.</t>
        <t>It must be noted that clients need to trust the pool to check the TLS certificates of the time sources. It is imperative that the pool does this correctly, and that it has a trusted source of time to be able to do revocation checks.</t>
      </section>
      <section anchor="keep-alive-and-denial-of-service-attack-risk">
        <name>Keep alive and denial of service attack risk</name>
        <t>The Keep Alive NTS record allows a client to keep an NTS key exchange connection open for significantly longer than usual. If arbitrary clients were allowed to do this, they could use it trivially run a server out of resources such as file descriptors. It is therefore important that public servers restrict keeping connections alive to a limited set of trusted clients. The suggested mechanism for doing this is to use TLS client authentication for these clients.</t>
      </section>
      <section anchor="error-handling">
        <name>Error handling</name>
        <t>To avoid giving multiple time sources access to the key material of the end user, it is important that the keys extracted from the TLS session between the user and the pool are sent to at most one time source. If an error occurs after sending the Fixed Key Request record, either with the TLS connection between the pool and the time source, or by being explicitly reported by the time source to the pool, the pool <bcp14>SHOULD</bcp14> return an error to the user. Retrying with a different time source during the same TLS session may unintentionally leave the user vulnerable to the operator of the originally selected time source.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to allocate the following entries in the Network Time Security Key Establishment Record Types registry <xref target="RFC8915"/>:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Record Type Number</th>
            <th align="left">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">Keep Alive</td>
            <td align="left">[[this memo]] <xref target="keepalive"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">Supported Next Protocol List</td>
            <td align="left">[[this memo]] <xref target="supportedprotocol"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">Supported Algorithm List</td>
            <td align="left">[[this memo]] <xref target="supportedalgorithm"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">List Server Names</td>
            <td align="left">[[this memo]] <xref target="listservernames"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">Fixed Key Request</td>
            <td align="left">[[this memo]] <xref target="fixedkey"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">NTP Server Deny</td>
            <td align="left">[[this memo]] <xref target="serverdeny"/></td>
          </tr>
          <tr>
            <td align="left">[[TBD]]</td>
            <td align="left">Authentication Token</td>
            <td align="left">[[this memo]] <xref target="authentication"/></td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8915">
          <front>
            <title>Network Time Security for the Network Time Protocol</title>
            <author fullname="D. Franke" initials="D." surname="Franke"/>
            <author fullname="D. Sibold" initials="D." surname="Sibold"/>
            <author fullname="K. Teichel" initials="K." surname="Teichel"/>
            <author fullname="M. Dansarie" initials="M." surname="Dansarie"/>
            <author fullname="R. Sundblad" initials="R." surname="Sundblad"/>
            <date month="September" year="2020"/>
            <abstract>
              <t>This memo specifies Network Time Security (NTS), a mechanism for using Transport Layer Security (TLS) and Authenticated Encryption with Associated Data (AEAD) to provide cryptographic security for the client-server mode of the Network Time Protocol (NTP).</t>
              <t>NTS is structured as a suite of two loosely coupled sub-protocols. The first (NTS Key Establishment (NTS-KE)) handles initial authentication and key establishment over TLS. The second (NTS Extension Fields for NTPv4) handles encryption and authentication during NTP time synchronization via extension fields in the NTP packets, and holds all required state only on the client via opaque cookies.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8915"/>
          <seriesInfo name="DOI" value="10.17487/RFC8915"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC5905">
          <front>
            <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</title>
            <author fullname="D. Mills" initials="D." surname="Mills"/>
            <author fullname="J. Martin" initials="J." role="editor" surname="Martin"/>
            <author fullname="J. Burbank" initials="J." surname="Burbank"/>
            <author fullname="W. Kasch" initials="W." surname="Kasch"/>
            <date month="June" year="2010"/>
            <abstract>
              <t>The Network Time Protocol (NTP) is widely used to synchronize computer clocks in the Internet. This document describes NTP version 4 (NTPv4), which is backwards compatible with NTP version 3 (NTPv3), described in RFC 1305, as well as previous versions of the protocol. NTPv4 includes a modified protocol header to accommodate the Internet Protocol version 6 address family. NTPv4 includes fundamental improvements in the mitigation and discipline algorithms that extend the potential accuracy to the tens of microseconds with modern workstations and fast LANs. It includes a dynamic server discovery scheme, so that in many cases, specific server configuration is not required. It corrects certain errors in the NTPv3 design and implementation and includes an optional extension mechanism.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5905"/>
          <seriesInfo name="DOI" value="10.17487/RFC5905"/>
        </reference>
        <reference anchor="Pool" target="https://www.ntppool.org">
          <front>
            <title>NTP Pool website</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 239?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank Marlon Peeters, Ruben Nijveld and Watson Ladd for their input and discussions during the writing of this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1c63IbR3b+j6foQD92nQJp0Us7Nmuzu5Qo2SzLlCLSVm25
XKnGTANoczCDnZ4BhKX1LnmWPFm+c053T88MSMmxnaS2UuWyiEFPX871O5fG
0dHRpLFNYc7U9OrmWpm3jSmdrUqnFlWtTKnnhS2XalNVhZtO9Hxem60f659l
ujHLqt6f4eXNZJJXWanXmC+v9aI52ppyVZnbo7JxR/TC0ePTiWvna+tolWa/
wcjLZzfPlXqkdOEqzG3L3GwM/lc205mamtw2VW11QR8uz5/gH+xsevn65vl0
UrbruanPJjk2cTbJsG9sv3VnqqlbM8FO/zDRtdFY4+pmsqvq22VdtZszVTab
ya3Z40l+NlFH6urmlfxzPcGOW8z1SCk/9s2X9EG2+gZTED2+pK/o8Vrbgob8
xbzV601hjrNqTc91na3O1KppNu7s44+TLz/GdJjaNqt2jsPSQduiXR9t6upH
kzUfR0Ix/aYYW+BsrsHYMNvwnWOZ7dhWg7c/PsyD41WzLqaTiW6bVVXT+bGK
Uou2KIR10wu9tbn6Tt6b8rdVvdSl/btuwLYzdVPbBVbW6sZkK/W8asucv+Gh
RogyzWmWvzQ7Y3JISLGg408PrPa8Km5N3ajcqO9qa9zBBXkWRdOoJ8ffHfcW
WsgEH7DUN+CLus5WoEJu6rUuf/Zaa8wwWmhSVpissVsIjlKvnz/9/PT0s/Dn
Fyefnk0mtlwMxnz6xeNP6c9X2MwZr9HoemmaTmx2u90xJJV5hi3KGNFWCCy/
qHZm7mxjJpOjoyOl566pddZMJjcro7Rdq2qhmpV1CmrZrqFRCn83FUjtstrO
MUZBiDAI/0F7MrNplNu7xqxZ/6OaYxLdQKjxwrwwNAPebZ3J1XyvssJiZqd2
EMOqxbByr27LaleYfGkwcF+VudoU2pY04bGivZEuqpXBhAvszBmnNm1tir2q
SpVBYxvSMl0qWzbgE2wAlIC387XZq2dvs5UuMbcz9dbUsrkMo7EpnGJhl5gr
5/3gO+w5z2vjaBEcc90WjYUy+pcdVslVbkE4O2+xSFFpnMoQi0t6ey0b3ui6
4feJHqramJqlBZTUbCF5MQiUXtInWrXAnPRCXAeHLcwCz1p5nmEWJjNziChy
LGxc2zwvwNJH6rJs6ipvM9atCZ3/7s7L1Lt3xDpoGI5FmgwW2Mw2ez5PYdcQ
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

-->

</rfc>
