<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.10 (Ruby 2.6.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC5116 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5116.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY SELF "[RFCXXXX]">
]>


<rfc ipr="trust200902" docName="draft-nakano-rocca-s-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Encryption algorithm Rocca-S</title>

    <author initials="Y." surname="Nakano" fullname="Yuto Nakano">
      <organization>KDDI Research, Inc.</organization>
      <address>
        <postal>
          <street>2-1-15 Ohara, Fujimino-shi, Saitama</street>
          <code>356-8502</code>
          <country>Japan</country>
        </postal>
        <email>yt-nakano@kddi.com</email>
      </address>
    </author>
    <author initials="K." surname="Fukushima" fullname="Kazuhide Fukushima">
      <organization>KDDI Research, Inc.</organization>
      <address>
        <postal>
          <street>2-1-15 Ohara, Fujimino-shi, Saitama</street>
          <code>356-8502</code>
          <country>Japan</country>
        </postal>
        <email>ka-fukushima@kddi.com</email>
      </address>
    </author>
    <author initials="T." surname="Isobe" fullname="Takanori Isobe">
      <organization>University of Hyogo</organization>
      <address>
        <postal>
          <street>7-1-28 Minatojima Minamimachi, Chuo-ku, Kobe-shi, Hyogo</street>
          <code>650-0047</code>
          <country>Japan</country>
        </postal>
        <email>takanori.isobe@ai.u-hyogo.ac.jp</email>
      </address>
    </author>

    <date year="2022" month="July" day="26"/>

    <area>sec</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document defines Rocca-S encryption scheme,
which is an Authenticated Encryption with Associated Data (AEAD),
using a 256-bit key and can be efficiently implemented utilizing the AES New Instruction set (AES-NI).</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<!-- Rocca-S is an AES-based authenticated-encryption with associated-data scheme. -->

<section anchor="background"><name>Background</name>

<!-- Background Description -->

<t>Countries such as the USA, China, and South Korea are adapting to the fifth-generation mobile
communication systems (5G) technology at an increasingly rapid pace. There are more
than 1500 cities worldwide with access to 5G technology. Other countries are also taking significant
steps to make 5G networks commercially available to their citizens. As the research in
5G technology is moving toward global standardization, it is important for the research
community to focus on developing solutions beyond 5G and for the 6G era. The first
white paper on 6G <xref target="WP-6G"/> was published by 6G Flagship, University of Oulu, Finland
under the 6Genesis project in 2019. 
This white paper identified the key drivers, research
requirements, challenges and essential research questions related to 6G. 
One of the main requirements as listed in this paper was to look at the problem
of transmitting data at a speed of over 100 Gbps per user.</t>

<t>Additionally, 3GPP requires that the cryptographic algorithms
proposed for 5G systems should support 256-bit keys <xref target="SPEC-5G"/>. Apart from the need of
speeds of more than 100 Gbps and supporting 256-bit keys, 3GPP also discusses the
possible impacts of quantum computing in the coming years, especially due to Grover&#39;s
algorithm. While describing the impact of quantum computers on symmetric algorithms
required for 5G and beyond, 3GPP states the following in Section 5.3 of <xref target="SPEC-5G"/>:</t>

<t>&quot;The threat to symmetric cryptography from quantum computing is lower
than that for asymmetric cryptography. As such there is little benefit in
transitioning symmetric algorithms without corresponding changes to the
asymmetric algorithms that accompany them.&quot;</t>

<t>However, it has been shown in numerous articles that quantum computers can
be used to either efficiently break or drastically reduce the time necessary 
to attack some symmetric-key cryptography methods. 
These results require a serious reevaluation of the premise that has 
informed beyond 5G quantum security concerns up to this point. 
In the long run, merely doubling the key size could not be sufficient to 
maintain the security of communications networks. 
Additionally, since NIST will finally standardize quantum-resistant public key algorithms
in the coming few years, we believe it is important for the research community 
to also focus on symmetric algorithms for future telecommunications that would provide security 
against quantum adversaries. 
The effectiveness of post-quantum asymmetric cryptography would only be 
improved if the symmetric cryptography used with it is also quantum resistant.
Thus, a symmetric cryptographic algorithm that</t>

<t><list style="symbols">
  <t>supports 256-bit key and provides 256-bit security with respect to key recovery, distinguishing and forgery attacks,</t>
  <t>has an encryption/decryption speed of more than 100 Gbps, and</t>
  <t>is at least as secure as AES-256 against quantum adversaries (for 128-bit security against a quantum adversary),</t>
</list></t>

<t>is needed.</t>

<!-- Rocca {{ROCCA}} is the first cryptographic algorithm dedicated for 6G. -->

<t>Rocca has been designed as an encryption algorithm for a high speed communication such as future internet and beyond 5G mobile communications.
Rocca achieves an encryption/decryption speed of more than 100 Gbps in both the raw encryption scheme and the AEAD scheme. 
It supports a 256-bit key and provides 256-bit and 128-bit security against the key recovery and distinguishing attacks, respectively.
The high throughput of Rocca can be achieved by utilizing the AES New Instruction set (AES-NI) <xref target="AES-NI"/>.
Similar approach has been taken by AEGIS family <xref target="AEGIS"/> and Tiaoxin-346 <xref target="TIAOXIN"/>, both are two submissions to the CAESAR competition <xref target="CAESAR"/>.
SNOW-V <xref target="SNOW-V"/> also uses AES round function as a component so that AES-NI can be used.</t>

<t>As Rocca has been designed for future telecommunication services, Rocca satisfies two out of three above mentioned requirements.
However, there is still room for the improvement with regard to security against quantum computers.
This motivates us to propose a symmetric-key algorithm that satisfies all three of the above-mentioned requirements.
In this document, we propose Rocca-S, which is an AES-based encryption 
scheme with a 256-bit key. Rocca-S provides both a raw encryption scheme 
and an AEAD scheme with a 256-bit tag. 
Rocca-S is designed to meet the requirements of high throughput of more than 100 Gbps as well as 256-bit security. 
Rocca-S achieves an encryption/decryption speed of more than 200 Gbps in both 
raw encryption scheme and AEAD scheme on Intel(R) Core(TM) i9-12900K, and can provide 256-bit and 
128-bit security against classical and quantum adversaries respectively.</t>

</section>
<section anchor="design-concept"><name>Design Concept</name>

<!--
Design Concept Description
This section needs to be updated
-->

<t>In this document, we present an AES-based AEAD encryption scheme
with a 256-bit key and 256-bit tag called Rocca-S,
which is a variant of Rocca described in <xref target="ROCCA"/>.
The goal of Rocca-S is to further improve the security of Rocca while maintaining its performance advantage.
<!-- For security, Rocca-S can provide 256-bit security against key-recovery attacks and forgery attacks.
For performance, Rocca-S achieves an encryption/decryption speed of more than 200 Gbps in raw encryption mode and AEAD mode.--></t>

<!-- slightly modify this section to match Rocca-S -->
<!--
### Optimized AES-NI-Friendly Round Function
-->

<t>To achieve such a dramatically fast encryption/decryption speed,
Rocca-S follows the same design principle as Rocca, such as the SIMD-friendly round function and an efficient permutation-based structure.
We explore the class of AES-based structures to further increase its speed and reduce the state size.
Specifically, we take the following different approaches.</t>

<t><list style="symbols">
  <t>To minimize the critical path of the round function, we focus on the structure where
