<?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.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ntp-roughtime-11" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title>Roughtime</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ntp-roughtime-11"/>
    <author fullname="Watson Ladd">
      <organization>Akamai Technologies</organization>
      <address>
        <email>watsonbladd@gmail.com</email>
      </address>
    </author>
    <author fullname="Marcus Dansarie">
      <organization>Netnod</organization>
      <address>
        <email>marcus@dansarie.se</email>
        <uri>https://orcid.org/0000-0001-9246-0263</uri>
      </address>
    </author>
    <date year="2024" month="August" day="02"/>
    <area>Internet</area>
    <workgroup>Network Time Protocols</workgroup>
    <keyword>next generation</keyword>
    <keyword>unicorn</keyword>
    <keyword>sparkling distributed ledger</keyword>
    <abstract>
      <?line 38?>

<t>This document specifies Roughtime - a protocol that aims to achieve
rough time synchronization even for clients without any idea of what
time it is.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ntp-roughtime/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/wbl/roughtime-draft"/>.</t>
    </note>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Time synchronization is essential to Internet security as many
security protocols and other applications require synchronization
<xref target="RFC738"/>. Unfortunately, widely deployed protocols such as
the Network Time Protocol (NTP) <xref target="RFC5905"/> lack essential security
features, and even newer protocols like Network Time Security (NTS)
<xref target="RFC8915"/> lack mechanisms to ensure that the servers behave
correctly. Furthermore, clients may lack even a basic idea of the
time, creating bootstrapping problems. Roughtime is intended to permit
devices to obtain a rough idea of the current time from fairly static
configuration consisting of a key and a server.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <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="protocol-overview">
      <name>Protocol Overview</name>
      <t>Roughtime is a protocol for rough time synchronization that enables
clients to provide cryptographic proof of server malfeasance. It does
so by having responses from servers include a signature over a value
derived from a nonce in the client request. This provides
cryptographic proof that the timestamp was issued after the server
received the client's request. The derived value included in the
server's response is the root of a Merkle tree which includes the hash
of the client's nonce as the value of one of its leaf nodes. This
enables the server to amortize the relatively costly signing operation
over a number of client requests.</t>
      <t>Single server mode: At its most basic level, Roughtime is a one round
protocol in which a completely fresh client requests the current time
and the server sends a signed response. The response includes a
timestamp and a radius used to indicate the server's certainty about
the reported time.</t>
      <t>The server proves freshness of its response as follows. The client's
request contains a nonce which the server incorporates into its signed
response. The client can verify the server's signatures and - provided
that the nonce has sufficient entropy - this proves that the signed
response could only have been generated after the nonce.</t>
    </section>
    <section anchor="the-guarantee">
      <name>The Guarantee</name>
      <t>A Roughtime server guarantees that a response to a query sent at
t<sub>1</sub>, received at t<sub>2</sub>, and with timestamp
t<sub>3</sub> has been created between t<sub>1</sub> and
t<sub>2</sub>. If t<sub>3</sub> is not within that interval, a server
inconsistency may be detected and used to impeach the server. The
propagation of such a guarantee and its use for time synchronization
is discussed in <xref target="integration-into-ntp"/>. No delay attacker may affect
this: they may only expand the interval between t<sub>1</sub> and
t<sub>2</sub>, or of course stop the measurement in the first place.</t>
    </section>
    <section anchor="message-format">
      <name>Message Format</name>
      <t>Roughtime messages are maps consisting of one or more (tag, value)
pairs. They start with a header, which contains the number of pairs,
the tags, and value offsets. The header is followed by a message
values section which contains the values associated with the tags in
the header. Messages <bcp14>MUST</bcp14> be formatted according to <xref target="figmessage"/> as
described in the following sections.</t>
      <t>Messages <bcp14>MAY</bcp14> be recursive, i.e. the value of a tag can itself be a
