<?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.2 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-joseph-tls-batch-signatures-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="joseph-tls-batch-signatures">Batched Signatures</title>
    <seriesInfo name="Internet-Draft" value="draft-joseph-tls-batch-signatures-00"/>
    <author initials="D." surname="Joseph" fullname="David Joseph">
      <organization>SandboxAQ</organization>
      <address>
        <email>dj@sandboxaq.com</email>
      </address>
    </author>
    <author initials="D." surname="Connolly" fullname="Deirdre Connolly">
      <organization>SandboxAQ</organization>
      <address>
        <email>deirdre.connolly@sandboxquantum.com</email>
      </address>
    </author>
    <author initials="C." surname="Aguilar-Melchor" fullname="Carlos Aguilar-Melchor">
      <organization>SandboxAQ</organization>
      <address>
        <email>carlos.aguilar@sandboxaq.com</email>
      </address>
    </author>
    <date year="2023" month="November" day="05"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 113?>

<t>This document proposes a construction for batch signatures where a single,
potentially expensive, "base" digital signature authenticates a Merkle tree
constructed from many messages.</t>
      <t>Discussion of this work is encouraged to happen on the IETF TLSWG mailing list
tls@ietf.org or on the GitHub repository which contains the draft:
https://github.com/PhDJsandboxaq/draft-joseph-batch-signatures</t>
    </abstract>
  </front>
  <middle>
    <?line 123?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The computational complexity of unkeyed and symmetric cryptography is known
to be significantly lower than asymmetric cryptography. Indeed, hash functions,
stream or block ciphers typically require between a few cycles <xref target="AES-NI"/> to
a few hundred cycles <xref target="GK12"/>, whereas key establishment
and digital signature primitives require between tens of thousands to hundreds
of millions of cycles <xref target="SUPERCOP"/>. In situations where a substantial
volume of signatures must be handled -- e.g. a Hardware Security Module (HSM)
renewing a large set of short-lived certificates or a load balancer terminating
a large number of TLS connections per second -- this may pose serious limitations
on scaling these and related scenarios.</t>
      <t>These challenges are amplified by upcoming public-key cryptography standards: in
July 2022, the US National Institute of Standards and Technology (NIST) announced
four algorithms for post-quantum cryptography (PQC) standardisation. In particular,
three digital signature algorithms -- Dilithium <xref target="CRYSTALS-DILITHIUM"/>,
Falcon <xref target="FALCON"/> and SPHINCS <xref target="SPHINCS"/> -- were
selected, and migration from current standards to these new algorithms is already
underway <xref target="NSM10"/>. One of the key issues when considering migrating to PQC is
that the computational costs of the new digital signature algorithms are significantly
higher than those of ECDSA; the fastest currently-deployed primitive for signing.
This severely impacts the ability of systems to scale and inhibits their migration
to PQC, especially in higher-throughput settings.</t>
    </section>
    <section anchor="Preliminaries">
      <name>Preliminaries</name>
      <section anchor="Preliminaries-signatures">
        <name>Signatures</name>
        <ul spacing="normal">
          <li>
            <t><strong>DSA</strong> Digital Signature Algorithm, a public key cryptography primitive
consisting of a triple of algorithms <em>KeyGen</em>, <em>Sign</em>, <em>Verify</em> whereby:
            </t>
            <ul spacing="normal">
              <li>
                <t><em>KeyGen(k)</em> outputs a keypair <em>sk, pk</em> where <em>k</em> is a security parameter</t>
              </li>
              <li>
                <t><em>Sign(sk, msg) = s</em></t>
              </li>
              <li>
                <t><em>Verify(pk, s, msg) = b</em>. When <em>b=1</em>, the result is ACCEPT which occurs
on receipt of message, correctly signed with the secret key <em>sk</em> corresponding
to <em>pk</em>. Otherwise the result is REJECT when <em>b=0</em>.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="Preliminaries-hashes">
        <name>Hash functions</name>
        <t>In this work we consider <em>tweakable</em> hash functions. These are keyed hash functions
that take an additional input which can be thought of as a domain separator (while
the key or public parameter serves as a separator between users). Tweakable hash
functions allow us to tightly achieve target collision resistance even in multi-target
settings where an adversary wins when they manage to attack one out of many targets.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Keyed Hash function</strong> A keyed hash function is one that outputs a hash that depends
both on a message <em>msg</em> and a key <em>v</em> that is shared by both the hash generator and the
hash validator. It is easiest to compute via prepending the key to the message before
computing the hash <em>h &lt;-- H(v | msg)</em>. Let <em>Hv</em> denote the family of hash functions
keyed with <em>v</em>.</t>
          </li>
        </ul>
        <section anchor="Preliminaries-hash-properties">
          <name>Hash function properties</name>
          <ul spacing="normal">
            <li>
              <t>Collision resistance - no two inputs <em>x1, x2</em> should map to the same output hash