each 128-bit block of the internal state is updated by either one AES round (<spanx style="verb">aesenc</spanx>) or XOR
while Jean and Nikolic consider the case of applying both <spanx style="verb">aesenc</spanx> and XOR
in a cascade way for one round,
and the most efficient structures in <xref target="DESIGN"/> are included in this class.</t>
  <t>We introduce a permutation between the 128-bit state words of the internal state
in order to increase the number of possible candidates while maintaining efficiency, because 
executing such a permutation is a cost-free operation in the target software, which
was not taken into account in <xref target="DESIGN"/>.</t>
</list></t>

<!-- can be removed?

### Encryption and Authentication Scheme

To resist against the statistical attack in {{AEGIS-BIAS1}},
generating each 128-bit ciphertext block will additionally require one AES round, while it
is generated with simple quadratic boolean functions in the AEGIS family and Tiaxion-346.
However, such a way will have few overhead by AES-NI. Moreover, a study
on the initialization phases for both reduced AEGIS-128 and Tiaoxin-346 has been reported
recently {{WEAK-KEYS}}. To further increase the resistance against the reported attacks, how to
place the nonce and the key at the initial state is carefully chosen in our scheme.
-->

<!--
### Performance

We confirmed that the encryption/decryption speed of Rocca-S has been dramatically improved compared
with other AES-based encryption schemes on a PC with Intel(R) Core(TM) i9 12900 CPU with 32GB RAMs. 
Rocca-S is more than three and four times
faster than SNOW-V and SNOW-V-GCM, respectively, i.e., the speed reaches 230 and 205
Gbps, respectively. Compared to other AEAD schemes with a 256-bit key, Rocca-S is more than four
times faster than AEGIS-256 and more than three times faster than AES-256-GCM in our
evaluations. Moreover, Rocca-S is also faster than AEGIS-128, AEGIS-128L,
and Tiaoxin-346, even though Rocca-S provides a higher security level. 
-->

</section>
<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; 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>

</section>
</section>
<section anchor="algorithms-description"><name>Algorithms Description</name>

<t>In this section, the notations and the specification of our designs will be described.</t>

<section anchor="notations"><name>Notations</name>

<!-- Notations Description -->

<t>The following notations will be used in the document.
Throughout this document,
a block means a 2-octet value.
For the constants Z0 and Z1,
we utilize the same ones as Tiaoxin-346 <xref target="TIAOXIN"/>.</t>

<t><list style="numbers">
  <t><spanx style="verb">X ^ Y</spanx>: The bitwise Exclusive OR (XOR) of <spanx style="verb">X</spanx> and <spanx style="verb">Y</spanx>.</t>
  <t><spanx style="verb">X#Y</spanx>: For a number <spanx style="verb">X</spanx> and a positive integer <spanx style="verb">Y</spanx>, the <spanx style="verb">Y</spanx>-th power of <spanx style="verb">X</spanx>.</t>
  <t><spanx style="verb">f#(N)</spanx>: For a function <spanx style="verb">f</spanx> and a non-negative integer <spanx style="verb">N</spanx>,
the <spanx style="verb">N</spanx>-th iteration of function <spanx style="verb">f</spanx>.</t>
  <t><spanx style="verb">|X|</spanx>: The length of <spanx style="verb">X</spanx> in bits.</t>
  <t><spanx style="verb">X||Y</spanx> : The concatenation of <spanx style="verb">X</spanx> and <spanx style="verb">Y</spanx>.</t>
  <t><spanx style="verb">ZERO(l)</spanx>: A zero string of length <spanx style="verb">l</spanx> bits.</t>
  <t><spanx style="verb">PAD(X)</spanx>: <spanx style="verb">X||ZERO(l)</spanx>, where <spanx style="verb">l</spanx> is the minimal non-negative integer such that
<spanx style="verb">|PAD(X)|</spanx> is a multiple of 256.</t>
  <t><spanx style="verb">PADN(X)</spanx>: <spanx style="verb">X||ZERO(l)</spanx>, where <spanx style="verb">l</spanx> is the minimal non-negative integer such that
<spanx style="verb">|PADN(X)|</spanx> is a multiple of 128.</t>
  <t><spanx style="verb">LE128(X)</spanx>: the little-endian encoding of 128-bit integer X.</t>
  <t>Write <spanx style="verb">X</spanx> as <spanx style="verb">X = X[0]||X[1]|| ... ||X[n] with |X[i]| = 256</spanx>,
   where <spanx style="verb">n</spanx> is <spanx style="verb">|X|/256 - 1</spanx>.
   In addition, <spanx style="verb">X[i]</spanx> is written as <spanx style="verb">X[i] = X[i]_0||X[i]_1 with |X[i]_0| = |X[i]_1| = 128</spanx>.</t>
  <t><spanx style="verb">S</spanx>: The state of Rocca-S, which is composed of 8 blocks, i.e.,
   <spanx style="verb">S = (S[0], S[1], ..., S[6])</spanx>,
   where <spanx style="verb">S[i]</spanx> (0 &lt;= i &lt;= 6) are blocks and <spanx style="verb">S[0]</spanx> is the first block.</t>
  <t><spanx style="verb">Z0</spanx>: A 128-bit constant block defined as <spanx style="verb">Z0 = 428a2f98d728ae227137449123ef65cd</spanx>.</t>
  <t><spanx style="verb">Z1</spanx>: A 128-bit constant block defined as <spanx style="verb">Z1 = b5c0fbcfec4d3b2fe9b5dba58189dbbc</spanx>.</t>
  <t><spanx style="verb">A(X)</spanx>: The AES round function without the constant addition operation, as defined
   below:<br />
   <spanx style="verb">A(X) = MixColumns( ShiftRows( SubBytes(X) ) )</spanx>,
   where <spanx style="verb">MixColumns</spanx>, <spanx style="verb">ShiftRows</spanx> and <spanx style="verb">SubBytes</spanx> are the same operations as defined
   in AES <xref target="AES"/>.</t>
  <t><spanx style="verb">AES(X,Y)</spanx>: One AES round is applied to the block <spanx style="verb">X</spanx>, where the round constant is <spanx style="verb">Y</spanx>,
   as defined below:<br />
   <spanx style="verb">AES(X,Y) = A(X) ^ Y</spanx>.<br />
   This operation is the same as <spanx style="verb">aesenc</spanx>, which is one of the instructions of AES-NI,
   performs one regular (not the last) round of AES on an input state <spanx style="verb">X</spanx> with a subkey <spanx style="verb">Y</spanx>.</t>
  <t><spanx style="verb">R(S,X0,X1)</spanx>: The round function is used to update the state S, as defined in <xref target="round-function"/>.</t>
</list></t>

</section>
<section anchor="round-function"><name>The Round Function</name>

<!-- The Round Update Function Description -->

<t>The input of the round function <spanx style="verb">R(S,X0,X1)</spanx> of Rocca-S consists of the state S and two
blocks <spanx style="verb">(X0,X1)</spanx>.
If denoting the output by <spanx style="verb">Snew</spanx>, <spanx style="verb">Snew:=R(S,X0,X1)</spanx> can be defined as follows:</t>

<figure><artwork><![CDATA[
Snew[0] = S[6] ^ S[1],
Snew[1] = AES(S[0],X_0),
Snew[2] = AES(S[1],S[0]),
Snew[3] = AES(S[2],S[6]),
Snew[4] = AES(S[3],X_1),
Snew[5] = AES(S[4],S[3]),
Snew[6] = AES(S[5],S[4]).
]]></artwork></figure>

