<?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-01" 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="August" day="11"/>

    <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->|      |   ^   |   |   |   |        |
         +------+   |   +---+   +---+        |
            ^     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     ^    K0||K1   |
         |    +---+   |     +---+   |      +---+   |             |
              |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, 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>
<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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
4B8PX/TxqoE1gVpQo/H1ux0t2qrFqYuVp1ilj/8gaKctWqTHU8KmrwA38VkL
0eRY08VnM3zmWlQYWjTuAt+TOUmcCqtk0pPsDwxiyloOoT+ICaR/MvKPMXqh
rKqWksDbkiiHcqOPxcRUAC4gzBfZVJHmyTxcMvHwa6YbjufBf8/riL+q6Rla
cFrK8C8mCfTUrp9gpjEv/jRwX6nMRuF9rTTVLfmQZJhqIcu/fFVeVqDHWOo8
gn/tC3S+EpRZRQHKF856iVhP9J3VMxDK8hDFwQAE8TJPezn7WE78lOwBGqAS
/smNhjYY0nH7v3Q0NP9W0PV541LujeoQfusILXcNkDwU//+1AdI83W8ZoHK/
9HcdILA/TwwOGbIn1ZSe6aS2E1dGl+OajpJwaxCh7H6Kp6dw99iLp2cxMQtp
THBZ7B9pQYdRnCzW3padO6p99wiXe0fysI4Ya6lFItq0rzw5As9T0T56LhbW
qpUEohouuxGnJ8h1Hgs+i5P14NnV9LTaID1uQVYQZRbgM8ozFl69eqUjxl7Y
OBeP6wJfGZbFvuX/31xerBX59nbyyzh/f0zTRRy/f1u/d3ltVdUro+8wt4nL
uDst1m8zp8e8Fn4HYcZZy2LdGWt12bTNWvDQYm2LGY0W69nMnbFun7kOm/aY
azGnwzp9hNLkzOqyrs1sqN9hdpcZlsd4m00bbDZlU4dZM+Zw1oOHXebabOYi
FBAOuGh2WKODDcD1zMO37RkD53naZLyDKLS7jPfYFP5tsm4bb6dTA9elvzIA
4AwwaDHPZq0ea3YRX7fPWja22IF2e6zvspbLgGn6XaNvs77F7CnrctbgrNPB
1fUWIGCxhofYui7rOgyQcZqs1zGKctLQ5AQa+Yb/f3P5RE6+sV6JnPzOmP7n
lROPWS5rQyeJp7ou85rMwgMu2WzGZm3W7TIHWJIzr8c6HjM6U5Sedoe1m6wF
/G8hP8P/vTbr9ZCpWg5ez3qM9+kz0QCM41duUdx6XdYBMYJyLTbt4/+bM2zf
gec9lAHuGgAduBaet2Yoqo6NMtuY0VsPedqboQA0PWRiuynlpM+xba+D0tjv
sC7I+JQ5UwZxMfS63yL8migqM3jSMDwXpcJqYFucugsi1J5iX0FyoKO9Bkoa
9B7QazaMEkFpZgSlQeSA3vX62K4LimDGdjz/5vKaoHxTvVJB+V0x/U8rKE1i
Uc9CHnNI4YJKBZ+547IeMEybeWAZmsCQqMetmQEmAuxJi7gdzAOKTZtZoPRd
BrwKDOm20CqBhQAIjZ4BZgdEEJgf1H3bRfMAzdkgkWAAgM9dBAIQQLrAtM0c
wwN176EEgdSB/XKhoRbAYf0+cuwMNH4XRXnqofkDfISYwGiBWLY8tIZgxwAZ
e4b/gmUDkUETZSH+U+qU2zRAmsAG9qdoacAkAlYgztBHGO92C59AScdBUrht
Zve1gz21b4Wxo+RbUYb6PCYrf1/wOgnWhPbwRJsFuY36Z0m1r1AlWzDFqj5w
CutaybobhLzu9+XqQNrzoQMS4MUa5wQKfpkr/WrPzPFD+WUyP5Lfgky+eJjs
+ku/2SvWczvp55HiwDhf81UULViladqmVff4XVWenuZEG/reFy1O1zDDD5S9
lzsn5SfHkqWphr8jHlAL/PGTgxpN1MewaddE5qNC4tunb4/xGybcEJ89ysAG
ytw5/oIWCzsxm8fxOjrY37+BFjdTE6iyP1sEgbed8jDc7tPWGzdYA+4DIIY+
Sve4WlL2T6zr/q0fbtO/Tve9OHfYWUCc8WoPP7THwz3olTsPwld7O3hhj75t
8f3KWfLXOjs+/pHjUlQwyfN8jsJW96lZuoynQDh5Kb63QZdzXNYerR3oUGPv
tbbK+Xy12H6/H89Li7b3Xo/kLrYxRsY/0zqtz0l5uAhL2nqdfsYrB/r1SbJJ
Nf/G7jR7rfzDnt1vFApajUK5RruTf9RpPYGm9zr5cBwU8LQXEL3fCwI0917L
UDFX5HWra/bz9V63eqZlFx52zG6j8BBktlCy2TD7VvLwSaxP8/XtTse0OsWn
LbNhFZ4CWs1+4anVNputAl4Atv8kXroKuCt02O5DjwsEs/uW2SrQAVjBbJfg
1jEbRZr1zE7rmTQTXFI+0t2913K3V2Go+qZdHD94WKApDH+rQP5W22wXqje7
+pDsxlp8KXH4w7BAjGYJU+HDZtnDIoWbZqdb8rD1HFJKpCaXeQA9u4T98GEB
027bLEjd645t2u0CpWydfLuQGs4d+H8Jl/+HkUmYx0IXu2a30EV4WGBMUF9m
q4Bku2s2C9Vblv5wFz7kU+SrNhpts1/odaPRLFMY/Y7ZKgol6KzioLUbZqf5
PJTq40LzTcu0ClRvNIBKBaQalm32SgYYyha0WLtldsvGbV83mc+xnrgF6P+b
zN9gMjtmp6gz2yUsDUzVKjy0wWAVJUI3Yr/BYratUgnvlGiIjmU2CvzfsEpK
tnXR/Y3mspvh1gRdUACFsp2eaZfIi9kraNj28/2Lx2xlZ7etBP1WoBGMe9Es
Npsl1IQh7hZKgv3sPgPp5KPCZeNWVAbdEl6EYW8V9R44P4WHbd17e8oo1S+C
xdZuWgWObthmvzCa8LBZNETtEpXYMe0C6zV0J+tx21RGK1CcRXUKZGkXGwKM
iiLa0B1FVd3sP9MWFIXLKvGy7C6MXVEI+rofqAA0zHbR3Opk+1bbZJWpK7sH
zkNB2ECCi0UbLbNX1Cy6DikaJrjAgPS1iFEHLm4WX3DvRpw1VNwqavx6IE4K
4d6rvVWw91VOt3mhM4vFJy9oo/liq87J4vQhewdXVMSh41JmZO+SR9wJ8es0
eKIKfhc7WNOmVogaV/xePwWMosngJnTWc7HTVh4wce+HfIHfk4CYfrlZqS3y
EQ/vfJdHEFQvg9VNrqlDrSmEdYQHckVqF6jj+QF779zhruso2IQAhlV+uvjJ
sqxGu1Xd07MVmd5h1mXkr8RWXYB0rPbTD2aYjBHfPx3qeEY19pMDbZtyz+5s
sZnN5OQmOw1cZ/Ee99cfMKg2uKCkKJBgCXeXR+z9W3Z5NJ7g8TrHF+xo4tzg
99qjiC9hKMM0dZUFRBvqaae07/ElbZ535ScCkI54UgDna2eB390df/qwC4yT
5RE8HDcEGi79KKK8yWB4Qv+wDYz3BvdMPxNSJI4hoM3oU5+2hWdh74KDXw53
4mDpu1gHt2K959PDwR8Z7t6mSv8H6nYJgyq7AAA=

-->

</rfc>