(regardless of choice of key in the case of a keyed hash).</t>
            </li>
            <li>
              <t>Preimage resistance - it should be difficult to guess the input value <em>x</em> for a hash
function given only its output <em>H(x)</em>.</t>
            </li>
            <li>
              <t>Second preimage resistance - given an input <em>x1</em>, it should be difficult to find
another distinct input <em>x2</em> such that <em>H(x1)=H(x2)</em>.</t>
            </li>
            <li>
              <t>Target collision resistance - choose input <em>x1</em>. Then given a key <em>v</em>, find <em>x2</em>
 such that <em>Hv(x1) = Hv(x2)</em>.</t>
            </li>
          </ul>
          <t>Target collision resistance is a weaker requirement than collision resistance but is
sufficient for signing purposes. Tweakable hash functions enable us to tightly achieve
TCR even in multi-target settings where an adversary can attack one out of many targets.
Specifically, the property achieved in the following is <em>single-function multi-target
collision resistance</em> (SM-TCR) which is described more formally in <xref target="AABBHHJM23"/>.</t>
        </section>
        <section anchor="Preliminaries-tweakable-hashes">
          <name>Tweakable Hash functions</name>
          <t>One form of keyed hash function is a tweakable hash function, which enables one to obtain SM-TCR:</t>
          <ul spacing="normal">
            <li>
              <t><strong>Tweakable Hash functions</strong> A <em>tweakable hash function</em> is a tuple of algorithms <em>H=(KeyGen, Eval)</em> such that:
              </t>
              <ul spacing="normal">
                <li>
                  <t><em>KeyGen</em> takes the security parameter <em>k</em> and outputs a (possibly empty) public
parameter <em>p</em>. We write <em>p &lt;-- KeyGen(k)</em>.</t>
                </li>
                <li>
                  <t><em>Eval</em> is deterministic and takes public parameters <em>p</em>, a tweak <em>t</em>, an input <em>msg</em>
in <em>[0,1]^m</em> and returns a hash value <em>h</em>. We write <em>h &lt;-- Eval(p,t,msg)</em> or
simply <em>h &lt;-- H(p,t,msg)</em>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="motivation">
        <name>Motivation for batching messages before signing</name>
        <t>Batch signing enables the scaling of slow algorithms by signing large batches of
messages simultaneously. This comes at a relatively low latency cost, and significant
throughput improvements. These advantages are particularly pertinent when considering
the use of post-quantum signatures, such as those being standardised by NIST at
the time of writing. In some applications, the amount of data that needs to be sent
can be reduced in addition; namely, if a given entity (is aware that it) receives
multiple signatures from the same batch. In this case, sending the signed root
multiple times is redundant and we can asymptotically reduce the amount of
received information to a few hashes per message.</t>
      </section>
      <section anchor="scope">
        <name>Scope</name>
        <t>This document describes a construction for batch signatures based upon a Merkle tree
design. The total signature consists of a signature of the root of the Merkle tree,
as well as the sibling path of the individual message. We discuss the applicability
of such signatures to various protocols, but only at a high level. The document describes
a scheme which enables smaller signatures than outlined in <xref target="BEN20"/> by relying not
on hash collision resistance, but instead on target collision resistance, however for
the security proofs the reader should see <xref target="AABBHHJM23"/>.</t>
      </section>
    </section>
    <section anchor="construction">
      <name>Batch signature construction</name>
      <section anchor="construction-batch-signature-definition">
        <name>Batch signature definition</name>
        <t>We define a batch signature as a triple of algorithms
- <strong>Batch signature</strong> a batch signature scheme is comprised of <em>KeyGen</em>, <em>BSign</em>, <em>Verify</em> whereby:
  - <em>KeyGen(k)</em> outputs a keypair <em>sk, pk</em> where <em>k</em> is a security parameter
  - <em>BSign(sk, M)</em> the batch signing algorithm takes as input a list of messages <em>M = {msg-i}</em>
    and outputs a list of signatures <em>S={sig-i}</em>. We write <em>S &lt;-- BSign(sk,M)</em>
  - PVerify(pk, sig, msg)<em>. We call the verification _PVerify</em> to represent Path Verification,
    because in the construction outlined below, verification involves an extra step of verifying
    a sibling path, which <em>Verify</em> in the ordinary DSA setting does not do.</t>
      </section>
      <section anchor="construction-merkle-tree">
        <name>Merkle tree batch signature</name>
        <t>Our construction relies on a Merkle tree. When addressing nodes in a Merkle tree of height <em>h</em>