<t>The corresponding illustration can be found in <xref target="fig-round-function"/>.</t>

<figure title="Illustration of the Round Function" anchor="fig-round-function"><artwork><![CDATA[
+----+      +----+  +----+  +----+ +----+      +----+  +----+
|S[0]|      |S[1]|  |S[6]|  |S[2]| |S[3]|      |S[4]|  |S[5]|
+-+-++      ++-+-+  ++-+-+  ++---+ +-+-++      ++-+-+  ++---+
  | |        | |     | |     |       | |        | |     | 
  | +-----+  | +--+  | +--+  |       | +-----+  | +--+  |
  v       |  v    |  v    |  v       v       |  v    |  v
+---+     | +---+ | +---+ | +---+  +---+     | +---+ | +---+ 
|AES|<-X0 +>|AES| +>|XOR| +>|AES|  |AES|<-X1 +>|AES| +>|AES|
+-+-+       +-+-+   +-+-+   +-+-+  +-+-+       +-+-+   +-+-+ 
  |           |       |       |      |           |       |
  v           v       v       v      v           v       v
+----+     +----+   +----+  +----+ +----+     +----+  +----+
|Snew|     |Snew|   |Snew|  |Snew| |Snew|     |Snew|  |Snew|
| [1]|     | [2]|   | [0]|  | [3]| | [4]|     | [5]|  | [6]|
+----+     +----+   +----+  +----+ +----+     +----+  +----+
]]></artwork></figure>

</section>
<section anchor="specification"><name>Specification</name>

<!-- Specification Description -->

<t>Rocca-S is an AEAD scheme composed of four phases:
initialization, processing the associated data, encryption and finalization.
The input consists of a 256-bit key <spanx style="verb">K = K0||K1</spanx>,
a nonce <spanx style="verb">N</spanx> of between 12 and 16 octets (both inclusive) in length,
the associated data <spanx style="verb">AD</spanx> and the message <spanx style="verb">M</spanx>,
where <spanx style="verb">K0</spanx> and <spanx style="verb">K1</spanx> are elements of the binary finite field of 2#128.
The output is the corresponding ciphertext <spanx style="verb">C</spanx> and a 256-bit tag <spanx style="verb">T</spanx>.</t>

<!-- Write `X` as `X = X0||X1|| ... ||Xn with |Xi| = 256`,
where `n` is `|X|/256 - 1`.
In addition, `Xi` is written as `Xi = Xi_0||Xi_1 with |Xi_0| = |Xi_1| = 128`. -->

<t>The settings described below are required for the parameters:</t>

<t><list style="symbols">
  <t>The key <spanx style="verb">K</spanx> MUST be unpredictable for each invocation.</t>
  <t><spanx style="verb">PADN(N)</spanx>, where <spanx style="verb">N</spanx> is the nonce, MUST be unique per invocation with the same key,
so <spanx style="verb">N</spanx> MUST NOT be randomly generated.
 <!-- A counter is a good way to implement this,
 but other methods, such as a Linear Feedback Shift Register (LFSR)
 are also acceptable. --></t>
</list></t>

<section anchor="initialization"><name>Initialization</name>

<!-- Initialization Description -->

<t>First, <spanx style="verb">(N,K0,K1)</spanx> is loaded into the state <spanx style="verb">S</spanx> in the following way:</t>

<figure><artwork><![CDATA[
  S[0] = K1,
  S[1] = PADN(N),
  S[2] = Z0,
  S[3] = K0,
  S[4] = Z1,
  S[5] = PADN(N) ^ K1,
  S[6] = ZERO(128)
]]></artwork></figure>

<!--
Here, two 128-bit constants Z0 and Z1 are encoded as 16-byte little endian words
and loaded into S[2] and S[4], respectively.-->
<t>Then, 16 iterations of the round function <spanx style="verb">R(S,Z0,Z1)</spanx>,
which is written as <spanx style="verb">R(S,Z0,Z1)#(16)</spanx>,
are applied to state <spanx style="verb">S</spanx>.</t>

<t>After 16 iterations of the round function, two 128-bit keys are XORed with the state S in the following way:</t>

<figure><artwork><![CDATA[
   S[5] = S[5] ^ K0,
   S[6] = S[6] ^ K1.
]]></artwork></figure>

</section>
<section anchor="processing-the-associated-data"><name>Processing the Associated Data</name>

<!-- Processing The Associated Data Description -->

<t>If <spanx style="verb">AD</spanx> is empty, this phase will be skipped. Otherwise,
AD is padded to <spanx style="verb">PAD(AD)</spanx>, and the state is updated as follows:</t>

<figure><artwork><![CDATA[
   for i = 0 to d - 1
      R(S, PAD(AD)[i]_0, PAD(AD)[i]_1),
   end for
]]></artwork></figure>

<t>where <spanx style="verb">d = |PAD(AD)| / 256</spanx>.</t>

</section>
<section anchor="encryption"><name>Encryption</name>

<!-- Encryption Description -->
<t>The encryption phase is similar to the phase to process the associated data.
If <spanx style="verb">M</spanx> is empty, the encryption phase will be skipped.
Otherwise, <spanx style="verb">M</spanx> is first padded to <spanx style="verb">PAD(M)</spanx>, and then <spanx style="verb">PAD(M)</spanx> will be absorbed
with the round function.
During this procedure, the ciphertext <spanx style="verb">C</spanx> is generated.
If the last block of <spanx style="verb">M</spanx> is incomplete and its length is <spanx style="verb">b</spanx> bits, i.e.,
<spanx style="verb">0 &lt; b &lt; 256</spanx>, the last block of <spanx style="verb">C</spanx> will be truncated to the first <spanx style="verb">b</spanx> bits.
A detailed description is shown below:</t>

<figure><artwork><![CDATA[
   for i = 0 to m - 1
      C[i]_0 = AES(S[3] ^ S[5], S[0]) ^ PAD(M)[i]_0,
      C[i]_1 = AES(S[4] ^ S[6], S[2]) ^ PAD(M)[i]_1,
      R(S, PAD(M)[i]_0, PAD(M)[i]_1),
   end for
]]></artwork></figure>

<t>where <spanx style="verb">m = |PAD(M)| / 256</spanx>.</t>

</section>
<section anchor="finalization"><name>Finalization</name>

<!-- Finalization Description -->
<t>After the above three phases, two 128-bit keys <spanx style="verb">K0</spanx> and <spanx style="verb">K1</spanx> are first XORed with the state <spanx style="verb">S</spanx> in the following way:</t>

<figure><artwork><![CDATA[
   S[1] = S[1] ^ K0,
   S[2] = S[2] ^ K1.
]]></artwork></figure>

<t>Then, the state <spanx style="verb">S</spanx> will again pass through 16 iterations
of the round function <spanx style="verb">R(S,LE128(|AD|),LE128(|M|))</spanx> and then the 256-bit tag <spanx style="verb">T</spanx> is computed in the
following way:</t>

<figure><artwork><![CDATA[
   T = (S[0] ^ S[1] ^ S[2] ^ S[3]) || (S[4] ^ S[5] ^ S[6]).
]]></artwork></figure>

<!-- The length of the associated data and message is encoded as a 16-byte little endian
word and stored into |AD| and |M|, respectively.-->

