<?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.23 (Ruby 2.6.10) -->


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

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


<rfc ipr="trust200902" docName="draft-nakano-rocca-s-03" 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="2023" month="March" day="02"/>

    <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. 
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 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 7 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[0] = S[0] ^ K0, S[1] = S[1] ^ K0,
S[2] = S[2] ^ K1, S[3] = S[3] ^ K0,
S[4] = S[4] ^ K0, S[5] = S[5] ^ K1,
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 -->
<!--
After the above three phases, two 128-bit keys `K0` and `K1` are first XORed with the state `S` in the following way:

~~~
   S[1] = S[1] ^ K0,
   S[2] = S[2] ^ K1.
~~~
-->

<t>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[0] = S[0] ^ K0, 
      S[1] = S[1] ^ K0,
      S[2] = S[2] ^ K1,
      S[3] = S[3] ^ K0,
      S[4] = S[4] ^ K0,
      S[5] = S[5] ^ K1,
      S[6] = 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|)
      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->|      |   ^   |   |   |   |        |
         +------+   |   +---+   +---+        |
            ^     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 +-+-+         +-+-+          +-+-+
                |             |              |
                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 and forgery attacks in the nonce-respecting setting.
Rocca-S also provides 128-bit key-committing security.
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:
<!-- 2. Distinguishing Attack: 256-bit security against distinguishing attacks.--></t>

<t><list style="numbers">
  <t>Key-Recovery Attack: 256-bit security against key-recovery 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 has assigned value TBD in the AEAD Algorithms registry to AEAD_ROCCA.</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[0] = xor(state[0], k[0]); \
  state[1] = xor(state[1], k[0]); \
  state[2] = xor(state[2], k[1]); \
  state[3] = xor(state[3], k[0]); \
  state[4] = xor(state[4], k[0]); \
  state[5] = xor(state[5], k[1]); \
  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) \
  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 =
55 9e cb 25 3b cf e2 6b 48 3b f0 0e 9c 74 83 45
97 8f f9 21 03 6a 6c 1f dc b7 12 17 28 36 50 4f
bc 64 d4 30 a7 3f c6 7a cd 3c 3b 9c 19 76 d8 07
90 f4 83 57 e7 fe 0c 06 82 62 45 69 d3 a6 58 fb

tag =
c1 fd f3 97 62 ec a7 7d a8 b0 f1 da e5 ff f7 5a
92 fb 0a df a7 94 0a 28 c8 ca db bb e8 e4 ca 8d

=== 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 =
b5 fc 4e 2a 72 b8 6d 1a 13 3c 0f 02 02 bd f7 90
af 14 a2 4b 2c db 67 6e 42 78 65 e1 2f cc 9d 30
21 d1 84 18 fc 75 dc 19 12 dd 2c d7 9a 3b ee b2
a9 8b 23 5d e2 29 9b 9d da 93 fd 2b 5a c8 f4 36
tag =
a0 78 e1 35 1e f2 42 0c 8e 3a 93 fd 31 f5 b1 13
5b 15 31 5a 5f 20 55 34 14 8e fb cd 63 f7 9f 00
]]></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>
<section numbered="no" anchor="acknowledgements"><name>Acknowledgements</name>

<t>This draft is partially supported by a contract of &quot;Research and development on new generation cryptography for secure wireless communication services&quot; among &quot;Research and Development for Expansion of Radio Wave Resources (JPJ000254)&quot;, which was supported by the Ministry of Internal Affairs and Communications, Japan.</t>

</section>


  </back>

<!-- ##markdown-source:
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
VslquwAA

-->

</rfc>