with <em>N</em> leaves, we may label nodes and leaves in the tree by their position: <em>T[i,k]</em> is the
<em>i</em>-th node at height <em>k</em>, counting from left to right and from bottom upwards (i.e. leaves are
on height <em>0</em> and the root is on height <em>h</em>. We illustrate this in <xref target="fig-merkle-tree"/>.</t>
        <t>Let <em>Sig=(KeyGen, Sign, Verify)</em> be a DSA as defined in <xref target="Preliminaries-signatures"/>, let <em>thash</em>
be a tweakable hash function as defined in <xref target="Preliminaries-tweakable-hashes"/>. We define our batch
signature scheme  <em>BSig = (KeyGen, BSign, BVerify</em> with <em>KeyGen := Sig.KeyGen</em> and <em>BSign, Verify</em>
as in <xref target="construction-batch-signature-definition"/> respectively.</t>
        <t>Here we describe the case of binary Merkle trees. In the case where <em>N</em> is not a power of <em>2</em>, one
can pad the tree by repeating leaves, or else continue with an incomplete tree.</t>
      </section>
      <section anchor="construction-signing">
        <name>Signing</name>
        <t><em>BSign(sk, M=[msg-0,...,msg-N-1])</em> where <em>N=2^n</em>. We first treat the case that <em>N</em> is a power of
<em>2</em>, and then consider incomplete trees using standard methods.</t>
        <section anchor="construction-tree">
          <name>Tree computation</name>
          <ul spacing="normal">
            <li>
              <t><strong>Initialize tree</strong> <em>T[ ]</em>, which is indexed by the level, and then the row index, e.g. <em>T[3,5]</em>
is the fifth node on level 3 of <em>T</em>. Height <em>h &lt;-- log2(N)</em></t>
            </li>
            <li>
              <t><strong>Tree identifier</strong> Sample a tree identifier <em>id &lt;--$ {0,1}^k</em></t>
            </li>
            <li>
              <t><strong>Generate leaves</strong> For leaf <em>i in [0,...,N-1]</em>, sample randomness <em>r-i &lt;--$ {0,1}^k</em>. Then set
<em>T[0,i] = H(id, 0, i, r-i, msg-i).</em></t>
            </li>
            <li>
              <t><strong>Populate tree</strong> For levels <em>l in [1,..., h]</em> compute level <em>l</em> from level <em>l-1</em> as follows:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Initialize level <em>l</em> with half as many elements as level <em>l-1</em>.</t>
                </li>
                <li>
                  <t>For node <em>j</em> on level <em>l</em>, set <em>left=T[l-1, 2j]</em> and <em>right=T[l-1, 2j+1]</em></t>
                </li>
                <li>
                  <t><em>id</em> is the public parameter, <em>(1, l, j)</em> is the tweak.</t>
                </li>
                <li>
                  <t><em>T[l, j] &lt;-- H(id, 1, l, j, left, right)</em></t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Root</strong> set <em>root &lt;-- T[h,0]</em></t>
            </li>
          </ul>
        </section>
        <section anchor="construction-signature">
          <name>Signature construction</name>
          <ul spacing="normal">
            <li>
              <t><strong>Sign the root</strong> Use the base DSA to sign the root of the Merkle tree <em>rootsig &lt;-- Sign(sk, id, root, N)</em></t>
            </li>
            <li>
              <t><strong>Sibling path</strong> For each leaf: The sibling path is an array of <em>h-1</em> hashes. Compute the sibling path as follows:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Initialize <em>path-i &lt;-- []</em></t>
                </li>
                <li>
                  <t>For <em>l in [0, ..., N-1]</em>, set <em>j &lt;--floor(i / 2^l)</em>. If <em>j mod 2 = 0</em> then <em>path-i[l]=T[l,j+1]</em>, else <em>path-i[l]=T[l,j-1]</em></t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Generate batch signatures</strong> <em>bsig-i &lt;-- (id, N, sig, i, r-i, path-i)</em></t>
            </li>
            <li>
              <t><strong>Return batch of signatures</strong> batch signatures are {bsig-1, ..., bsig-N}</t>
            </li>
          </ul>
          <t><xref target="fig-merkle-tree"/> illustrates the construction of the Merkle tree and the signature of the root.</t>
          <figure anchor="fig-merkle-tree">
            <name>Merkle tree batch signature construction</name>
            <artwork><![CDATA[
  lvl3=root         (T30)--DSA--> sig
                     / \
  lvl2        T20----   ----T21
              /\             /\
             /  \           /  \
  lvl2    T10    T11     T12    T13
          /\     /\      /\      /\
         /  \   /  \    /  \    /  \
  lvl1 T00 T01 T02 T03 T04 T05 T06 T07
       |    |   |   |   |   |   |   |
       |            |               |
     H(_) ... H(id,0,3,r3,msg3)  ...H(_)

]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="construction-verification">
        <name>Verification</name>
        <t>Verification proceeds by first reconstructing the root hash via the leaf information (public parameters, tweak, message)
and iteratively hashing with the nodes provided in the sibling path. Next the base verification algorithm
is called to verify the base DSA signature of the root.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Generate leaf hash</strong> Get hash from public parameter, tweak, and message <em>h &lt;-- H(id, 0, i, r, msg)</em>.</t>
          </li>
          <li>
            <t><strong>Reconstruct root</strong> Set <em>l=0</em>. For <em>l in [ 1, ..., h]</em> set <em>j &lt;-- floor(i/2^l)</em>.
            </t>
            <ul spacing="normal">
              <li>
                <t>If <em>j mod 2 = 0</em>: set <em>h &lt;-- H(id, 1, l, j, h, path[l])</em>.</t>
              </li>
              <li>
                <t>If <em>j mod 2 = 1</em>: set <em>h &lt;-- H(id, 1, l, j, path[l], h)</em>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Verify root</strong> Return <em>Verify(pk, sig, h)</em>.</t>
          </li>
        </ul>
        <!-- Hybrid?  Can just do any other hybrid construction scheme, have BSign just call that internally as S.Sign, and S.Verify. We should consider the separability concerns etc though. -->
<!-- How are tree id's generated in a cross-instantiation-secure way? Are we worried about collisions? λ only ranges up to 256. -->
<!-- Maybe domain separate the tree hash function H with a label prefix before the rest -->
<!-- How does this differ from Merkle Tree Certificates? 'It has a merkle tree in it' -->

</section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>A reduction in certificate sizes is proposed by a new type of
CA (certificate authority) which would exclusively sign a new type
of batch oriented certificates.  Such a CA would only be used together
with a Certificate Transparency log, which changes the usual required
flows for authentication. The benefits obtained in certificate size and
verification/signature costs are significant. It also implies that the
main criterion for being on a same batch are: being signed by the same CA,
and being signed roughly at the same time.</t>
      <section anchor="correctness">
        <name>Correctness</name>
        <t>Correctness can be broken down into correctness of the base DSA, and correctness of the Merkle tree.
Correctness is considered a security property, and is generally proven for each DSA, so we only need
to demonstrate correctness of the Merkle tree root. The Merkle proof assures that a message is a leaf
at a given index or address, in the tree identified by <em>id</em>, and nothing more.</t>
        <t>Hash functions are symmetric and therefore deterministic in nature, therefore, given the correct
sibling path as part of the signer's signature, will generate the Merkle tree root correctly. Given
an accepting (message, signature) pair, so long as one uses a hash function that provides second
preimage resistance (from which the tweakable hash then provides SM-TCR), this guarantees that - except
with negligible probability - the proof must be valid only for the message provided.</t>
      </section>
      <section anchor="dom-sep">
        <name>Domain separation</name>
        <t>Our construction uses tweakable hashfunctions which take as input a public parameter <em>id</em>, a tweak <em>t</em>,
and a message <em>msg</em>. The public parameter domain separates between Merkle trees used in the same
protocol. In <xref target="BEN20"/> it is suggested that TLS context strings are used to prevent cross-protocol
attacks, however we note here that <em>msg</em>, which is the full protocol transcript up to that point,
includes such protocol context strings. Therefore domain separation is handled implicitly. However
in an idea world all protocols would agree on a uniform approach to domain separation, and so we
invite comment on how to concretely handle this aspect.</t>
      </section>
      <section anchor="tcr-vs-cr">
        <name>Target collision resistance vs collision resistance</name>
        <t>Instead of collision resistance, relying on the weaker assumption of TCR, and more specifically SM-TCR,
increases the attack complexity of finding a forgery and breaking the scheme. The result is that
smaller hash outputs are required to achieve an equivalent security level. This key modification
versus <xref target="BEN20"/> thus provides smaller signatures or higher security for the same sized signatures.</t>
        <t>The reduction in signature size is <em>(h-1) * d</em> where <em>h</em> is the tree height and <em>d</em> is the difference
between the hash output length based on SM-TCR and that based on collision resistance. Usually TCR
implies using, for example, 128b digests to achieve 128b security, whereas basing on CR would require
256b digests. This change therefore in essence halves the size of the Merkle tree proofs.</t>
      </section>
    </section>
    <section anchor="pqc">
      <name>Post-quantum and hybrid signatures</name>
      <t><strong>Digital signatures</strong> The transition to post-quantum cryptography (PQC) coincides with increasing demands
on performance and throughput. Post-quantum signatures suffer worse performance both on computation and
public key/signature sizes versus their quantum-vulnerable counterparts which are based on elliptic curve
cryptography and RSA. As a result, techniques to boost performance are especially relevant in this case.
In <xref target="pqc-signature-sizes"/> one can see that the extra size cost due to the sibling path is roughly
independent of the algorithm used (therefore relatively much smaller for PQC).</t>
      <t><strong>Hash functions</strong> In contrast to DSAs, Hash functions are purely symmetric cryptography which is weakened
but not broken by quantum computers. Therefore the Merkle tree construction is not affected in the
post-quantum era, other than a doubling of parameters (in the worst case) to achieve the same security level.</t>
      <section anchor="pqc-signature-sizes">
        <name>Signature sizes</name>
        <t>In <xref target="Table1"/> one can see the size of a batch signature which signs 16 or 32 transcripts, relative to the
size of the underlying primitive. For post-quantum schemes the overhead in size is relatively small due
to the much larger sizes of the base DSAs.</t>
        <figure anchor="Table1">
          <name>Batch signature sizes</name>
          <artwork><![CDATA[
+--------------------+-----+------+-------+----+--------+
|       Scheme       |  k  | |vk| | |sig| | N  | |bsig| |
+--------------------+-----+------+-------+----+--------+
| ECDSA P256         | 128 |   64 |    64 | 32 |    180 |
| Dilithium2         | 128 | 1312 |  2420 | 32 |   2536 |
| Dilithium5         | 256 | 2592 |  4595 | 32 |   4823 |
| Falcon-512         | 128 |  897 |   666 | 16 |    766 |
| Falcon-1024        | 256 | 1793 |  1280 | 32 |   1508 |
| Falcon-512-fpuemu  | 128 |  897 |   666 | 16 |    766 |
| Falcon-1024-fpuemu | 256 | 1793 |  1280 | 16 |   1476 |
| SPHINGS+-128f      | 128 |   32 | 17088 | 16 |  17188 |
| SPHINCS-256f       | 256 |   64 | 49856 | 32 |  50084 |
+--------------------+-----+------+-------+----+--------+
]]></artwork>
        </figure>
      </section>
      <section anchor="hybrid-signatures-pqc-hybrid">
        <name>Hybrid signatures {pqc-hybrid}</name>
        <t>A likely mode of transition to PQC will be via 'hybrid mode', where data is protected independently via two
algorithms, one quantum-vulnerable (but well studied and understood) and one PQC algorithm. This is to
mitigate the risk of a complete break - classical or quantum - of a PQC algorithm. Breaking a hybrid scheme
should imply breaking <em>both</em> of the algorithms used.</t>
        <t>We do not discuss the details of such hybrid signatures or hybrid certificates in this document, but simply
state that so long as the hybrid scheme adheres to the API described above, the Batch signature Merkle tree
construction described in this document remains unaltered. Explicitly, the root is generated via the procedure
of <xref target="construction-tree"/>. Then the root is signed by the hybrid DSA, whose functions <em>KeyGen</em>, <em>Sign</em>, <em>Verify</em>
are constructed via some composition of <em>KeyGen</em>, <em>Sign</em>, <em>Verify</em> for a PQC algorithm and <em>KeyGen</em>, <em>Sign</em>,
<em>Verify</em> for some presently-used algorithm.</t>
      </section>
      <section anchor="privacy">
        <name>Privacy</name>
        <t>In <xref target="AABBHHJM23"/> two privacy notions are defined:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Batch Privacy</strong> can one cannot deduce whether two messages were signed in the same batch.</t>
          </li>
          <li>
            <t><strong>weak Batch Privacy</strong> for two messages signed in the same batch, if one is given the signature for one</t>
          </li>
          <li>
            <t>message, it does not leak any information about the other message, for which no signature is available.</t>
          </li>
        </ul>
        <t>The authors prove in <xref target="AABBHHJM23"/> that this construction achieves the weaker variant, but not full Batch
Privacy.</t>
      </section>
    </section>
    <section anchor="relationship-MTC">
      <name>Relationship to Merkle Tree Certificates</name>
      <t>A Merkle tree construction for TLS certificates <xref target="BEN23"/> is being developed at the time of writing, by the
same author of the original Merkle tree signing draft <xref target="BEN20"/>. The construction bears strong similarities
to the current proposal. In ordinary TLS certificates, a Certificate Authority (CA) signs a certificate which
asserts that a public key belongs to a given subscriber. In the Merkle tree construction, many certificates
are batched together using a similar Merkle tree construction to the one presented in this document. The CA
then signs only the root of the Merkle tree, and returns (root signature + sibling path) to the subscriber.</t>
      <t>A client verifies a server's identity by:</t>
      <ul spacing="normal">
        <li>
          <t>Verifying a server's signature: the server signs the TLS transcript up to that point with their private
key and the client verifies with the server's public key <em>pk</em>.</t>
        </li>
        <li>
          <t>Verifying that the public key belongs to the server by verifying the trusted CA's signatures certificate
which states that the server owns <em>pk</em>.
          </t>
          <ul spacing="normal">
            <li>
              <t>Doing this repeatedly in the case of certificate chains until reaching a root CA.</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>The document of <xref target="BEN23"/> relates specifically to signing certificates, the second bullet above, whereas the
constructions of <xref target="BEN20"/> and this document pertain to a server authenticating itself online, relating to
the first bullet above. The two have slightly different usecases, which both benefit from Merkle tree
constructions under different scenarios.</t>
      <t>Cases where Merkle tree certificates may be appropriate have certain properties:</t>
      <ul spacing="normal">
        <li>
          <t>Certificates are short-lived.</t>
        </li>
        <li>
          <t>Certificates are issued after a significant delay, e.g. around one hour.</t>
        </li>
        <li>
          <t>Batch sizes can be estimated to be up to 2^24 (based on unexpired number of certificates in certificate
transparency logs)</t>
        </li>
      </ul>
      <t>Cases where TLS batch signing may be appropriate differ slightly, for example:</t>
      <ul spacing="normal">
        <li>
          <t>High throughput servers and load balancers - in particular when rate of incoming signing requests exceeds
<em>(time * threads)</em> where <em>time</em> is the average time for a signing thread to generate a signature, and
<em>threads</em> is the number of available signing threads.</t>
        </li>
        <li>
          <t>In scenarios where the latency is not extremely sensitive: waiting for signatures to arrive before constructing
a Merkle tree incurs a small extra latency cost which is amortised by the significant extra throughput achievable.</t>
        </li>
        <li>
          <t>Batch sizes are likely to be smaller than the usecase for Merkle tree certificates. Batch sizes of 16 or 32 can
already improve throughput by an order of magnitude.</t>
        </li>
      </ul>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
    </section>
  </middle>
  <back>
    <references anchor="sec-informative-references">
      <name>Informative References</name>
      <reference anchor="AABBHHJM23" target="https://eprint.iacr.org/2023/492">
        <front>
          <title>Batch Signatures, Revisited</title>
          <author initials="" surname="Carlos Aguilar-Melchor">
            <organization/>
          </author>
          <author initials="" surname="Martin Albrecht">
            <organization/>
          </author>
          <author initials="" surname="Thomas Bailleux">
            <organization/>
          </author>
          <author initials="" surname="Nina Bindel">
            <organization/>
          </author>
          <author initials="" surname="James Howe">
            <organization/>
          </author>
          <author initials="" surname="Andreas Huelsing">
            <organization/>
          </author>
          <author initials="" surname="David Joseph">
            <organization/>
          </author>
          <author initials="" surname="Marc Manzano">
            <organization/>
          </author>
          <date year="2023"/>
        </front>
      </reference>
      <reference anchor="AES-NI" target="https://www.intel.cn/content/dam/develop/external/us/en/documents/10tb24-breakthrough-aes-performance-with-intel-aes-new-instructions-final-secure-165940.pdf">
        <front>
          <title>Breakthrough AES Performance with Intel AES New Instructions</title>
          <author initials="" surname="Kahraman Akdemir">
            <organization/>
          </author>
          <author initials="" surname="Martin Dixon">
            <organization/>
          </author>
          <author initials="" surname="Wajdi Feghali">
            <organization/>
          </author>
          <author initials="" surname="Patrick Fay">
            <organization/>
          </author>
          <author initials="" surname="Vinodh Gopal">
            <organization/>
          </author>
          <author initials="" surname="Jim Guilford">
            <organization/>
          </author>
          <author initials="" surname="Erdincand Ozturk">
            <organization/>
          </author>
          <author initials="" surname="Gil Wolrich">
            <organization/>
          </author>
          <author initials="" surname="Ronen Zohar">
            <organization/>
          </author>
          <date year="2010"/>
        </front>
      </reference>
      <reference anchor="BEN20" target="https://datatracker.ietf.org/doc/html/draft-ietf-tls-batch-signing-00#section-2">
        <front>
          <title>Batch Signing for TLS: draft-ietf-tls-batch-signing-00</title>
          <author initials="" surname="David Benjamin">
            <organization/>
          </author>
          <date year="2023"/>
        </front>
      </reference>
      <reference anchor="BEN23" target="https://datatracker.ietf.org/doc/draft-davidben-tls-merkle-tree-certs/">
        <front>
          <title>Merkle Tree Certificates for TLS</title>
          <author initials="" surname="David Benjamin">
            <organization/>
          </author>
          <date year="2023" month="September" day="08"/>
        </front>
      </reference>
      <reference anchor="CRYSTALS-DILITHIUM">
        <front>
          <title>CRYSTALS-Dilithium: A Lattice-Based Digital Signature Scheme</title>
          <author fullname="Léo Ducas" initials="L." surname="Ducas">
            <organization/>
          </author>
          <author fullname="Eike Kiltz" initials="E." surname="Kiltz">
            <organization/>
          </author>
          <author fullname="Tancrède Lepoint" initials="T." surname="Lepoint">
            <organization/>
          </author>
          <author fullname="Vadim Lyubashevsky" initials="V." surname="Lyubashevsky">
            <organization/>
          </author>
          <author fullname="Peter Schwabe" initials="P." surname="Schwabe">
            <organization/>
          </author>
          <author fullname="Gregor Seiler" initials="G." surname="Seiler">
            <organization/>
          </author>
          <author fullname="Damien Stehlé" initials="D." surname="Stehlé">
            <organization/>
          </author>
          <date month="February" year="2018"/>
        </front>
        <seriesInfo name="IACR Transactions on Cryptographic Hardware and Embedded Systems" value="pp. 238-268"/>
        <seriesInfo name="DOI" value="10.46586/tches.v2018.i1.238-268"/>
        <refcontent>Universitatsbibliothek der Ruhr-Universitat Bochum</refcontent>
      </reference>
      <reference anchor="FALCON">
        <front>
          <title>Fast Fourier Sampling over NTRU Lattices Digital Signature Standard</title>
          <author fullname="Dustin Moody" initials="D." surname="Moody">
            <organization>National Institute of Standards and Technology</organization>
          </author>
          <date year="2023"/>
        </front>
        <seriesInfo name="DOI" value="10.6028/nist.fips.206"/>
        <refcontent>National Institute of Standards and Technology</refcontent>
      </reference>
      <reference anchor="GK12">
        <front>
          <title>Parallelizing message schedules to accelerate the computations of hash functions</title>
          <author fullname="Shay Gueron" initials="S." surname="Gueron">
            <organization/>
          </author>
          <author fullname="Vlad Krasnov" initials="V." surname="Krasnov">
            <organization/>
          </author>
          <date month="September" year="2012"/>
        </front>
        <seriesInfo name="Journal of Cryptographic Engineering" value="vol. 2, no. 4, pp. 241-253"/>
        <seriesInfo name="DOI" value="10.1007/s13389-012-0037-z"/>
        <refcontent>Springer Science and Business Media LLC</refcontent>
      </reference>
      <reference anchor="NSM10" target="https://www.whitehouse.gov/briefing-room/statements-releases/2022/05/04/national-security-memorandum-on-promoting-united-states-leadership-in-quantum-computing-while-mitigating-risks-to-vulnerable-cryptographic-systems/">
        <front>
          <title>National Security Memorandum on Promoting United States Leadership in Quantum Computing While Mitigating Risks to Vulnerable Cryptographic Systems</title>
          <author initials="" surname="Shalanda D Young">
            <organization/>
          </author>
          <date year="2010" month="May" day="04"/>
        </front>
      </reference>
      <reference anchor="SPHINCS">
        <front>
          <title>The SPHINCS
            &lt;sup&gt;+&lt;/sup&gt;
            Signature Framework</title>
          <author fullname="Daniel J. Bernstein" initials="D." surname="Bernstein">
            <organization>University of Illinois at Chicago &amp;amp; Ruhr University Bochum, Chicago, IL, USA</organization>
          </author>
          <author fullname="Andreas Hülsing" initials="A." surname="Hülsing">
            <organization>Eindhoven University of Technology, Eindhoven, Netherlands</organization>
          </author>
          <author fullname="Stefan Kölbl" initials="S." surname="Kölbl">
            <organization>Cybercrypt, Copenhagen, Denmark</organization>
          </author>
          <author fullname="Ruben Niederhagen" initials="R." surname="Niederhagen">
            <organization>Fraunhofer SIT, Darmstadt, Darmstadt, Germany</organization>
          </author>
          <author fullname="Joost Rijneveld" initials="J." surname="Rijneveld">
            <organization>Radboud University, Nijmegen, Netherlands</organization>
          </author>
          <author fullname="Peter Schwabe" initials="P." surname="Schwabe">
            <organization>Radboud University, Nijmegen, Netherlands</organization>
          </author>
          <date month="November" year="2019"/>
        </front>
        <seriesInfo name="Proceedings of the 2019 ACM SIGSAC Conference on Computer and Communications" value="Security"/>
        <seriesInfo name="DOI" value="10.1145/3319535.3363229"/>
        <refcontent>ACM</refcontent>
      </reference>
      <reference anchor="SUPERCOP" target="https://bench.cr.yp.to/supercop.html">
        <front>
          <title>SUPERCOP: System for unified performance evaluation related to cryptographic operations and primitives.</title>
          <author initials="" surname="Daniel J Bernstein">
            <organization/>
          </author>
          <author initials="" surname="Tanja Lange">
            <organization/>
          </author>
          <date year="2018"/>
        </front>
      </reference>
    </references>
    <?line 470?>

<section anchor="related-work">
      <name>Related work</name>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA71c63Ibx3L+v08xsVJlUsaCAKgrE+UcipJF+Vi0jkjblUgy
arA7AFZc7MJ7AQjTOi+Wd8gz5evumd1ZAJSdpCqqokhg59LT05eve3o2DMOg
SqrUnKjnuormJlaXySzTVV2YMtCTSWFWJ+pTXprlPKzSMpxQq7Bs28R5lOkF
+seFnlbhF5qGg0EQ6wpNR4PRcTgchoOHQYQvZnmxOVFJNs2DIFkWJ6oq6rIa
DQZPB6Pg2mzWeRGfqNdZZYrMVOELmigIykpn8VineYYRN6BkmZyo91Ue9VSZ
F1VhpiX+2izoj49oXk8WSVkmeXa1WaLH65dX3waBrqt5XpwESoX4USCiPFEv
+uo7XgZ/Jat7oVdJ7H+dFzOdJb/pCiOeqEvQMslvTv/Oz8xCJyk48umvpXyv
f+1H+WJnlrM8y/I03fjzmKSIC9N99Gfmkn6YRvq5mX+tdVbVi93pz/rqdFYn
qS7CNyaNwAWPijNdpHm5t8GfoCXi3n0tvbd4ENA+Fwv0Xxni++np8+fn59+9
GR2f8BiVLmamOlHzqlqWJ0dHZlkkWdVPdFT0MfcRyc7Rg6cjaSyi+xXLrie5
PfXOrJIyqUz8FTds5Y4/tttO/0L723Hm7sXvtH2jiyrJ1GkKRYnm1f5GV/N8
oUsoWJKmpr7Z3+giybR6nmSxSfc3+A47U6rzfG32Pz/NsP+Y5rw2aZlks/2t
duR435Ii/Jf9prOc9uflZXjxev/erNfrPjbHpP0oO4LkVSarjmK9OIrNyqT5
8sjckM7q9Kguj0x2BFtRL9CmPBoOqsnoQQiu6etqXuT1bB5qmIilKVg6ssiE
66Sahzw8P8rMGp9K2IaIZK8Mp+BYGpYmwo6Hw0cPnz4Y9JfxtCsY3gS0FPW2
nUDRBGxWUn50Ydb41E7QlZzh4I8l5296XmiMrU6vY7NIviwzL5KbPNvf4mf9
KU7Ut2Y212myv8lbXRVJdK2+1Zv9DX5Ksjyeq1f5Ut8lUMlCvYKMgx/x/hYv
izjJIqiv+uE36NX1/lavklT9nKcg5w6JegcTnan/yOeaOPL85cVosF+ewGss
S0fXpugnppqywkNojubVIj0SB0Pfb7kXCDt8yz1IAu1beJdpQDOFtaqr7y+d
t7pzsP+51RDFem6yT3qRZHadd9i0O9cpVMU01MRkTNnCFNepCeHPTBiZArrT
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
AA==

-->

</rfc>
