<?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.17 (Ruby 3.0.2) -->


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

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


<rfc ipr="trust200902" docName="draft-nakano-rocca-s-02" 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="November" day="05"/>

    <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 -->
<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[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|)
      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 and 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 provide security against related-key and known-key superposition attacks (as is the case of all known block ciphers).</t>

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

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

<t>Rocca-S is secure against the following attacks:
<!-- 2. Distinguishing Attack: 256-bit security against distinguishing attacks.--></t>

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

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

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

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

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

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

<t>IANA has assigned value TBD in the AEAD Algorithms registry to AEAD_ROCCA.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC2119;
&RFC5116;
&RFC8174;


    </references>

    <references title='Informative References'>

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


    </references>


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

<!-- Software Implementation Description -->

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

#define MAKE_TAG(sizeAD, sizeM, tag) \
  SET_AD_BITLEN_MSG_BITLEN(sizeAD, sizeM) \
  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 =
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 =
b7 30 e6 b6 19 f6 3c cf 7e 69 73 59 14 d7 6a b5
2f 70 36 0c 8a 65 4b ad 99 13 20 ef 95 2c 40 a2

=== 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 =
32 6e 63 57 e5 00 34 a7 75 0f c2 01 31 aa 6f 76
19 ed 23 db 5b da d0 00 28 20 cc 70 7f 35 9f 8d
]]></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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
jAw7Ha/oxCzsPJB/EyWo01pZsTh7uqXlL+mK2sT5V3ZOyyZom+mK624ZHWu9
pAPtpbOmDpUytJXakUolpCtp8DQ3DQFc4rQIxOlAbu4jgHwVbfCQNnksCx57
o0611FaE0VHkeL5GILeayVXfYic0Vzuh60GoOos0SEIGsTsbVePx4GzwDHsp
C9IxoJE87Y1gsMkPh+lxJXoQhyeY4aLgkDwjfHdFh3eZ4hx9XDyMkWDyMaBj
tRDZeWQzvTpdf0etkpPvcwVoQPDQp8ynwJ4+IUGdIZp8amon3AIK4MarWvVs
rTrWqmMtCONx2QtG18Bua3E+tg4/zcSJ08hw8788O5hEMls6ccXk8UTMuNYX
u8ilX/p6j2sZcBRWACXLdjBDRRKF6+ppTV926cO1PKDtGX010gVAkVoF+ega
eXksCy2meqH69P2SL4Nwa85fa898/E4JbmDPPo5ib+FPC8/w3OQ5LokSwb74
FvfVydHHq/HxpyOZMK007WquxPEf9QIMs/W5EqPx26sfTs+HJ6JgCYzJ4O0T
rYwng8nR1dm7kSzBulXDiLdrDqVk2CpLDicf2K9o5zfQo94VuXU/Zzuzb3U+
/wz/facXI437c661tBiG7lgKfxyv8Gj5nfGVUUb4ij7R8yX+LiUlLkivLKuI
+NVyeYW3m6vIx6V5FdJa7OpqCXc++0MVyqV9p6VslWXNqVJFuk1qZupAkaTW
lyCsOLVpVTYHt7IKPkxKASfrpeC2rBRwLzy4TUrRVt+k4K2GKo/xxIRKVRSU
t7JkNaXF0dnw/PDo6vjs6vR4Mjk9ujo6OwR9WsEVfeA43FXZPwFt6e5nRutt
KhUcok7rKq5W4PX338Pow1+zWv1OL2uVlH39GvjxD716vqy9o6xdUra5o2yz
pGxrR9lWSdn2jrLtkrKdHWU7JWW7O8p2S8r2dpTtlZTtY9mG/shqFB9ZxUd2
8VGz+KhVfNQWj1LeeXN6fn45ORdsW6mAVOyzClz+Af/VeGycKIqcOCclRkmJ
CtN0zfHZ8eQKGrnIqjFUT/RUPE6e/3FwOW69uzgE6IS3kshb3IssFQrhou7O
+H3yYPQzIfH5uxw8EJDLjxcTArirgU+ybo0Ni1CG5xcfrybngPFwcFpx4y9C
pMBZrkiN5QtS++x7Qarv2MuXvij1q0SbDsggvfV3FYJRf61e4FojYI2vUDrb
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
U6X/A12zzYuluwAA

-->

</rfc>