</section>
<section anchor="Rocca-S-Algorithm"><name>Rocca-S Algorithm</name>

<t>A formal description of Rocca-S can be seen in <xref target="fig-rocca-s-pseudo-code"/>, and
the corresponding illustration is shown in <xref target="fig-rocca-s-procedure"/>.</t>

<figure title="The Specification of Rocca-S" anchor="fig-rocca-s-pseudo-code"><artwork><![CDATA[
// Rocca-S Algorithm. The specification of Rocca-S
   procedure RoccaEncrypt(K0, K1, N, AD, M)
      S = Initialization(N,K0,K1)
      if |AD| > 0 then
         S = ProcessAD(S,PAD(AD))
      if |M| > 0 then
         S =  Encryption(S,PAD(M),C)
         Truncate C
      T = Finalization(S, |AD|, |M|)
      return (C, T)

   procedure RoccaDecrypt(K0, K1, N, AD, C, T)
      S = Initialization(N,K0,K1)
      if |AD| > 0 then
      S = ProcessAD(S,PAD(AD))
      if |C| > 0 then
         S = Decryption(S,PAD(C),M)
         Truncate M
      if T == Finalization(S, |AD|, |C|) then
         return M
      else
         return nil

   procedure Initialization(N, K0, K1)
       S[0] = K1,
       S[1] = PADN(N),
       S[2] = Z0,
       S[3] = K0,
       S[4] = Z1,
       S[5] = PADN(N) ^ K1,
       S[6] = ZERO(128)
      for i = 0 to 15 do
         S = R(S, Z0, Z1)
      (S[5], S[6]) = (S[5] ^ K0, S[6] ^ K1)
      return S

   procedure ProcessAD(S, AD)
      d = |PAD(AD)|/256
      for i = 0 to d - 1 do
         S =  R(S, AD[i]_0, AD[i]_1)
      return S

   procedure Encryption(S, M, C)
      m = |PAD(M)|/256
      for i = 0 to m - 1 do
         C[i]_0 = AES(S[3] ^ S[5], S[0]) ^ M[i]_0
         C[i]_1 = AES(S[4] ^ S[6], S[2]) ^ M[i]_1
         S = R(S,M[i]_0, M[i]_1)
      return S

   procedure Decryption(S, M, C)
      c = |C|/256
      for i = 0 to c - 1 do
         M[i]_0 = AES(S[3] ^ S[5], S[0]) ^ C[i]_0
         M[i]_1 = AES(S[4] ^ S[6], S[2]) ^ C[i]_1
         S = R(S,M[i]_0, M[i]_1)
      return S

   procedure Finalization(S, |AD|, |M|)
      S[1] = S[1] ^ K0
      S[2] = S[2] ^ K1
      for i = 0 to 15 do
         S = R(S, |AD|, |M|)
      T0 = 0
      T1 = 0
      for i = 0 to 3 do
         T0 = T0 ^ S[i]
      for i = 4 to 6 do
         T1 = T1 ^ S[i]
      return T0||T1      
]]></artwork></figure>

<figure title="The Procedure of Rocca-S" anchor="fig-rocca-s-procedure"><artwork><![CDATA[
            Z1     AD[0]_1  AD[1]_1
            |         |       |
            v         v       v
         +------+   +---+   +---+
PADN(N)->|      |   |   |   |   |
         |R#(16)+-->| R +-->| R +->...---+
 K0||K1->|      |   |   |   |   |        |
         +------+   +---+   +---+        |
            ^         ^       ^          |
            |         |       |          |
            Z0     AD[0]_0  AD[1]_0      |
                                         |
+----------------------------------------+
|
|             C[0]_1        C[1]_1        C[m-1]_1
|               ^             ^              ^
|               |             |              |               |AD|
|             +-+-+         +-+-+          +-+-+              |
|   AD[d-1]_1 |XOR|<-M[0]_1 |XOR|<-M[1]_1  |XOR|<-M[m-1]_1    |
|        |    +---+   |     +---+   |      +---+   |          |
|        v      ^     v       ^     v        ^     v          |
|       +---+   |   +---+     |   +---+      |   +---+        v
|       |   +---+   |   +-----+   |   |     -+   |   |    +------+
|       |   |       |   |         |   |          |   |    |      |
+------>| R +------>| R +-------->| R +->...---->| R +--->|R#(16)+->T
        |   |       |   |         |   |          |   |    |      |
        |   +---+   |   +-----+   |   |     -+   |   |    +------+
        +---+   |   +---+     |   +---+      |   +---+      ^  ^
         ^      v     ^       v     ^        v     ^        |  |
         |    +---+   |     +---+   |      +---+   |        |  |
              |XOR|<-M[0]_0 |XOR|<-M[1]_0  |XOR|<-M[m-1]_0  | |M| 
    AD[d-1]_0 +-+-+         +-+-+          +-+-+            | 
                |             |              |             K0||K1
                v             v              v
              C[0]_0        C[1]_0        C[m-1]_0
]]></artwork></figure>

</section>
<section anchor="a-raw-encryption-scheme"><name>A Raw Encryption Scheme</name>

<t>If the phases of processing the associated data and finalization are removed, 
a raw encryption scheme is obtained.</t>

</section>
<section anchor="a-keystream-generation-scheme"><name>A Keystream Generation Scheme</name>

<t>If the phases of processing the associated data and finalization are removed, and there is no message injection into the round function such that <spanx style="verb">R(S,0,0)</spanx>, 
a keystream generation scheme is obtained.
This scheme can be used as a general stream cipher and random bit generation.</t>

</section>
<section anchor="support-for-shorter-key-length"><name>Support for Shorter Key Length</name>

<t>For Rocca-S to support 128-bit or 192-bit keys, the given key needs to be expanded to 256 bits.
When 128-bit key is given, it will be set to <spanx style="verb">K0</spanx>, and <spanx style="verb">K1</spanx> is defined as <spanx style="verb">K1 = ZERO(128)</spanx>.
When 192-bit key is given, the first 128-bit will be set to <spanx style="verb">K0</spanx>, and the remaining 64-bit will be set to <spanx style="verb">K1_p</spanx>.
Then <spanx style="verb">K1</spanx> is defined as <spanx style="verb">K1 = K1_p||ZERO(64)</spanx>.</t>

<t>Use of Key Derivation Functions (KDF) <xref target="KDF"/> to stretch the key length to 256-bit could be another option.
The given 128-bit or 192-bit key will be used as a key derivation key, and the output of the KDF will be 256-bit.</t>

</section>
<section anchor="settings-as-aead-algorithm-specifications"><name>Settings as AEAD Algorithm Specifications</name>

<t>To comply with the requirements defined in Section 4 of <xref target="RFC5116"/>,
the settings of the parameters for Rocca-S are defined as follows:</t>

<t><list style="symbols">
  <t><spanx style="verb">K_LEN</spanx> (key length) is 32 octets (256 bits), and <spanx style="verb">K</spanx> (key) does not require any particular data format.</t>
  <t><spanx style="verb">P_MAX</spanx> (maximum size of the plaintext) is 2#125 octets.</t>
  <t><spanx style="verb">A_MAX</spanx> (maximum size of the associated data) is 2#61 octets.</t>
  <t><spanx style="verb">N_MIN</spanx> (minimum size of the nonce) = 12 octets,
