<?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.15 (Ruby 3.3.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ntp-roughtime-10" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title>Roughtime</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ntp-roughtime-10"/>
    <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="June" day="11"/>
    <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 of type 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 may also be listed in this document 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. 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 uint64 count of seconds since 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. 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. 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. 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>
        <t>All lengths are lengths in bytes.</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 and SHOIULD include the
tag SRV. Tags other than NONC and VER <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. Its value <bcp14>SHOULD</bcp14> be all zeros. 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</bcp14> not 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-lived, 32-byte Ed25519 public key and H is SHA512 truncated to
the first 32 bytes.</t>
        </section>
        <section anchor="zzzz">
          <name>ZZZZ</name>
          <t>To expand the response to the minimum required length,
the ZZZZ tag is used. 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, then proceed with that key. Othwerise, if the server
has multipile 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 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 is 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>We describe 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>Our algorithm maintains a current hash value. At initialization, hash
is set to <tt>H(0x00 || nonce)</tt>. If 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 <xref target="RFC4648"/> encoded
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>
      <section anchor="multi-tenancy">
        <name>Multi-tenancy</name>
        <t>It is expected that clients identify a server by its long-term public
key. Because 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>
    <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>OPTIONAL</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">0x5a5a5a5a</td>
              <td align="left">ZZZZ</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x00474953</td>
              <td align="left">SIG</td>
              <td align="left">[[this memo]]</td>
            </tr>
            <tr>
              <td align="right">0x00535256</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>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <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 670?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>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:
H4sIAAAAAAAAA+1d6XYbOXb+j6dA5B9jT5NqSabctk7PorbdthJbUiS5Zyad
PjFYBZI1roVTiyS27TxLniIPkLxY7ncvgEKRtFt9Jn0yJ4lmkVgsABcXd1/g
8Xis2qzN7ZHeuai6+aLNCrujEtPaeVWvjnRWziql0iopTUEvpbWZtePMtrNx
2S7HtR8y3t9TTTctsqbJqrJdLendk+dX32p9T5u8qWj6rEzt0tL/le3OSO/Y
NGurOjM5Ppwcf0O/qpr+urj6dkeVXTG19ZFKCY4jlVRlY8uma450W3dWXR/p
h8rU1tCsJ2Vr69K2O+qmqt/NCaAlPT21LT7qKwJNn9dVWyVV3uyod3ZFz9Mj
pce6tLetntvS1qYlmPGoK7OkqvnPZmnqd3lWznWaNW2dTbvWpjq36dzW6tqW
HcGl9U+tp7WgYucP9C0me4EBeD7P2kU3pW9upvmXPRoZvztKma5dVDXgpHe1
nnV5Lgew8wfTNlWpX5k03eHvqnpuyuxH3sSRPn5nCpPpK5ssyiqv5plt+C1L
T3Msx8OnOQ3//RzPdpOq2NmyzmtTJ12jn5myMXVmt61Fuy6rNJ6+4EG/T92g
3cbyt12dHelF2y6boy+/rOokS3dppi/36GdM/9sfPzmYPBrvHTx6qFRZ1QXN
f034VSC+/pMaj8faTOk0TNIqdbXIGk2E2RVEUXReNslmtFsdyJhO0eilOwzd
LkyrTVY0uq20SRaZvbaKEa/55WZVJou68rvT9HWpaXmd5Bkt0OgbOrGqoznK
lc5Sa3Q10zc0qeLhWauzZtcBWWRpmlul7mkiz7pKu4QpTF1tW4h2YRui75Z4
AbB5itaNTQhx7UqbhhBbrlR44DfVEDCprtqFrbVZLvMs4SkbXdu/dFm9sZZ6
//53F98+/erh448fd/UbYLftSuKxfDWi/aX0WxOT5tWKaL1fpOmSBQGhaB29
ldL1/dOr8wdaZj98snf48aPOTfIu2piHXc2sabvaNiOGnbFc2hvaQL9enr1b
W+jS75wWunzgtvH4yX5YqCB6J8ps5HghLGj3fOQAurH1ta0bPbULQ6dOPF7b
pM1Xu/rbrgb2iqq2o3DShVk58AGd0VPTZEk4c3qfj5zeJxHUgqunVdWCLJdL
fKKNTHNbNLsRKdIhZ3SuJP1SALikJbNWpfY6SyyDXE1bk2ExIcloMU1br0Hi
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
/w2jpCqK/pqgbo5KJbmz+L8AmHKMTQ1qAAA=

-->

</rfc>
