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


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

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


<rfc ipr="trust200902" docName="draft-nakano-rocca-s-06" 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>The University of Osaka</organization>
      <address>
        <postal>
          <street>1-5 Yamadaoka, Suita-shi, Osaka</street>
          <code>565-0871</code>
          <country>Japan</country>
        </postal>
        <email>takanori.isobe@ist.osaka-u.ac.jp</email>
      </address>
    </author>

    <date year="2026" month="January" day="28"/>

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

    <abstract>


<?line 231?>

<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>


<?line 238?>

<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 for
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>

<t>Rocca-S has been designed as an encryption algorithm for a high speed communication such as future internet and beyond 5G mobile communications.
Rocca-S achieves an encryption/decryption speed of more than 200 Gbps in both the raw encryption scheme and the AEAD scheme on an Intel(R) Core(TM) i9-12900K.
It can provide 256-bit and 128-bit security against key recovery attacks in classical and quantum adversaries respectively.
The high throughput of Rocca-S can be achieved by utilizing the AES-NI <xref target="AES-NI"/>.
A similar approach has been taken by the AEGIS family <xref target="AEGIS"/> and Tiaoxin-346 <xref target="TIAOXIN"/>, both two submissions to the CAESAR competition <xref target="CAESAR"/>.
SNOW-V <xref target="SNOW-V"/> also uses the AES round function as a component so AES-NI can be used.</t>

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

<t>In this document, we present an AES-based AEAD encryption scheme
with a 256-bit key and 256-bit tag called Rocca-S.</t>

<t>To achieve such a dramatically fast encryption/decryption speed,
Rocca-S adopts the design principles 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.</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>

</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="algorithm-description"><name>Algorithm 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 16-octet value.
For the constants Z0 and Z1,
we utilize the same ones as Tiaoxin-346 <xref target="TIAOXIN"/>.</t>

<t><list style="numbers" type="1">
  <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>Truncate(X, n): the result of truncating X to n bits.</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">|X|</spanx> is multiple of 256 and <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</spanx> where <spanx style="verb">X[i]_0</spanx> and <spanx style="verb">X[i]_1</spanx> are 128-bit.</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 and
   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,X,Y)</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,X,Y)</spanx> of Rocca-S consists of the state S and two
blocks <spanx style="verb">(X,Y)</spanx>.
If denoting the output by <spanx style="verb">Snew</spanx>, <spanx style="verb">Snew:=R(S,X,Y)</spanx> can be defined as follows:</t>

<figure><artwork><![CDATA[
Snew[0] = S[6] ^ S[1]
Snew[1] = AES(S[0],X)
Snew[2] = AES(S[1],S[0])
Snew[3] = AES(S[2],S[6])
Snew[4] = AES(S[3],Y)
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|<-X  +>|AES| +>|XOR| +>|AES|  |AES|<-Y  +>|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>.
The output is the corresponding ciphertext <spanx style="verb">C</spanx> and a 256-bit tag <spanx style="verb">T</spanx>.</t>

<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 generated in a way that is uniformly random or pseudorandom.</t>
  <t><spanx style="verb">PADN(N)</spanx>, where <spanx style="verb">N</spanx> is the nonce, which MUST be distinct for any particular value of the key.
Recommended nonce formation can be found in <xref target="RFC5116"/>.</t>
</list></t>

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

<!-- Initialization Description -->

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

<figure><artwork><![CDATA[
  K0||K1 = K
  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>

<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)
   endfor
]]></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)
   endfor
]]></artwork></figure>

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

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

<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>

</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(K, N, AD, M)
      S = Initialization(K, N)
      if |AD| > 0 then
         S = ProcessAD(S,AD)
      endif   
      if |M| > 0 then
         (S, C) =  Encryption(S, M)
         Truncate(C, |M|)
      endif   
      T = Finalization(S, |AD|, |M|)
      return (C, T)
      
   procedure RoccaDecrypt(K, N, AD, C, T)
      S = Initialization(K, N)
      if |AD| > 0 then
         S = ProcessAD(S, AD)
      endif
      if |C| > 0 then
         (M, S) = Decryption(S, C)
         Truncate(M, |C|)
      endif   
      if T == Finalization(S, |AD|, |C|) then
         return M
      else
         return nil
      endif   

   procedure Initialization(K, N)
      K0||K1 = K
      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)
      endfor   
      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)
      AD = PAD(AD)
      d = |AD|/256
      for i = 0 to d - 1 do
         S =  R(S, AD[i]_0, AD[i]_1)
      endfor
      return S

   procedure Encryption(S, M, C)
      M = PAD(M)
      m = |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)
      endfor
      return (S, C)

   procedure Decryption(S, C)
      C = PAD(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)
      endfor
      return (S, M)

   procedure Finalization(S, ad_len, m_len)
      for i = 0 to 15 do
         S = R(S, LE128(ad_len), LE128(m_len))
      endfor
      T = (S[0] ^ S[1] ^ S[2] ^ S[3]) || (S[4] ^ S[5] ^ S[6])
      return T
]]></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 for 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 a 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 a 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</spanx> after padding with zeros.</t>