and <spanx style="verb">N_MAX</spanx> (maximum size of the nonce) = 16 octets.</t>
  <t><spanx style="verb">C_MAX</spanx> (the largest possible AEAD ciphertext) = P_MAX + tag length = 2#125 + 32 octets.</t>
</list></t>

<t>In addition,</t>

<t><list style="symbols">
  <t>Rocca-S does not structure its ciphertext output with the 
 authentication tag.</t>
  <t>Rocca-S is not randomized and is not stateful in the meanings of 
 the section 4 of <xref target="RFC5116"/>.</t>
</list></t>

</section>
</section>
<section anchor="security-claims"><name>Security Claims</name>

<section anchor="classic-setting"><name>Classic Setting</name>

<t>As described in <xref target="security-considerations"/>, Rocca-S provides 256-bit security against key-recovery, forgery and distinguishing attacks
in the nonce-respecting setting.
We do not claim its security in the related-key and known-key settings.</t>

<t>The message length for a fixed key is limited to at most 2#128, and we also limit the number of different messages that are produced for a fixed key to be at most 2#128.
The length of the associated data for a fixed key is up to 2#64.</t>

</section>
<section anchor="quantum-setting"><name>Quantum Setting</name>

<t>There exist no quantum attacks for key-recovery and forgery (in nonce-respecting setting) on Rocca-S
with time complexity lower than 2#128.
Rocca-S does not provide security against related-key and known-key superposition attacks (as is the case of all known block ciphers).</t>

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

<section anchor="security-against-attacks"><name>Security Against Attacks</name>

<t>Rocca-S is secure against the following attacks:</t>

<t><list style="numbers">
  <t>Key-Recovery Attack: 256-bit security against key-recovery attacks.</t>
  <t>Distinguishing Attack: 256-bit security against distinguishing attacks.</t>
  <t>Differential Attack: Secure against differential attacks in the initialization phase.</t>
  <t>Forgery Attack: 256-bit security against forgery attacks.</t>
  <t>Integral Attack: Secure against integral attacks.</t>
  <t>State-recovery Attack:  <list style="symbols">
      <t>Guess-and-Determine Attack: The time complexity of
 the guess-and-determine attack cannot be lower than 2#256.</t>
      <t>Algebraic Attack: The system of equations, which needs to be solved in algebraic attacks to Rocca-S,
 cannot be solved with time complexity 2#256.</t>
    </list></t>
  <t>The Linear Bias: Secure against a statistical attack.</t>
</list></t>

</section>
<section anchor="other-attacks"><name>Other Attacks</name>

<t>While there are many attack vectors for block ciphers, their application to Rocca-S is
restrictive, as the attackers can only know partial information about the internal state from
the ciphertext blocks. In other words, reversing the round function is impossible in
Rocca-S without guessing many secret state blocks. Therefore, only the above potential
attack vectors are taken into account. In addition, due to the usage of the constant
(Z0,Z1) at the initialization phase, the attack based on the similarity in the four columns
of the AES state is also excluded.</t>

</section>
<section anchor="nonce-reuse"><name>Nonce Reuse</name>

<t>Inadvertent reuse of the same nonce by two invocations of the Rocca-S
encryption operation, with the same key, undermines the security of
the messages processed with those invocations.
A loss of confidentiality ensues because an adversary will be able to
reconstruct the bitwise exclusive-or of the two plaintext values.</t>

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

<t>IANA is requested to update the entry for &quot;AEAD_ROCCA&quot; in the &quot;Authenticated Encryption with Associated Data (AEAD) Parameters&quot; registry with this document as its reference.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC2119;
&RFC5116;
&RFC8174;


    </references>

    <references title='Informative References'>

<reference anchor="KDF" target="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-108.pdf">
  <front>
    <title>Recommendation for Key Derivation Using Pseudorandom Functions (Revised)</title>
    <author initials="L." surname="Chena" fullname="Lily Chena">
      <organization></organization>
    </author>
    <date year="2009"/>
  </front>
<refcontent>NIST Special Publication 800-108</refcontent></reference>
<reference anchor="ROCCA" target="https://doi.org/10.46586/tosc.v2021.i2.1-30">
  <front>
    <title>Rocca: An Efficient AES-based Encryption Scheme for Beyond 5G</title>
    <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
      <organization>University of Hyogo, Japan</organization>
    </author>
    <author initials="F." surname="Liu" fullname="Fukang Liu">
      <organization>University of Hyogo, Japan and East China Normal University, Shanghai, China</organization>
    </author>
    <author initials="Y." surname="Nakano" fullname="Yuto Nakano">
      <organization>KDDI Research, Japan</organization>
    </author>
    <author initials="S." surname="Kiyomoto" fullname="Shinsaku Kiyomoto">
      <organization>KDDI Research, Japan</organization>
    </author>
    <author initials="T." surname="Isobe" fullname="Takanori Isobe">
      <organization>University of Hyogo, Japan and National Institute of Information and Communications Technology(NICT), Japan</organization>
    </author>
    <date year="2021"/>
  </front>
<refcontent>IACR Transactions on Symmetric Cryptology, 2021(2), 1-30</refcontent></reference>
<reference anchor="TIAOXIN" target="https://competitions.cr.yp.to/round2/tiaoxinv2.pdf">
  <front>
    <title>Tiaoxin-346: VERSION 2.0</title>
    <author initials="I." surname="Nikolic" fullname="Ivica Nikolic">
      <organization>Nanyang Technological University, Singapore</organization>
    </author>
    <date year="2014"/>
  </front>
<refcontent>CAESAR Competition</refcontent></reference>
<reference anchor="AEGIS" >
  <front>
    <title>AEGIS: A fast authenticated encryption algorithm</title>
    <author initials="B." surname="Preneel" fullname="Bart Preneel">
      <organization></organization>
    </author>
    <date year="2013"/>
  </front>
<refcontent>Selected Areas in Cryptography (SAC 2013) pp.185-201</refcontent></reference>
<reference anchor="AES" target="https://doi.org/10.6028/NIST.FIPS.197">
  <front>
    <title>FIPS 197 Advanced Encryption Standard (AES)</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2001" month="November"/>
  </front>
</reference>
<reference anchor="WP-6G" >
  <front>
    <title>Key drivers and research challenges for 6G ubiquitous wireless intelligence</title>
    <author initials="M." surname="Latva-aho" fullname="Matti Latva-aho">
      <organization></organization>
    </author>
    <author initials="K." surname="Leppaenen" fullname="Kari Leppaenen">
      <organization></organization>
    </author>
    <date year="2019"/>
  </front>
</reference>
<reference anchor="SNOW-V" target="https://doi.org/10.13154/tosc.v2019.i3.1-42">
  <front>
    <title>A new SNOW stream cipher called SNOW-V</title>
    <author initials="P." surname="Ekdahl" fullname="Patrik Ekdahl">
      <organization></organization>
    </author>
    <author initials="T." surname="Johansson" fullname="Thomas Johansson">
      <organization></organization>
    </author>
    <author initials="A." surname="Maximov" fullname="Alexander Maximov">
      <organization></organization>
    </author>
    <author initials="J." surname="Yang" fullname="Jing Yang">
      <organization></organization>
    </author>
    <date year="2019"/>
  </front>
