<?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.10) -->


<!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-04" 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="September" day="12"/>

    <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 attacks and 192-bit security against forgery 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 claim security against online superposition attacks.</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: 192-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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
93u959PDwR8Zbt+mSv8HawBEIhK7AAA=

-->

</rfc>