Roughtime message.</t>
      <figure anchor="figmessage">
        <name>Roughtime Message</name>
        <artwork><![CDATA[
0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Number of pairs (uint32)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                     N-1 offsets (uint32)                      .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                        N tags (uint32)                        .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                            Values                             .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>
      <section anchor="data-types">
        <name>Data types</name>
        <section anchor="int32">
          <name>int32</name>
          <t>An int32 is a 32 bit signed integer. It is serialized least
significant byte first in sign-magnitude representation with the sign
bit in the most significant bit. The negative zero value (0x80000000)
<bcp14>MUST NOT</bcp14> be used and any message with it is syntactically invalid and
<bcp14>MUST</bcp14> be ignored.</t>
        </section>
        <section anchor="uint32">
          <name>uint32</name>
          <t>A uint32 is a 32 bit unsigned integer. It is serialized
with the least significant byte first.</t>
        </section>
        <section anchor="uint64">
          <name>uint64</name>
          <t>A uint64 is a 64 bit unsigned integer. It is serialized with the least
significant byte first.</t>
        </section>
        <section anchor="type-tag">
          <name>Tag</name>
          <t>Tags are used to identify values in Roughtime messages. A tag is a
uint32 but can also be represented as a sequence of up to four ASCII
characters <xref target="RFC20"/>. ASCII strings shorter than four characters can
be unambiguously converted to tags by padding them with zero bytes.
Tags <bcp14>MUST NOT</bcp14> contain any other bytes than capital letters (A-Z) or
padding zero bytes. For example, the ASCII string "NONC" would
correspond to the tag 0x434e4f4e and "ZZZZ" would correspond to
0x5a5a5a5a. Note that when encoded into a message the ASCII values
will be in the natural bytewise order.</t>
        </section>
        <section anchor="timestamp">
          <name>Timestamp</name>
          <t>A timestamp is a representation of UTC time as a uint64 count of
seconds since 00:00:00 on 1 January 1970 (the Unix epoch), assuming
every day has 86400 seconds. This is a constant offset from the NTP
timestamp in seconds. Leap seconds do not have an unambiguous
representation in a timestamp, and this has implications for the
attainable accuracy and setting of the RADI tag.</t>
        </section>
      </section>
      <section anchor="header">
        <name>Header</name>
        <t>All Roughtime messages start with a header. The first four bytes of
the header is the uint32 number of tags N, and hence of (tag, value)
pairs.</t>
        <t>The following 4*(N-1) bytes are offsets, each a uint32. The last 4*N
bytes in the header are tags.  Offsets refer to the positions of the
values in the message values section. All offsets <bcp14>MUST</bcp14> be multiples of
four and placed in increasing order. The first post-header byte is at
offset 0. The offset array is considered to have a not explicitly
encoded value of 0 as its zeroth entry.</t>
        <t>The value associated with the ith tag begins at offset[i] and ends at
offset[i+1]-1, with the exception of the last value which ends at the
end of the message. Values may have zero length. All lengths and
offsets are in bytes.</t>
        <t>Tags <bcp14>MUST</bcp14> be listed in the same order as the offsets of their values
and <bcp14>MUST</bcp14> also be sorted in ascending order by numeric value. A tag
<bcp14>MUST NOT</bcp14> appear more than once in a header.</t>
      </section>
    </section>
    <section anchor="protocol-details">
      <name>Protocol Details</name>
      <t>As described in <xref target="protocol-overview"/>, clients initiate time
synchronization by sending requests containing a nonce to servers who
send signed time responses in return. Roughtime packets can be sent
between clients and servers either as UDP datagrams or via TCP
streams. Servers <bcp14>SHOULD</bcp14> support the UDP transport mode and TCP mode.</t>
      <t>A Roughtime packet <bcp14>MUST</bcp14> be formatted according to <xref target="figpack"/> and as
described here. The first field is a uint64 with the value
0x4d49544847554f52 ("ROUGHTIM" in ASCII). The second field is a uint32
and contains the length of the third field. The third and last field
contains a Roughtime message as specified in <xref target="message-format"/>.</t>
      <figure anchor="figpack">
        <name>Roughtime packet</name>
        <artwork><![CDATA[
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  0x4d49544847554f52 (uint64)                  |
|                        ("ROUGHTIM")                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Message length (uint32)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                      Roughtime message                        .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>
      <t>Roughtime request and response packets <bcp14>MUST</bcp14> be transmitted in a single
datagram when the UDP transport mode is used. Setting the packet's
don't fragment bit <xref target="RFC791"/> is <bcp14>OPTIONAL</bcp14> in IPv4 networks.</t>
      <t>Multiple requests and responses can be exchanged over an established
TCP connection. Clients <bcp14>MAY</bcp14> send multiple requests at once and servers
<bcp14>MAY</bcp14> send responses out of order. The connection <bcp14>SHOULD</bcp14> be closed by
the client when it has no more requests to send and has received all
expected responses. Either side <bcp14>SHOULD</bcp14> close the connection in
response to synchronization, format, implementation-defined timeouts,
or other errors.</t>
      <t>All requests and responses <bcp14>MUST</bcp14> contain the VER tag. It contains a
list of one or more uint32 version numbers. The version of Roughtime
specified by this memo has version number 1.</t>
      <t>NOTE TO RFC EDITOR: remove this paragraph before publication. For
testing drafts of this memo, a version number of 0x80000000 plus the
draft number is used.</t>
      <section anchor="requests">
        <name>Requests</name>
        <t>A request <bcp14>MUST</bcp14> contain the tags VER and NONC. It <bcp14>SHOULD</bcp14> include the
tag SRV. Other tags <bcp14>SHOULD</bcp14> be ignored by the server. A future version
of this protocol may mandate additional tags in the message and assign
them semantic meaning.</t>
        <t>The size of the request message <bcp14>SHOULD</bcp14> be at least 1024 bytes when the
UDP transport mode is used. To attain this size the ZZZZ tag <bcp14>SHOULD</bcp14> be
added to the message. Responding to requests shorter than 1024 bytes
is <bcp14>OPTIONAL</bcp14> and servers <bcp14>MUST NOT</bcp14> send responses larger than the
requests they are replying to.</t>
        <section anchor="ver">
          <name>VER</name>
          <t>In a request, the VER tag contains a list of versions. The VER tag
<bcp14>MUST</bcp14> include at least one Roughtime version supported by the
client. The client <bcp14>MUST</bcp14> ensure that the version numbers and tags
included in the request are not incompatible with each other or the
packet contents.</t>
          <t>The version numbers <bcp14>MUST NOT</bcp14> repeat.</t>
        </section>
        <section anchor="nonc">
          <name>NONC</name>
          <t>The value of the NONC tag is a 32 byte nonce. It <bcp14>SHOULD</bcp14> be generated
in a manner indistinguishable from random. BCP 106 contains specific
guidelines regarding this <xref target="RFC4086"/>.</t>
        </section>
        <section anchor="srv">
          <name>SRV</name>
          <t>The SRV tag is used by the client to indicate which long-term public
key it expects to verify the response with. The value of the SRV tag
is <tt>H(0xff || public_key)</tt> where <tt>public_key</tt> is the server's
long-term, 32-byte Ed25519 public key and H is SHA512 truncated to
the first 32 bytes.</t>
        </section>
        <section anchor="zzzz">
          <name>ZZZZ</name>
          <t>The ZZZZ tag is used to expand the response to the minimum required
length. Its value <bcp14>MUST</bcp14> be a string of all zeros.</t>
        </section>
      </section>
      <section anchor="responses">
        <name>Responses</name>
        <t>The server begins the request handling process with a set of long-term
keys. It resolves which long-term key to use with the following
procedure:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the request contains a SRV tag, then the server looks up the
long-term key indicated by the SRV value. If no such key exists,
then the server <bcp14>MUST</bcp14> ignore the request.</t>
          </li>
          <li>
            <t>If the request contains no SRV tag, but the server has just one
long-term key, it <bcp14>SHOULD</bcp14> select that key. Otherwise, if the server
has multiple long-term keys, then it <bcp14>MUST</bcp14> ignore the request.</t>
          </li>
        </ol>
        <t>A response <bcp14>MUST</bcp14> contain the tags SIG, VER, NONC, PATH, SREP, CERT,
 and INDX.</t>
        <section anchor="sig">
          <name>SIG</name>
          <t>In general, a SIG tag value is a 64 byte Ed25519 signature
<xref target="RFC8032"/> over a concatenation of a signature context ASCII string
and the entire value of a tag. All context strings <bcp14>MUST</bcp14> include a
terminating zero byte.</t>
          <t>The SIG tag in the root of a response <bcp14>MUST</bcp14> be a signature over the
SREP value using the public key contained in CERT. The context string
<bcp14>MUST</bcp14> be "RoughTime v1 response signature".</t>
        </section>
        <section anchor="ver-1">
          <name>VER</name>
          <t>In a response, the VER tag <bcp14>MUST</bcp14> contain a single version number. It
<bcp14>SHOULD</bcp14> be one of the version numbers supplied by the client in its
request. The server <bcp14>MUST</bcp14> ensure that the version number corresponds
with the rest of the packet contents.</t>
        </section>
        <section anchor="nonc-1">
          <name>NONC</name>
          <t>The NONC tag <bcp14>MUST</bcp14> contain the nonce of the message being responded to.</t>
        </section>
        <section anchor="path">
          <name>PATH</name>
          <t>The PATH tag value <bcp14>MUST</bcp14> be a multiple of 32 bytes long and represent a
path of 32 byte hash values in the Merkle tree used to generate the
ROOT value as described in a <xref target="merkle-tree"/>. In the case where a
response is prepared for a single request and the Merkle tree contains
only the root node, the size of PATH <bcp14>MUST</bcp14> be zero.</t>
        </section>
        <section anchor="srep">
          <name>SREP</name>
          <t>The SREP tag contains a time response. Its value <bcp14>MUST</bcp14> be a Roughtime
message with the tags ROOT, MIDP, and RADI.</t>
          <t>The ROOT tag <bcp14>MUST</bcp14> contain a 32 byte value of a Merkle tree root as
described in <xref target="merkle-tree"/>.</t>
          <t>The MIDP tag value <bcp14>MUST</bcp14> be the timestamp of the moment of processing.</t>
          <t>The RADI tag value <bcp14>MUST</bcp14> be a uint32 representing the server's estimate
of the accuracy of MIDP in seconds. Servers <bcp14>MUST</bcp14> ensure that the true
time is within (MIDP-RADI, MIDP+RADI) at the time they transmit the
response message.</t>
          <t>The value of the RADI tag <bcp14>MUST</bcp14> be at least 3 seconds. Otherwise leap seconds will impact the
observed correctness of Roughtime servers.</t>
        </section>
        <section anchor="cert">
          <name>CERT</name>
          <t>The CERT tag contains a public-key certificate signed with the
server's long-term key. Its value is a Roughtime message with the tags
DELE and SIG, where SIG is a signature over the DELE value. The
context string used to generate SIG <bcp14>MUST</bcp14> be "RoughTime v1 delegation
signature--".</t>
          <t>The DELE tag contains a delegated public-key certificate used by the
server to sign the SREP tag. Its value is a Roughtime message with the
tags MINT, MAXT, and PUBK. The purpose of the DELE tag is to enable
separation of a long-term public key from keys on devices exposed to
the public Internet.</t>
          <t>The MINT tag is the minimum timestamp for which the key in PUBK is
trusted to sign responses. MIDP <bcp14>MUST</bcp14> be more than or equal to MINT for
a response to be considered valid.</t>
          <t>The MAXT tag is the maximum timestamp for which the key in PUBK is
trusted to sign responses. MIDP <bcp14>MUST</bcp14> be less than or equal to MAXT for
a response to be considered valid.</t>
          <t>The PUBK tag contains a temporary 32 byte Ed25519 public key which is
used to sign the SREP tag.</t>
        </section>
        <section anchor="indx">
          <name>INDX</name>
          <t>The INDX tag value is a uint32 determining the position of NONC in the
Merkle tree used to generate the ROOT value as described in
<xref target="merkle-tree"/>.</t>
        </section>
      </section>
      <section anchor="merkle-tree">
        <name>The Merkle Tree</name>
        <t>A Merkle tree is a binary tree where the value of each non-leaf node
is a hash value derived from its two children. The root of the tree is
thus dependent on all leaf nodes.</t>
        <t>In Roughtime, each leaf node in the Merkle tree represents the nonce
in one request. Leaf nodes are indexed left to right, beginning with
zero.</t>
        <t>The values of all nodes are calculated from the leaf nodes and up
towards the root node using the first 32 bytes of the output of the
SHA-512 hash algorithm <xref target="RFC6234"/>. For leaf nodes, the byte 0x00 is
prepended to the nonce before applying the hash function. For all
other nodes, the byte 0x01 is concatenated with first the left and
then the right child node value before applying the hash function.</t>
        <t>The value of the Merkle tree's root node is included in the ROOT tag
of the response.</t>
        <t>The index of a request's nonce node is included in the INDX tag of the
response.</t>
        <t>The values of all sibling nodes in the path between a
request's nonce node and the root node are stored in the PATH tag so
that the client can reconstruct and validate the value in the ROOT tag
using its nonce. These values are each 32 bytes and are stored one
after the other with no additional padding or structure. The order in
which they are stored is described in the next section.</t>
        <section anchor="check-algorithm">
          <name>Root Value Validity Check Algorithm</name>
          <t>This section describes how to compute the root hash of the Merkle tree
from the values in the tags PATH, INDX, and NONC. The bits of INDX are
ordered from least to most significant. <tt>H(x)</tt> denotes the first 32
bytes of the SHA-512 hash digest of x and <tt>||</tt> denotes concatenation.</t>
          <t>The algorithm maintains a current hash value. At initialization, hash
is set to <tt>H(0x00 || nonce)</tt>. When no more entries remain in PATH, the
current hash is the hash of the Merkle tree. All remaining bits of
INDX <bcp14>MUST</bcp14> be zero at that time. Otherwise, let node be the next 32
bytes in PATH. If the current bit in INDX is 0 then <tt>hash = H(0x01 ||
node || hash)</tt>, else <tt>hash = H(0x01 || hash || node)</tt>.</t>
          <t>PATH is thus the siblings from the leaf to the root.</t>
        </section>
      </section>
      <section anchor="validity-of-response">
        <name>Validity of Response</name>
        <t>A client <bcp14>MUST</bcp14> check the following properties when it receives a
response. We assume the long-term server public key is known to the
client through other means.</t>
        <t>The signature in CERT was made with the long-term key of the server.</t>
        <t>The DELE timestamps and the MIDP value are consistent.</t>
        <t>The INDX and PATH values prove NONC was included in the Merkle tree
with value ROOT using the algorithm in <xref target="check-algorithm"/>.</t>
        <t>The signature of SREP in SIG validates with the public key in DELE.</t>
        <t>A response that passes these checks is said to be valid. Validity of a
response does not prove the time is correct, but merely that the
server signed it, and thus promises that it began to compute the
signature at a time in the interval (MIDP-RADI, MIDP+RADI).</t>
      </section>
    </section>
    <section anchor="integration-into-ntp">
      <name>Integration into NTP</name>
      <t>We assume that there is a bound PHI on the frequency error in the
clock on the machine. Given a measurement taken at a local time t, we
know the true time is in (t-delta-sigma, t-delta+sigma). After d
seconds have elapsed we know the true time is within
(t-delta-sigma-d<em>PHI, t-delta+sigma+d</em>PHI). A simple and effective way
to mix with NTP or PTP discipline of the clock is to trim the observed
intervals in NTP to fit entirely within this window or reject
measurements that fall to far outside. This assumes time has not been
stepped. If the NTP process decides to step the time, it <bcp14>MUST</bcp14> use
Roughtime to ensure the new truetime estimate that will be stepped to
is consistent with the true time.  Should this window become too
large, another Roughtime measurement is called for. The definition of
"too large" is implementation defined. Implementations <bcp14>MAY</bcp14> use other,
more sophisticated means of adjusting the clock respecting Roughtime
information. Other applications such as X.509 verification may wish to
apply different rules.</t>
    </section>
    <section anchor="grease">
      <name>Grease</name>
      <t>Servers <bcp14>SHOULD</bcp14> send back a fraction of responses that are syntactically
invalid or contain invalid signatures as well as incorrect
times. Clients <bcp14>MUST</bcp14> properly reject such responses. Servers <bcp14>MUST NOT</bcp14>
send back responses with incorrect times and valid signatures. Either
signature <bcp14>MAY</bcp14> be invalid for this application.</t>
    </section>
    <section anchor="roughtime-clients">
      <name>Roughtime Clients</name>
      <section anchor="necessary-configuration">
        <name>Necessary configuration</name>
        <t>To carry out a Roughtime measurement, a client must be equipped with a
list of servers, a minimum of three of which are operational, not run
by the same parties. It must also have a means of reporting to the
provider of such a list, such as an OS vendor or software vendor, a
failure report as described below.</t>
      </section>
      <section anchor="measurement-sequence">
        <name>Measurement sequence</name>
        <t>The client randomly permutes three servers from the list, and
sequentially queries them. The first probe uses a NONC that is
randomly generated. The second query uses <tt>H(resp || rand)</tt> where rand
is a random 32 byte value and resp is the entire response to the first
probe. The third query uses <tt>H(resp || rand)</tt> for a different 32 byte
value.  If the times reported are consistent with the causal ordering,
and the delay is within a system provided parameter, the measurement
succeeds. If they are not consistent, there has been malfeasance and
the client <bcp14>SHOULD</bcp14> store a report for evaluation, alert the operator,
and make another measurement.</t>
      </section>
      <section anchor="malfeasence-reporting">
        <name>Malfeasence reporting</name>
        <t>A malfeasance report is a JSON <xref target="RFC8259"/> object with keys "nonces",
containing an array of the rand values as base64-encoded <xref target="RFC4648"/>
strings, and "responses", containing an array of the responses as
base64-encoded strings.</t>
        <t>Malfeasence reports <bcp14>MAY</bcp14> be transported by any means to the relevant
vendor or server operator for discussion. A malfeasance report is
cryptographic proof that the responses arrived in that order, and can
be used to demonstrate that at least one server sent the wrong time.
The venues for sharing such reports and what to do about them are
outside the scope of this document.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Since the only supported signature scheme, Ed25519, is not quantum
resistant, the Roughtime version described in this memo will not
survive the advent of quantum computers.</t>
      <t>Maintaining a list of trusted servers and adjudicating violations of
the rules by servers is not discussed in this document and is
essential for security. Roughtime clients <bcp14>MUST</bcp14> regularly update their
view of which servers are trustworthy in order to benefit from the
detection of misbehavior.</t>
      <t>Validating timestamps made on different dates requires knowledge of
leap seconds in order to calculate time intervals correctly.</t>
      <t>Servers carry out a significant amount of computation in response to
clients, and thus may experience vulnerability to denial of service
attacks.</t>
      <t>This protocol does not provide any confidentiality. Given the nature
of timestamps, such impact is minor.</t>
      <t>The compromise of a PUBK's private key, even past MAXT, is a problem
as the private key can be used to sign invalid times that are in the
range MINT to MAXT, and thus violate the good behavior guarantee of
the server.</t>
      <t>Servers <bcp14>MUST NOT</bcp14> send response packets larger than the request packets
sent by clients, in order to prevent amplification attacks.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This protocol is designed to obscure all client identifiers. Servers
necessarily have persistent long-term identities essential to
enforcing correct behavior. Generating nonces in a nonrandom manner
can cause leaks of private data or enable tracking of clients as they
move between networks.</t>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>It is expected that clients identify a server by its long-term public
key. In multi-tenancy environments, where multiple servers may be
listening on the same IP or port space, the protocol is designed so
that the client indicates which server it expects to respond. This is
done with the SRV tag.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="service-name-and-transport-protocol-port-number-registry">
        <name>Service Name and Transport Protocol Port Number Registry</name>
        <t>IANA is requested to allocate the following entry in the Service
Name and Transport Protocol Port Number Registry:</t>
        <artwork><![CDATA[
  Service Name: Roughtime

  Transport Protocol: tcp,udp

  Assignee: IESG <iesg@ietf.org>

  Contact: IETF Chair <chair@ietf.org>

  Description: Roughtime time synchronization

  Reference: [[this memo]]

  Port Number: [[TBD1]], selected by IANA from the User Port range
]]></artwork>
      </section>
      <section anchor="roughtime-version-registry">
        <name>Roughtime Version Registry</name>
        <t>IANA is requested to create a new registry entitled "Roughtime
 Version Registry".  Entries shall have the following fields:</t>
        <t>Version ID (<bcp14>REQUIRED</bcp14>): a 32-bit unsigned integer</t>
        <t>Version name (<bcp14>REQUIRED</bcp14>): A short text string naming the version being
identified.</t>
        <t>Reference (<bcp14>REQUIRED</bcp14>): A reference to a relevant specification
document.</t>
        <t>The policy for allocation of new entries <bcp14>SHOULD</bcp14> be: IETF Review.</t>
        <t>The initial contents of this registry shall be as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Version ID</th>
              <th align="left">Version name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0</td>
              <td align="left">Reserved</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="left">0x1</td>
              <td align="left">Roughtime version 1</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="left">0x2-0x7fffffff</td>
              <td align="left">Unassigned</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">0x80000000-0xffffffff</td>
              <td align="left">Reserved for Private</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="left"> </td>
              <td align="left">or Experimental use</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="roughtime-tag-registry">
        <name>Roughtime Tag Registry</name>
        <t>IANA is requested to create a new registry entitled "Roughtime Tag
Registry".  Entries <bcp14>SHALL</bcp14> have the following fields:</t>
        <t>Tag (<bcp14>REQUIRED</bcp14>): A 32-bit unsigned integer in hexadecimal format.</t>
        <t>ASCII Representation (<bcp14>REQUIRED</bcp14>): The ASCII representation of the tag
in accordance with <xref target="type-tag"/> of this memo, if applicable.</t>
        <t>Reference (<bcp14>REQUIRED</bcp14>): A reference to a relevant specification
document.</t>
        <t>The policy for allocation of new entries in this registry <bcp14>SHOULD</bcp14> be:
Specification Required.</t>
        <t>The initial contents of this registry <bcp14>SHALL</bcp14> be as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Tag</th>
              <th align="left">ASCII Representation</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x00474953</td>
              <td align="left">SIG</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x00565253</td>
              <td align="left">SRV</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x00524556</td>
              <td align="left">VER</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x434e4f4e</td>
              <td align="left">NONC</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x454c4544</td>
              <td align="left">DELE</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x48544150</td>
              <td align="left">PATH</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x49444152</td>
              <td align="left">RADI</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x4b425550</td>
              <td align="left">PUBK</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x5044494d</td>
              <td align="left">MIDP</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x50455253</td>
              <td align="left">SREP</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x544e494d</td>
              <td align="left">MINT</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x544f4f52</td>
              <td align="left">ROOT</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x54524543</td>
              <td align="left">CERT</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x5458414d</td>
              <td align="left">MAXT</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x58444e49</td>
              <td align="left">INDX</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x5a5a5a5a</td>
              <td align="left">ZZZZ</td>
              <td align="left">[[this memo]]</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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>
        <reference anchor="RFC20">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="RFC791">
          <front>
            <title>Internet Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="791"/>
          <seriesInfo name="DOI" value="10.17487/RFC0791"/>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC6234">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC738">
          <front>
            <title>Time server</title>
            <author fullname="K. Harrenstien" initials="K." surname="Harrenstien"/>
            <date month="October" year="1977"/>
          </front>
          <seriesInfo name="RFC" value="738"/>
          <seriesInfo name="DOI" value="10.17487/RFC0738"/>
        </reference>
        <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. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5905"/>
          <seriesInfo name="DOI" value="10.17487/RFC5905"/>
        </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>
      </references>
    </references>
    <?line 673?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Aanchal Malhotra and Adam Langley authored early drafts of this memo.
Thomas Peterson corrected multiple nits. Peter Löthberg, Tal Mizrahi,
Ragnar Sundblad, Kristof Teichel, and the other members of the NTP
working group contributed comments and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
X7v8Xy3q9mXRagAA

-->

</rfc>