<refcontent>IACR Transactions on Symmetric Cryptology, 2019(3), 1-42</refcontent></reference>
<reference anchor="SPEC-5G" target="https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3422">
  <front>
    <title>Study on the support of 256-bit algorithms for 5G</title>
    <author >
      <organization>3GPP SA3</organization>
    </author>
    <date year="2018"/>
  </front>
</reference>
<reference anchor="AES-NI" target="https://www.intel.com/content/dam/doc/white-paper/advanced-encryption-standard-new-instructions-set-paper.pdf">
  <front>
    <title>Intel Advanced Encryption Standard (AES) New Instructions Set</title>
    <author initials="S." surname="Gueron" fullname="Shay Gueron">
      <organization>Intel Corporation</organization>
    </author>
    <date year="2010"/>
  </front>
</reference>
<reference anchor="CAESAR" target="https://competitions.cr.yp.to/caesar.html">
  <front>
    <title>CAESAR: Competition for Authenticated Encryption: Security, Applicability, and Robustness</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018"/>
  </front>
</reference>
<reference anchor="DESIGN" target="https://doi.org/10.1007/978-3-662-52993-5_17">
  <front>
    <title>Efficient Design Strategies Based on the AES Round Function</title>
    <author initials="J." surname="Jean" fullname="Jeremy Jean">
      <organization></organization>
    </author>
    <author initials="I." surname="Nikolic" fullname="Ivica Nikolic">
      <organization></organization>
    </author>
    <date year="2016"/>
  </front>
<refcontent>In: Peyrin, T. (eds) Fast Software Encryption. FSE 2016. Lecture Notes in Computer Science, vol 9783</refcontent></reference>


    </references>


<section anchor="software-implementation"><name>Software Implementation</name>

<!-- Software Implementation Description -->

<section anchor="implementation-with-simd-instructions"><name>Implementation with SIMD Instructions</name>

<!-- Reference Implementation with SIMD Description -->

<t><xref target="Reference-Implementation-with-SIMD"/> shows a sample implementation of Rocca-S.
<!--
Note that the implementation does not include 
`RoccaEncrypt` and `RoccaDecrypt` of {{Rocca-S-Algorithm}}, and
that `nonce128` of `Initialization` in {{Reference-Implementation-with-SIMD}}
corresponds to `PADN(N)`, where `N` is the nonce.
--></t>