<t>The 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>

<t>When Rocca-S is initialized with shorter key than 256-bit, the initial value for S[6] in the initialization phase will be changed.
S[6] is initialized as <spanx style="verb">S[6]= 1||ZERO(127)</spanx> when 128-bit key is given, and <spanx style="verb">S[6]= 11||ZERO(126)</spanx> for 192-bit key.
The key-length-dependent initial value is introduced thanks to the note by Takeuchi et al. <xref target="ePrint2024/901"/> who pointed out the possibility of the identical initial states due to key expansion.</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 or is not stateful in the meanings of 
 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 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>Rocca-S provides 128-bit security against key-recovery and forgery attacks against quantum adversary with classical online queries.
Rocca-S does not claim security against online quantum superposition attacks.</t>

<!--
There exist no quantum attacks for key-recovery and forgery (in the 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).
-->

<!--
Parallel Modes
=======================
Rocca-SX2 and Rocca-SX4 are the mode of operation for parallel execution of Rocca-S.
Rocca-SX2 performs two Rocca-S instances in parallel, and Rocca-SX4 does four instances.
The benefit of Rocca-SX2 and Rocca-SX4 is achieving even higher performance without changing the design of the underlyning algorithm by utilizing the instruction sets which are available in some CPUs.


## Rocca-SX2

Since Rocca-SX2 has two instances of Rocca-S,
the internal state of first and second instances can be denoted as `S1` and `S2` respectively.

### Initialization


### Processing the Associated Data


### Encryption



### Finalization

## Rocca-SX4

Rocca-SX4 is
### Initialization

### Processing the Associated Data

### Encryption

### Finalization
-->

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

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

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

<t><list style="numbers" type="1">
  <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>

<t>The details can be found in the paper <xref target="ROCCA-S"/>.</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 anchor="tag-verification-failure"><name>Tag Verification Failure</name>

<t>When the tag verification fails during the decryption phase, it is recommended to erase the plaintext and computed tag.</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='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC5116;
&RFC8174;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="KDF" target="https://doi.org/10.6028/NIST.SP.800-108r1-upd1">
  <front>
    <title>Recommendation for Key Derivation Using Pseudorandom Functions</title>
    <author initials="L." surname="Chen" fullname="Lily Chen">
      <organization></organization>
    </author>
    <date year="2022"/>
  </front>
<refcontent>NIST Special Publication 800-108</refcontent></reference>
<reference anchor="ROCCA-S" target="https://doi.org/10.1007/978-3-031-50594-2_12">
  <front>
    <title>An Ultra-High Throughput AES-Based Authenticated Encryption Scheme for 6G: Design and Implementation</title>
    <author initials="R." surname="Anand" fullname="Ravi Anand">
      <organization></organization>
    </author>
    <author initials="S." surname="Banik" fullname="Subhadeep Banik">
      <organization></organization>
    </author>
    <author initials="A." surname="Caforio" fullname="Andrea Caforio">
      <organization></organization>
    </author>
    <author initials="K." surname="Fukushima" fullname="Kazuhide Fukushima">
      <organization></organization>
    </author>
    <author initials="T." surname="Isobe" fullname="Takanori Isobe">
      <organization></organization>
    </author>
    <author initials="S." surname="Kiyomoto" fullname="Shisaku Kiyomoto">
      <organization></organization>
    </author>
    <author initials="F." surname="Liu" fullname="Fukang Liu">
      <organization></organization>
    </author>
    <author initials="Y." surname="Nakano" fullname="Yuto Nakano">
      <organization></organization>
    </author>
    <author initials="K." surname="Sakamoto" fullname="Kosei Sakamoto">
      <organization></organization>
    </author>
    <author initials="N." surname="Takeuchi" fullname="Nobuyuki Takeuchi">
      <organization></organization>
    </author>
    <date year="2024"/>
  </front>
<refcontent>28th European Symposium on Research in Computer Security, ESORICS 2023</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="H." surname="Wu" fullname="Hongjun Wu">
      <organization></organization>
    </author>
    <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-upd1">
  <front>
    <title>FIPS 197 Advanced Encryption Standard (AES)</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2001"/>
  </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(R) 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>