<figure title="Reference Implementation with SIMD" anchor="Reference-Implementation-with-SIMD"><artwork><![CDATA[
#include <memory.h>
#include <immintrin.h>
#include <stdlib.h>
#include <stdint.h>

#define ROCCA_KEY_SIZE       (32)
#define ROCCA_IV_SIZE        (16)
#define ROCCA_MSG_BLOCK_SIZE (32)
#define ROCCA_TAG_SIZE       (32)
#define ROCCA_STATE_NUM      ( 7)

typedef struct ROCCA_CTX {
   uint8_t key[ROCCA_KEY_SIZE/16][16];
   uint8_t state[ROCCA_STATE_NUM][16];
   size_t size_ad;
   size_t size_m;
} rocca_context;

#define load(m)    _mm_loadu_si128((const __m128i *)(m))
#define store(m,a) _mm_storeu_si128((__m128i *)(m),a)
#define xor(a,b)   _mm_xor_si128(a,b)
#define and(a,b)   _mm_and_si128(a,b)
#define enc(a,k)   _mm_aesenc_si128(a,k)
#define setzero()  _mm_setzero_si128()

#define ENCODE_IN_LITTLE_ENDIAN(bytes, v) \
  bytes[ 0] = ((uint64_t)(v) << (    3)); \
  bytes[ 1] = ((uint64_t)(v) >> (1*8-3)); \
  bytes[ 2] = ((uint64_t)(v) >> (2*8-3)); \
  bytes[ 3] = ((uint64_t)(v) >> (3*8-3)); \
  bytes[ 4] = ((uint64_t)(v) >> (4*8-3)); \
  bytes[ 5] = ((uint64_t)(v) >> (5*8-3)); \
  bytes[ 6] = ((uint64_t)(v) >> (6*8-3)); \
  bytes[ 7] = ((uint64_t)(v) >> (7*8-3)); \
  bytes[ 8] = ((uint64_t)(v) >> (8*8-3)); \
  bytes[ 9] = 0; \
  bytes[10] = 0; \
  bytes[11] = 0; \
  bytes[12] = 0; \
  bytes[13] = 0; \
  bytes[14] = 0; \
  bytes[15] = 0;

#define FLOORTO(a,b) ((a) / (b) * (b))

#define S_NUM     ROCCA_STATE_NUM
#define M_NUM     ( 2)
#define INIT_LOOP (16)
#define TAG_LOOP  (16)

#define VARS4UPDATE \
  __m128i k[2], state[S_NUM], stateNew[S_NUM], M[M_NUM];

#define VARS4ENCRYPT \
  VARS4UPDATE \
  __m128i Z[M_NUM], C[M_NUM];

#define COPY_TO_LOCAL(ctx) \
  for(size_t i = 0; i < S_NUM; ++i) \
  { state[i] = load(&((ctx)->state[i][0])); }
  
#define COPY_FROM_LOCAL(ctx) \
  for(size_t i = 0; i < S_NUM; ++i) \
  { store(&((ctx)->state[i][0]), state[i]); }
  
#define COPY_TO_LOCAL_IN_TAG(ctx) \
  COPY_TO_LOCAL(ctx)    for(size_t i = 0; i < 2; ++i) \
  { k[i] = load(&((ctx)->key[i][0])); }
  
#define COPY_FROM_LOCAL_IN_INIT(ctx) \
  COPY_FROM_LOCAL(ctx)  for(size_t i = 0; i < 2; ++i) \
  { store(&((ctx)->key[i][0]), k[i]); }

#define UPDATE_STATE(X) \
  stateNew[0] = xor(state[6], state[1]); \
  stateNew[1] = enc(state[0],     X[0]); \
  stateNew[2] = enc(state[1], state[0]); \
  stateNew[3] = enc(state[2], state[6]); \
  stateNew[4] = enc(state[3],     X[1]); \
  stateNew[5] = enc(state[4], state[3]); \
  stateNew[6] = enc(state[5], state[4]); \
  for(size_t i = 0; i < S_NUM; ++i) \
  {state[i] = stateNew[i];}


  
#define INIT_STATE(key, iv) \
  k[0] = load((key) + 16*0); \
  k[1] = load((key) + 16*1); \
  state[0] = k[1]; \
  state[1] = load(iv); \
  state[2] = load(Z0); \
  state[3] = k[0]; \
  state[4] = load(Z1); \
  state[5] = xor(state[1], state[0]); \
  state[6] = setzero(); \
  M[0] = state[2]; \
  M[1] = state[4]; \
  for(size_t i = 0; i < INIT_LOOP; ++i) { \
    UPDATE_STATE(M) \
  } \
  state[5] = xor(state[5], k[0]); \
  state[6] = xor(state[6], k[1]);


#define MAKE_STRM \
  Z[0] = enc(xor(state[3], state[5]), state[0]); \
  Z[1] = enc(xor(state[4], state[6]), state[2]);

#define MSG_LOAD(mem, reg) \
  reg[0] = load((mem) +  0); \
  reg[1] = load((mem) + 16);

#define MSG_STORE(mem, reg) \
  store((mem) +  0, reg[0]); \
  store((mem) + 16, reg[1]);

#define XOR_BLOCK(dst, src1, src2) \
  dst[0] = xor(src1[0], src2[0]); \
  dst[1] = xor(src1[1], src2[1]); 

#define MASKXOR_BLOCK(dst, src1, src2, mask) \
  dst[0] = and(xor(src1[0], src2[0]), mask[0]); \
  dst[1] = and(xor(src1[1], src2[1]), mask[1]);
  
#define ADD_AD(input) \
  MSG_LOAD(input, M) \
  UPDATE_STATE(M)
  
#define ADD_AD_LAST_BLOCK(input, size) \
  uint8_t tmpblk[ROCCA_MSG_BLOCK_SIZE] = {0}; \
  memcpy(tmpblk, input, size); \
  MSG_LOAD(tmpblk, M) \
  UPDATE_STATE(M)
  
#define ENCRYPT(output, input) \
  MSG_LOAD(input, M) \
  MAKE_STRM \
  XOR_BLOCK(C, M, Z) \
  MSG_STORE(output, C) \
  UPDATE_STATE(M)

#define ENCRYPT_LAST_BLOCK(output, input, size) \
  uint8_t tmpblk[ROCCA_MSG_BLOCK_SIZE] = {0}; \
  memcpy(tmpblk, input, size); \
  MSG_LOAD(tmpblk, M) \
  MAKE_STRM \
  XOR_BLOCK(C, M, Z) \
  MSG_STORE(tmpblk, C) \
  memcpy(output, tmpblk, size); \
  UPDATE_STATE(M)

#define DECRYPT(output, input) \
  MSG_LOAD(input, C) \
  MAKE_STRM \
  XOR_BLOCK(M, C, Z) \
  MSG_STORE(output, M) \
  UPDATE_STATE(M)

#define DECRYPT_LAST_BLOCK(output, input, size) \
  uint8_t tmpblk[ROCCA_MSG_BLOCK_SIZE] = {0}; \
  uint8_t tmpmsk[ROCCA_MSG_BLOCK_SIZE] = {0}; \
  __m128i mask[M_NUM]; \
  memcpy(tmpblk, input, size); \
  memset(tmpmsk, 0xFF , size); \
  MSG_LOAD(tmpblk, C   ) \
  MSG_LOAD(tmpmsk, mask) \
  MAKE_STRM \
  MASKXOR_BLOCK(M, C, Z, mask) \
  MSG_STORE(tmpblk, M) \
  memcpy(output, tmpblk, size); \
  UPDATE_STATE(M)

#define SET_AD_BITLEN_MSG_BITLEN(sizeAD, sizeM) \
  uint8_t bitlenAD[16]; \
  uint8_t bitlenM [16]; \
  ENCODE_IN_LITTLE_ENDIAN(bitlenAD, sizeAD); \
  ENCODE_IN_LITTLE_ENDIAN(bitlenM , sizeM ); \
  M[0] = load(bitlenAD); \
  M[1] = load(bitlenM );

#define MAKE_TAG(sizeAD, sizeM, tag) \
  SET_AD_BITLEN_MSG_BITLEN(sizeAD, sizeM) \
  state[1] = xor(state[1], k[0]); \
  state[2] = xor(state[2], k[1]); \
  for(size_t i = 0; i < TAG_LOOP; ++i) { \
    UPDATE_STATE(M) \
  } \
  __m128i tag128a = setzero(); \
  for(size_t i = 0; i <= 3; ++i) { \
    tag128a = xor(tag128a, state[i]); \
  } \
  __m128i tag128b = setzero(); \
  for(size_t i = 4; i <= 6; ++i) { \
    tag128b = xor(tag128b, state[i]); \
  } \
  store((tag)   , tag128a); \
  store((tag)+16, tag128b);

static const uint8_t Z0[] = {0xcd,0x65,0xef,0x23,0x91, \
0x44,0x37,0x71,0x22,0xae,0x28,0xd7,0x98,0x2f,0x8a,0x42};
static const uint8_t Z1[] = {0xbc,0xdb,0x89,0x81,0xa5, \
0xdb,0xb5,0xe9,0x2f,0x3b,0x4d,0xec,0xcf,0xfb,0xc0,0xb5};

void rocca_init(rocca_context * ctx, const uint8_t * key, \
const uint8_t * iv) {
   VARS4UPDATE
   INIT_STATE(key, iv);
   COPY_FROM_LOCAL_IN_INIT(ctx);
   ctx->size_ad = 0;
   ctx->size_m  = 0;
}

void rocca_add_ad(rocca_context * ctx, const uint8_t * in, size_t size)
 {
   VARS4UPDATE
   COPY_TO_LOCAL(ctx);
   size_t i = 0;
   for(size_t size2 = FLOORTO(size, ROCCA_MSG_BLOCK_SIZE); \
   i < size2; i += ROCCA_MSG_BLOCK_SIZE) {
      ADD_AD(in + i);
   }
   if(i < size) {
      ADD_AD_LAST_BLOCK(in + i, size - i);
   }
   COPY_FROM_LOCAL(ctx);
   ctx->size_ad += size;
}

void rocca_encrypt(rocca_context * ctx, uint8_t * out, \
const uint8_t * in, size_t size) {
   VARS4ENCRYPT
   COPY_TO_LOCAL(ctx);
   size_t i = 0;
   for(size_t size2 = FLOORTO(size, ROCCA_MSG_BLOCK_SIZE); \
   i < size2; i += ROCCA_MSG_BLOCK_SIZE) {
      ENCRYPT(out + i, in + i);
   }
   if(i < size) {
      ENCRYPT_LAST_BLOCK(out + i, in + i, size - i);
   }
   COPY_FROM_LOCAL(ctx);
   ctx->size_m += size;
}

void rocca_decrypt(rocca_context * ctx, uint8_t * out, \
const uint8_t * in, size_t size) {
   VARS4ENCRYPT
   COPY_TO_LOCAL(ctx);
   size_t i = 0;
   for(size_t size2 = FLOORTO(size, ROCCA_MSG_BLOCK_SIZE); \
   i < size2; i += ROCCA_MSG_BLOCK_SIZE) {
      DECRYPT(out + i, in + i);
   }
   if(i < size) {
      DECRYPT_LAST_BLOCK(out + i, in + i, size - i);
   }
   COPY_FROM_LOCAL(ctx);
   ctx->size_m += size;
}

void rocca_tag(rocca_context * ctx, uint8_t *tag) {
   VARS4UPDATE
   COPY_TO_LOCAL_IN_TAG(ctx);
   MAKE_TAG(ctx->size_ad, ctx->size_m, tag);
}
]]></artwork></figure>

</section>
<section anchor="test-vector"><name>Test Vector</name>

<!-- Test Vector Description -->

<t>This section gives three test vectors of Rocca-S. The least significant octet of the vector is
shown on the left and the first 128-bit value is shown on the first line.</t>

<figure><artwork><![CDATA[
=== test vector #1===
key =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
nonce =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
associated data =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
plaintext =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ciphertext =
9a c3 32 64 95 a8 d4 14 fe 40 7f 47 b5 44 10 50 
24 81 cf 79 ca b8 c0 a6 69 32 3e 07 71 1e 46 17 
0d e5 b2 fb ba 0f ae 8d e7 c1 fc ca ee fc 36 26
24 fc fd c1 5f 8b b3 e6 44 57 e8 b7 e3 75 57 bb
tag =
8d f9 34 d1 48 37 10 c9 41 0f 6a 08 9c 4c ed 97
91 90 1b 7e 2e 66 12 06 20 2d b2 cc 7a 24 a3 86

=== test vector #2===
key =
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
nonce =
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
associated data =
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
plaintext =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ciphertext =
9d 0c 51 09 41 7c d3 0a 25 ff f5 77 a5 5e d8 6d 
6b 7f 56 53 45 b0 c1 c1 d5 88 a3 4a d5 f8 e9 be 
0a ed 12 b5 87 67 78 a4 b9 b9 3f 0c a7 68 e8 ec
7f 66 3f 4f 40 a1 fe 2f e8 ed 2e df c9 3d 24 13
tag =
9e a3 d6 fb 96 70 7b ab 8a 00 94 d5 83 9c fa 02
dc 06 02 66 ea 25 4c 5b a5 7e 6d 82 10 77 0c 32


=== test vector #3===
key =
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
nonce =
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
associated data =
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
plaintext =
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ciphertext =
37 68 d0 d6 ac 4c 20 e2 6c 8e 65 de 43 13 b7 0f
17 81 47 78 ba 6b 75 0b bc 9e 94 c4 a8 ee 6c 28
79 09 7f f9 5c 8b 68 11 7d f4 1c ba 75 4a 9a fa
dd 9d b9 88 50 c7 74 28 99 0c f6 27 d3 bd 95 0f
tag =
67 e9 4d d4 46 bc 1f bc 71 70 24 f0 b7 bc 8e c3
fb a6 9b 6a b8 8b 0a 13 ab 54 b8 bc aa 20 c5 19
]]></artwork></figure>

<!--
Performance Evaluation
-->
<!-- Performance Evaluation Description -->
<!--
The result of performance evaluations is given in {{the-performance-core-i9}}, and all performance results are given in Gbps.
For the fair comparison, we included Rocca-S as well as other algorithms to
Openssl (3.1.0-dev) and measured their performances. 
We used SNOW-V reference
implementation with SIMD, which was given in {{SNOW-V}}. For Tiaoxin-346 and AEGIS, we
used implementations available at https://github.com/floodyberry/supercop. 
All evaluations were performed on a PC with Intel(R) Core(TM) i9 12900 CPU with 32GB RAMs.
-->

<!--
<table align="center" anchor="the-performance-core-i9">
   <name>Performance on Intel(R) Core(TM) i9-12900K CPU with 32GB RAMs.
   All performance results are given in Gbps.
   </name>
   <tbody>
   <tr>
      <th colspan="2">Encryption Only</th>
      <th colspan="5">Message Size [bytes]</th>
   </tr>
   <tr>
      <th>Algorithms</th>
      <th>Key length</th>
      <th>16384</th>
      <th>8192</th>
      <th>1024</th>
      <th>256</th>
      <th>64</th>
   </tr>
   <tr>
      <td>AEGIS-128</td>
      <td rowspan="3">128-bit</td>
      <td>47.98</td>
      <td>48.01</td>
      <td>46.72</td>
      <td>43.11</td>
      <td>32.90</td>
   </tr>
   <tr>
      <td>AEGIS-128L</td>
      <td>166.06</td>
      <td>164.20</td>
      <td>146.39</td>
      <td>105.34</td>
      <td>36.09</td>
   </tr>
   <tr>
      <td>Tiaoxin-346 v2</td>
      <td>193.18</td>
      <td>190.41</td>
      <td>163.59</td>
      <td>106.21</td>
      <td>38.64</td>
   </tr>
   <tr>
      <td>AEGIS-256</td>
      <td rowspan="7">256-bit</td>
      <td>49.12</td>
      <td>49.10</td>
      <td>48.46</td>
      <td>45.52</td>
      <td>37.20</td>
   </tr>
   <tr>
      <td>AES-256-CBC</td>
      <td>13.72</td>
      <td>13.73</td>
      <td>13.71</td>
      <td>13.67</td>
      <td>13.44</td>
   </tr>
   <tr>
      <td>AES-256-CTR</td>
      <td>81.06</td>
      <td>81.02</td>
      <td>75.28</td>
      <td>61.15</td>
      <td>31.52</td>
   </tr>
   <tr>
      <td>ChaCha20</td>
      <td>13.72</td>
      <td>13.73</td>
      <td>13.71</td>
      <td>13.67</td>
      <td>13.44</td>
   </tr>
   <tr>
      <td>SNOW-V</td>
      <td>67.75</td>
      <td>67.56</td>
      <td>64.43</td>
      <td>57.35</td>
      <td>40.35</td>
   </tr>
   <tr>
      <td>Rocca</td>
      <td>225.91</td>
      <td>223.20</td>
      <td>196.49</td>
      <td>132.15</td>
      <td>52.63</td>
   </tr>
   <tr>
      <td>Rocca-S</td>
      <td>230.07</td>
      <td>227.50</td>
      <td>201.82</td>
      <td>137.54</td>
      <td>54.74</td>
   </tr>
   </tbody>
   <tbody>
   <tr>
      <th colspan="2">AEAD</th>
      <th colspan="5">Message Size [bytes]</th>
   </tr>
   <tr>
      <th>Algorithms</th>
      <th>Key length</th>
      <th>16384</th>
      <th>8192</th>
      <th>1024</th>
      <th>256</th>
      <th>64</th>
   </tr>
   <tr>
      <td>AEGIS-128</td>
      <td rowspan="3">128-bit</td>
      <td>46.60</td>
      <td>45.35</td>
      <td>32.45</td>
      <td>16.33</td>
      <td>5.39</td>
   </tr>
   <tr>
      <td>AEGIS-128L</td>
      <td>150.67</td>
      <td>136.73</td>
      <td>60.29</td>
      <td>20.73</td>
      <td>5.43</td>
   </tr>
   <tr>
      <td>Tiaoxin-346 v2</td>
      <td>174.74</td>
      <td>157.32</td>
      <td>68.17</td>
      <td>22.88</td>
      <td>5.90</td>
   </tr>
   <tr>
      <td>AEGIS-256</td>
      <td rowspan="6">256-bit</td>
      <td>47.79</td>
      <td>46.46</td>
      <td>33.29</td>
      <td>16.76</td>
      <td>5.57</td>
   </tr>
   <tr>
      <td>AES-256-GCM</td>
      <td>60.24</td>
      <td>57.60</td>
      <td>36.40</td>
      <td>16.00</td>
      <td>5.11</td>
   </tr>
   <tr>
      <td>ChaCha20-Poly1305</td>
      <td>21.92</td>
      <td>21.31</td>
      <td>15.07</td>
      <td>6.13</td>
      <td>2.18</td>
   </tr>
   <tr>
      <td>SNOW-V-GCM</td>
      <td>37.82</td>
      <td>36.53</td>
      <td>25.05</td>
      <td>12.09</td>
      <td>3.93</td>
   </tr>
   <tr>
      <td>Rocca</td>
      <td>200.10</td>
      <td>177.62</td>
      <td>69.64</td>
      <td>22.55</td>
      <td>6.13</td>
   </tr>
   <tr>
      <td>Rocca-S</td>
      <td>205.35</td>
      <td>183.78</td>
      <td>74.35</td>
      <td>24.83</td>
      <td>6.73</td>
   </tr>
   </tbody>
</table>
-->

</section>
</section>


  </back>

<!-- ##markdown-source:
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
c7/GNHu5AAA=

-->

</rfc>