<reference anchor="ePrint2024/901" target="https://eprint.iacr.org/2024/901">
  <front>
    <title>Practical Committing Attacks against Rocca-S</title>
    <author initials="R." surname="Takeuchi" fullname="Ryunosuke Takeuchi">
      <organization></organization>
    </author>
    <author initials="Y." surname="Todo" fullname="Yosuke Todo">
      <organization></organization>
    </author>
    <author initials="T." surname="Iwata" fullname="Tetsu Iwata">
      <organization></organization>
    </author>
    <date year="2024"/>
  </front>
</reference>


    </references>

</references>


<?line 854?>

<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 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 =
00000000000000000000000000000000
00000000000000000000000000000000
nonce =
00000000000000000000000000000000
associated data =
00000000000000000000000000000000
00000000000000000000000000000000
plaintext =
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
ciphertext =
9ac3326495a8d414fe407f47b5441050
2481cf79cab8c0a669323e07711e4617
0de5b2fbba0fae8de7c1fccaeefc3626
24fcfdc15f8bb3e64457e8b7e37557bb
tag =
8df934d1483710c9410f6a089c4ced97
91901b7e2e661206202db2cc7a24a386

=== test vector #2===
key =
01010101010101010101010101010101
01010101010101010101010101010101
nonce =
01010101010101010101010101010101
associated data =
01010101010101010101010101010101
01010101010101010101010101010101
plaintext =
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
ciphertext =
559ecb253bcfe26b483bf00e9c748345
978ff921036a6c1fdcb712172836504f
bc64d430a73fc67acd3c3b9c1976d807
90f48357e7fe0c0682624569d3a658fb
tag =
c1fdf39762eca77da8b0f1dae5fff75a
92fb0adfa7940a28c8cadbbbe8e4ca8d

=== test vector #3===
key =
0123456789abcdef0123456789abcdef
0123456789abcdef0123456789abcdef
nonce =
0123456789abcdef0123456789abcdef
associated data =
0123456789abcdef0123456789abcdef
0123456789abcdef0123456789abcdef
plaintext =
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
ciphertext =
b5fc4e2a72b86d1a133c0f0202bdf790
af14a24b2cdb676e427865e12fcc9d30
21d18418fc75dc1912dd2cd79a3beeb2
a98b235de2299b9dda93fd2b5ac8f436
tag =
a078e1351ef2420c8e3a93fd31f5b113
5b15315a5f205534148efbcd63f79f00

=== test vector #4===
key =
11111111111111111111111111111111
22222222222222222222222222222222
nonce =
44444444444444444444444444444444
associated data =

plaintext =
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7
ciphertext =
e8c7adcc58302893b253c544f5d8e62d
8fbd81160c2f4a95123962088d29f106
422d3f26882fd7b1
tag =
f650eba86fb19dc14a3bbe8bbfad9ec5
b5dd77a4c3f83d2c19ac0393dd47928f

=== test vector #5===
key =
11111111111111111111111111111111
22222222222222222222222222222222
nonce =
44444444444444444444444444444444
associated data =

plaintext =
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
ciphertext =
e8c7adcc58302893b253c544f5d8e62d
8fbd81160c2f4a95123962088d29f106
422d3f26882fd7b1fdee5680476e7e6e
tag =
49bb0ec78cab2c5f40a535925fa2d827
52aba9606426537fc774f06fc0f6fc12

=== test vector #6===
key =
11111111111111111111111111111111
22222222222222222222222222222222
nonce =
44444444444444444444444444444444
associated data =

plaintext =
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
b0b1b2b3b4b5b6b7b8
ciphertext =
e8c7adcc58302893b253c544f5d8e62d
8fbd81160c2f4a95123962088d29f106
422d3f26882fd7b1fdee5680476e7e6e
1fc473cdb2dded85c6
tag =
c674604803963a4b51685fda1f2aa043
934736db2fbab6d188a09f5e0d1c0bf3

=== test vector #7===
key =
11111111111111111111111111111111
22222222222222222222222222222222
nonce =
44444444444444444444444444444444
associated data =

plaintext =
808182838485868788898a8b8c8d8e8f
909192939495969798999a9b9c9d9e9f
a0a1a2a3a4a5a6a7a8a9aaabacadaeaf
b0b1b2b3b4b5b6b7b8b9babbbcbdbebf
ciphertext =
e8c7adcc58302893b253c544f5d8e62d
8fbd81160c2f4a95123962088d29f106
422d3f26882fd7b1fdee5680476e7e6e
1fc473cdb2dded85c692344f3ab85af0
tag =
850599a6624a3e936a77768c7717b926
cc519081730df447127654d6980bcb02
]]></artwork></figure>

</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>

<t>We thank Ryunosuke Takeuchi, Yosuke Todo and Tetsu Iwata for their analysis and pointing out the possibility of identical initial states due to the key expansion.</t>

</section>


  </back>

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

-->

</rfc>

