<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-fiat-shamir-04" category="info" consensus="true" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title>Fiat-Shamir Transformation</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-fiat-shamir-04"/>
    <author fullname="Michele Orrù">
      <organization>CNRS</organization>
      <address>
        <email>m@orru.net</email>
      </address>
    </author>
    <author fullname="Cathie Yun">
      <organization>Apple, Inc.</organization>
      <address>
        <email>cathieyun@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>zero knowledge</keyword>
    <keyword>hash</keyword>
    <abstract>
      <?line 157?>

<t>This document describes the Fiat-Shamir transformation, which allows making a public-coin protocol non-interactive by means of a cryptographic hash function.</t>
      <t>It specifies how the hash function is employed, how prover messages are encoded as hash-function input, and how verifier messages are decoded from the hash function's output, as well as the serialization and deserialization of the non-interactive argument string.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mmaker.github.io/draft-irtf-cfrg-sigma-protocols/draft-irtf-cfrg-fiat-shamir.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-irtf-cfrg-fiat-shamir/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Crypto Forum Research Group mailing list (<eref target="mailto:cfrg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cfrg"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cfrg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mmaker/draft-irtf-cfrg-sigma-protocols"/>.</t>
    </note>
  </front>
  <middle>
    <?line 163?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Fiat-Shamir transformation turns a <em>public-coin</em> interactive argument into a non-interactive argument by replacing the verifier's random messages with the output of a cryptographic hash function.</t>
      <t>It is notoriously easy to get the Fiat-Shamir transformation wrong, introducing critical security bugs <xref target="BPW16"/>, <xref target="DMWG23"/>, <xref target="FROZENHEART"/>, <xref target="SOLANA-ZK"/>. This specification provides a non-interactive argument (NARG) prover and verifier, together with security requirements for each component they rely on:</t>
      <ul spacing="normal">
        <li>
          <t>a duplex sponge, prescribing how to interact with the cryptographic hash function (<xref target="hash-instantiations"/>);</t>
        </li>
        <li>
          <t>a set of codecs, describing how each prover and verifier message talks to the duplex sponge (<xref target="codecs"/>);</t>
        </li>
        <li>
          <t>a serialization and deserialization procedure for the NARG string produced by the prover (<xref target="narg-string"/>).</t>
        </li>
      </ul>
      <t>This transformation is also well-suited for recursive proving, since the in-circuit cost of recomputing the Fiat-Shamir challenges is low. It is compatible with arithmetization-friendly hash functions (e.g. Poseidon2 <xref target="POSEIDON2"/>) that operate natively on field elements. See <xref target="CO25"/> for the general construction.</t>
      <t>Other types of non-interactive transformations (with and without random oracles) are possible, but outside the scope of this specification.</t>
      <figure anchor="fig-fiat-shamir-prover">
        <name>Non-interactive prover for the Fiat-Shamir transformation</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="848" width="568" viewBox="0 0 568 848" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,832" fill="none" stroke="black"/>
              <path d="M 24,192 L 24,784" fill="none" stroke="black"/>
              <path d="M 184,192 L 184,784" fill="none" stroke="black"/>
              <path d="M 328,160 L 328,192" fill="none" stroke="black"/>
              <path d="M 328,256 L 328,288" fill="none" stroke="black"/>
              <path d="M 328,336 L 328,368" fill="none" stroke="black"/>
              <path d="M 328,416 L 328,448" fill="none" stroke="black"/>
              <path d="M 328,496 L 328,528" fill="none" stroke="black"/>
              <path d="M 328,624 L 328,656" fill="none" stroke="black"/>
              <path d="M 328,704 L 328,736" fill="none" stroke="black"/>
              <path d="M 432,160 L 432,192" fill="none" stroke="black"/>
              <path d="M 432,256 L 432,288" fill="none" stroke="black"/>
              <path d="M 432,336 L 432,368" fill="none" stroke="black"/>
              <path d="M 432,416 L 432,448" fill="none" stroke="black"/>
              <path d="M 432,496 L 432,528" fill="none" stroke="black"/>
              <path d="M 432,624 L 432,656" fill="none" stroke="black"/>
              <path d="M 432,704 L 432,736" fill="none" stroke="black"/>
              <path d="M 464,80 L 464,112" fill="none" stroke="black"/>
              <path d="M 464,160 L 464,192" fill="none" stroke="black"/>
              <path d="M 464,256 L 464,288" fill="none" stroke="black"/>
              <path d="M 464,336 L 464,368" fill="none" stroke="black"/>
              <path d="M 464,416 L 464,448" fill="none" stroke="black"/>
              <path d="M 464,496 L 464,528" fill="none" stroke="black"/>
              <path d="M 464,624 L 464,656" fill="none" stroke="black"/>
              <path d="M 464,704 L 464,736" fill="none" stroke="black"/>
              <path d="M 496,120 L 496,152" fill="none" stroke="black"/>
              <path d="M 496,200 L 496,248" fill="none" stroke="black"/>
              <path d="M 496,296 L 496,328" fill="none" stroke="black"/>
              <path d="M 496,376 L 496,408" fill="none" stroke="black"/>
              <path d="M 496,456 L 496,488" fill="none" stroke="black"/>
              <path d="M 496,576 L 496,616" fill="none" stroke="black"/>
              <path d="M 496,664 L 496,696" fill="none" stroke="black"/>
              <path d="M 520,80 L 520,112" fill="none" stroke="black"/>
              <path d="M 536,160 L 536,192" fill="none" stroke="black"/>
              <path d="M 536,256 L 536,288" fill="none" stroke="black"/>
              <path d="M 536,416 L 536,448" fill="none" stroke="black"/>
              <path d="M 536,624 L 536,656" fill="none" stroke="black"/>
              <path d="M 544,336 L 544,368" fill="none" stroke="black"/>
              <path d="M 544,496 L 544,528" fill="none" stroke="black"/>
              <path d="M 544,704 L 544,736" fill="none" stroke="black"/>
              <path d="M 560,32 L 560,832" fill="none" stroke="black"/>
              <path d="M 8,32 L 560,32" fill="none" stroke="black"/>
              <path d="M 464,80 L 520,80" fill="none" stroke="black"/>
              <path d="M 112,96 L 456,96" fill="none" stroke="black"/>
              <path d="M 464,112 L 520,112" fill="none" stroke="black"/>
              <path d="M 328,160 L 432,160" fill="none" stroke="black"/>
              <path d="M 464,160 L 536,160" fill="none" stroke="black"/>
              <path d="M 96,176 L 320,176" fill="none" stroke="black"/>
              <path d="M 440,176 L 456,176" fill="none" stroke="black"/>
              <path d="M 24,192 L 184,192" fill="none" stroke="black"/>
              <path d="M 328,192 L 432,192" fill="none" stroke="black"/>
              <path d="M 464,192 L 536,192" fill="none" stroke="black"/>
              <path d="M 328,256 L 432,256" fill="none" stroke="black"/>
              <path d="M 464,256 L 536,256" fill="none" stroke="black"/>
              <path d="M 184,272 L 320,272" fill="none" stroke="black"/>
              <path d="M 440,272 L 456,272" fill="none" stroke="black"/>
              <path d="M 328,288 L 432,288" fill="none" stroke="black"/>
              <path d="M 464,288 L 536,288" fill="none" stroke="black"/>
              <path d="M 328,336 L 432,336" fill="none" stroke="black"/>
              <path d="M 464,336 L 544,336" fill="none" stroke="black"/>
              <path d="M 192,352 L 320,352" fill="none" stroke="black"/>
              <path d="M 440,352 L 456,352" fill="none" stroke="black"/>
              <path d="M 328,368 L 432,368" fill="none" stroke="black"/>
              <path d="M 464,368 L 544,368" fill="none" stroke="black"/>
              <path d="M 328,416 L 432,416" fill="none" stroke="black"/>
              <path d="M 464,416 L 536,416" fill="none" stroke="black"/>
              <path d="M 184,432 L 320,432" fill="none" stroke="black"/>
              <path d="M 440,432 L 456,432" fill="none" stroke="black"/>
              <path d="M 328,448 L 432,448" fill="none" stroke="black"/>
              <path d="M 464,448 L 536,448" fill="none" stroke="black"/>
              <path d="M 328,496 L 432,496" fill="none" stroke="black"/>
              <path d="M 464,496 L 544,496" fill="none" stroke="black"/>
              <path d="M 192,512 L 320,512" fill="none" stroke="black"/>
              <path d="M 440,512 L 456,512" fill="none" stroke="black"/>
              <path d="M 328,528 L 432,528" fill="none" stroke="black"/>
              <path d="M 464,528 L 544,528" fill="none" stroke="black"/>
              <path d="M 328,624 L 432,624" fill="none" stroke="black"/>
              <path d="M 464,624 L 536,624" fill="none" stroke="black"/>
              <path d="M 184,640 L 320,640" fill="none" stroke="black"/>
              <path d="M 440,640 L 456,640" fill="none" stroke="black"/>
              <path d="M 328,656 L 432,656" fill="none" stroke="black"/>
              <path d="M 464,656 L 536,656" fill="none" stroke="black"/>
              <path d="M 328,704 L 432,704" fill="none" stroke="black"/>
              <path d="M 464,704 L 544,704" fill="none" stroke="black"/>
              <path d="M 192,720 L 320,720" fill="none" stroke="black"/>
              <path d="M 440,720 L 456,720" fill="none" stroke="black"/>
              <path d="M 328,736 L 432,736" fill="none" stroke="black"/>
              <path d="M 464,736 L 544,736" fill="none" stroke="black"/>
              <path d="M 184,768 L 320,768" fill="none" stroke="black"/>
              <path d="M 24,784 L 184,784" fill="none" stroke="black"/>
              <path d="M 8,832 L 560,832" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="504,696 492,690.4 492,701.6" fill="black" transform="rotate(90,496,696)"/>
              <polygon class="arrowhead" points="504,616 492,610.4 492,621.6" fill="black" transform="rotate(90,496,616)"/>
              <polygon class="arrowhead" points="504,488 492,482.4 492,493.6" fill="black" transform="rotate(90,496,488)"/>
              <polygon class="arrowhead" points="504,408 492,402.4 492,413.6" fill="black" transform="rotate(90,496,408)"/>
              <polygon class="arrowhead" points="504,328 492,322.4 492,333.6" fill="black" transform="rotate(90,496,328)"/>
              <polygon class="arrowhead" points="504,248 492,242.4 492,253.6" fill="black" transform="rotate(90,496,248)"/>
              <polygon class="arrowhead" points="504,152 492,146.4 492,157.6" fill="black" transform="rotate(90,496,152)"/>
              <polygon class="arrowhead" points="464,640 452,634.4 452,645.6" fill="black" transform="rotate(0,456,640)"/>
              <polygon class="arrowhead" points="464,432 452,426.4 452,437.6" fill="black" transform="rotate(0,456,432)"/>
              <polygon class="arrowhead" points="464,272 452,266.4 452,277.6" fill="black" transform="rotate(0,456,272)"/>
              <polygon class="arrowhead" points="464,176 452,170.4 452,181.6" fill="black" transform="rotate(0,456,176)"/>
              <polygon class="arrowhead" points="464,96 452,90.4 452,101.6" fill="black" transform="rotate(0,456,96)"/>
              <polygon class="arrowhead" points="448,720 436,714.4 436,725.6" fill="black" transform="rotate(180,440,720)"/>
              <polygon class="arrowhead" points="448,512 436,506.4 436,517.6" fill="black" transform="rotate(180,440,512)"/>
              <polygon class="arrowhead" points="448,352 436,346.4 436,357.6" fill="black" transform="rotate(180,440,352)"/>
              <polygon class="arrowhead" points="328,768 316,762.4 316,773.6" fill="black" transform="rotate(0,320,768)"/>
              <polygon class="arrowhead" points="328,640 316,634.4 316,645.6" fill="black" transform="rotate(0,320,640)"/>
              <polygon class="arrowhead" points="328,432 316,426.4 316,437.6" fill="black" transform="rotate(0,320,432)"/>
              <polygon class="arrowhead" points="328,272 316,266.4 316,277.6" fill="black" transform="rotate(0,320,272)"/>
              <polygon class="arrowhead" points="328,176 316,170.4 316,181.6" fill="black" transform="rotate(0,320,176)"/>
              <polygon class="arrowhead" points="200,720 188,714.4 188,725.6" fill="black" transform="rotate(180,192,720)"/>
              <polygon class="arrowhead" points="200,512 188,506.4 188,517.6" fill="black" transform="rotate(180,192,512)"/>
              <polygon class="arrowhead" points="200,352 188,346.4 188,357.6" fill="black" transform="rotate(180,192,352)"/>
              <g class="text">
                <text x="36" y="52">NARG</text>
                <text x="84" y="52">Prover</text>
                <text x="164" y="52">(session_id,</text>
                <text x="256" y="52">instance,</text>
                <text x="332" y="52">witness)</text>
                <text x="60" y="100">session_id</text>
                <text x="492" y="100">Init</text>
                <text x="52" y="180">instance</text>
                <text x="376" y="180">encode[0]</text>
                <text x="500" y="180">Absorb</text>
                <text x="80" y="212">Interactive</text>
                <text x="156" y="212">Prover</text>
                <text x="68" y="228">(instance,</text>
                <text x="148" y="228">witness)</text>
                <text x="248" y="244">prover_msg[1]</text>
                <text x="376" y="276">encode[1]</text>
                <text x="500" y="276">Absorb</text>
                <text x="256" y="324">verifier_msg[1]</text>
                <text x="376" y="356">decode[1]</text>
                <text x="504" y="356">Squeeze</text>
                <text x="248" y="404">prover_msg[2]</text>
                <text x="376" y="436">encode[2]</text>
                <text x="500" y="436">Absorb</text>
                <text x="256" y="484">verifier_msg[2]</text>
                <text x="376" y="516">decode[2]</text>
                <text x="504" y="516">Squeeze</text>
                <text x="256" y="548">.</text>
                <text x="496" y="548">.</text>
                <text x="256" y="564">.</text>
                <text x="496" y="564">.</text>
                <text x="256" y="580">.</text>
                <text x="256" y="612">prover_msg[k-1]</text>
                <text x="384" y="644">encode[k-1]</text>
                <text x="500" y="644">Absorb</text>
                <text x="264" y="692">verifier_msg[k-1]</text>
                <text x="384" y="724">decode[k-1]</text>
                <text x="504" y="724">Squeeze</text>
                <text x="248" y="756">prover_msg[k]</text>
                <text x="88" y="820">narg_string</text>
                <text x="148" y="820">:=</text>
                <text x="264" y="820">serialize(prover_msg[..])</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------------------+
| NARG Prover (session_id, instance, witness)                        |
|                                                                    |
|                                                        +------+    |
| session_id ------------------------------------------->| Init |    |
|                                                        +------+    |
|                                                            |       |
|                                                            v       |
|                                       +------------+   +--------+  |
| instance ---------------------------->| encode[0]  |-->| Absorb |  |
| +-------------------+                 +------------+   +--------+  |
| | Interactive Prover|                                      |       |
| |(instance, witness)|                                      |       |
| |                   | prover_msg[1]                        v       |
| |                   |                 +------------+   +--------+  |
| |                   +---------------->| encode[1]  |-->| Absorb |  |
| |                   |                 +------------+   +--------+  |
| |                   |                                      |       |
| |                   | verifier_msg[1]                      v       |
| |                   |                 +------------+   +---------+ |
| |                   |<----------------| decode[1]  |<--| Squeeze | |
| |                   |                 +------------+   +---------+ |
| |                   |                                      |       |
| |                   | prover_msg[2]                        v       |
| |                   |                 +------------+   +--------+  |
| |                   +---------------->| encode[2]  |-->| Absorb |  |
| |                   |                 +------------+   +--------+  |
| |                   |                                      |       |
| |                   | verifier_msg[2]                      v       |
| |                   |                 +------------+   +---------+ |
| |                   |<----------------| decode[2]  |<--| Squeeze | |
| |                   |                 +------------+   +---------+ |
| |                   |        .                             .       |
| |                   |        .                             .       |
| |                   |        .                             .       |
| |                   |                                      |       |
| |                   | prover_msg[k-1]                      v       |
| |                   |                 +------------+   +--------+  |
| |                   +---------------->| encode[k-1]|-->| Absorb |  |
| |                   |                 +------------+   +--------+  |
| |                   |                                      |       |
| |                   | verifier_msg[k-1]                    v       |
| |                   |                 +------------+   +---------+ |
| |                   |<----------------| decode[k-1]|<--| Squeeze | |
| |                   |                 +------------+   +---------+ |
| |                   | prover_msg[k]                                |
| |                   +---------------->                             |
| +-------------------+                                              |
|                                                                    |
|    narg_string := serialize(prover_msg[..])                        |
+--------------------------------------------------------------------+
]]></artwork>
        </artset>
      </figure>
      <figure anchor="fig-fiat-shamir-verifier">
        <name>Non-interactive verifier for the Fiat-Shamir transformation</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="880" width="560" viewBox="0 0 560 880" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,864" fill="none" stroke="black"/>
              <path d="M 24,800 L 24,848" fill="none" stroke="black"/>
              <path d="M 128,208 L 128,240" fill="none" stroke="black"/>
              <path d="M 128,288 L 128,320" fill="none" stroke="black"/>
              <path d="M 128,448 L 128,480" fill="none" stroke="black"/>
              <path d="M 136,624 L 136,656" fill="none" stroke="black"/>
              <path d="M 152,368 L 152,400" fill="none" stroke="black"/>
              <path d="M 152,528 L 152,560" fill="none" stroke="black"/>
              <path d="M 168,704 L 168,736" fill="none" stroke="black"/>
              <path d="M 224,208 L 224,240" fill="none" stroke="black"/>
              <path d="M 224,288 L 224,320" fill="none" stroke="black"/>
              <path d="M 224,448 L 224,480" fill="none" stroke="black"/>
              <path d="M 232,624 L 232,656" fill="none" stroke="black"/>
              <path d="M 248,368 L 248,400" fill="none" stroke="black"/>
              <path d="M 248,528 L 248,560" fill="none" stroke="black"/>
              <path d="M 264,704 L 264,736" fill="none" stroke="black"/>
              <path d="M 296,624 L 296,656" fill="none" stroke="black"/>
              <path d="M 296,704 L 296,736" fill="none" stroke="black"/>
              <path d="M 312,128 L 312,160" fill="none" stroke="black"/>
              <path d="M 312,208 L 312,240" fill="none" stroke="black"/>
              <path d="M 312,288 L 312,320" fill="none" stroke="black"/>
              <path d="M 312,368 L 312,400" fill="none" stroke="black"/>
              <path d="M 312,448 L 312,480" fill="none" stroke="black"/>
              <path d="M 312,528 L 312,560" fill="none" stroke="black"/>
              <path d="M 344,168 L 344,200" fill="none" stroke="black"/>
              <path d="M 344,248 L 344,280" fill="none" stroke="black"/>
              <path d="M 344,328 L 344,360" fill="none" stroke="black"/>
              <path d="M 344,408 L 344,440" fill="none" stroke="black"/>
              <path d="M 344,488 L 344,520" fill="none" stroke="black"/>
              <path d="M 344,664 L 344,696" fill="none" stroke="black"/>
              <path d="M 368,128 L 368,160" fill="none" stroke="black"/>
              <path d="M 368,624 L 368,656" fill="none" stroke="black"/>
              <path d="M 376,704 L 376,736" fill="none" stroke="black"/>
              <path d="M 384,208 L 384,240" fill="none" stroke="black"/>
              <path d="M 384,288 L 384,320" fill="none" stroke="black"/>
              <path d="M 384,448 L 384,480" fill="none" stroke="black"/>
              <path d="M 392,368 L 392,400" fill="none" stroke="black"/>
              <path d="M 392,528 L 392,560" fill="none" stroke="black"/>
              <path d="M 416,800 L 416,848" fill="none" stroke="black"/>
              <path d="M 552,32 L 552,864" fill="none" stroke="black"/>
              <path d="M 8,32 L 552,32" fill="none" stroke="black"/>
              <path d="M 312,128 L 368,128" fill="none" stroke="black"/>
              <path d="M 112,144 L 304,144" fill="none" stroke="black"/>
              <path d="M 312,160 L 368,160" fill="none" stroke="black"/>
              <path d="M 128,208 L 224,208" fill="none" stroke="black"/>
              <path d="M 312,208 L 384,208" fill="none" stroke="black"/>
              <path d="M 96,224 L 120,224" fill="none" stroke="black"/>
              <path d="M 232,224 L 304,224" fill="none" stroke="black"/>
              <path d="M 128,240 L 224,240" fill="none" stroke="black"/>
              <path d="M 312,240 L 384,240" fill="none" stroke="black"/>
              <path d="M 128,288 L 224,288" fill="none" stroke="black"/>
              <path d="M 312,288 L 384,288" fill="none" stroke="black"/>
              <path d="M 16,304 L 120,304" fill="none" stroke="black"/>
              <path d="M 232,304 L 304,304" fill="none" stroke="black"/>
              <path d="M 128,320 L 224,320" fill="none" stroke="black"/>
              <path d="M 312,320 L 384,320" fill="none" stroke="black"/>
              <path d="M 152,368 L 248,368" fill="none" stroke="black"/>
              <path d="M 312,368 L 392,368" fill="none" stroke="black"/>
              <path d="M 24,384 L 144,384" fill="none" stroke="black"/>
              <path d="M 256,384 L 304,384" fill="none" stroke="black"/>
              <path d="M 152,400 L 248,400" fill="none" stroke="black"/>
              <path d="M 312,400 L 392,400" fill="none" stroke="black"/>
              <path d="M 128,448 L 224,448" fill="none" stroke="black"/>
              <path d="M 312,448 L 384,448" fill="none" stroke="black"/>
              <path d="M 16,464 L 120,464" fill="none" stroke="black"/>
              <path d="M 232,464 L 304,464" fill="none" stroke="black"/>
              <path d="M 128,480 L 224,480" fill="none" stroke="black"/>
              <path d="M 312,480 L 384,480" fill="none" stroke="black"/>
              <path d="M 152,528 L 248,528" fill="none" stroke="black"/>
              <path d="M 312,528 L 392,528" fill="none" stroke="black"/>
              <path d="M 24,544 L 144,544" fill="none" stroke="black"/>
              <path d="M 256,544 L 304,544" fill="none" stroke="black"/>
              <path d="M 152,560 L 248,560" fill="none" stroke="black"/>
              <path d="M 312,560 L 392,560" fill="none" stroke="black"/>
              <path d="M 136,624 L 232,624" fill="none" stroke="black"/>
              <path d="M 296,624 L 368,624" fill="none" stroke="black"/>
              <path d="M 16,640 L 128,640" fill="none" stroke="black"/>
              <path d="M 240,640 L 288,640" fill="none" stroke="black"/>
              <path d="M 136,656 L 232,656" fill="none" stroke="black"/>
              <path d="M 296,656 L 368,656" fill="none" stroke="black"/>
              <path d="M 168,704 L 264,704" fill="none" stroke="black"/>
              <path d="M 296,704 L 376,704" fill="none" stroke="black"/>
              <path d="M 24,720 L 160,720" fill="none" stroke="black"/>
              <path d="M 272,720 L 288,720" fill="none" stroke="black"/>
              <path d="M 168,736 L 264,736" fill="none" stroke="black"/>
              <path d="M 296,736 L 376,736" fill="none" stroke="black"/>
              <path d="M 24,800 L 416,800" fill="none" stroke="black"/>
              <path d="M 24,848 L 416,848" fill="none" stroke="black"/>
              <path d="M 8,864 L 552,864" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="352,696 340,690.4 340,701.6" fill="black" transform="rotate(90,344,696)"/>
              <polygon class="arrowhead" points="352,520 340,514.4 340,525.6" fill="black" transform="rotate(90,344,520)"/>
              <polygon class="arrowhead" points="352,440 340,434.4 340,445.6" fill="black" transform="rotate(90,344,440)"/>
              <polygon class="arrowhead" points="352,360 340,354.4 340,365.6" fill="black" transform="rotate(90,344,360)"/>
              <polygon class="arrowhead" points="352,280 340,274.4 340,285.6" fill="black" transform="rotate(90,344,280)"/>
              <polygon class="arrowhead" points="352,200 340,194.4 340,205.6" fill="black" transform="rotate(90,344,200)"/>
              <polygon class="arrowhead" points="312,464 300,458.4 300,469.6" fill="black" transform="rotate(0,304,464)"/>
              <polygon class="arrowhead" points="312,304 300,298.4 300,309.6" fill="black" transform="rotate(0,304,304)"/>
              <polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" transform="rotate(0,304,224)"/>
              <polygon class="arrowhead" points="312,144 300,138.4 300,149.6" fill="black" transform="rotate(0,304,144)"/>
              <polygon class="arrowhead" points="296,640 284,634.4 284,645.6" fill="black" transform="rotate(0,288,640)"/>
              <polygon class="arrowhead" points="280,720 268,714.4 268,725.6" fill="black" transform="rotate(180,272,720)"/>
              <polygon class="arrowhead" points="264,544 252,538.4 252,549.6" fill="black" transform="rotate(180,256,544)"/>
              <polygon class="arrowhead" points="264,384 252,378.4 252,389.6" fill="black" transform="rotate(180,256,384)"/>
              <polygon class="arrowhead" points="136,640 124,634.4 124,645.6" fill="black" transform="rotate(0,128,640)"/>
              <polygon class="arrowhead" points="128,464 116,458.4 116,469.6" fill="black" transform="rotate(0,120,464)"/>
              <polygon class="arrowhead" points="128,304 116,298.4 116,309.6" fill="black" transform="rotate(0,120,304)"/>
              <polygon class="arrowhead" points="128,224 116,218.4 116,229.6" fill="black" transform="rotate(0,120,224)"/>
              <polygon class="arrowhead" points="32,720 20,714.4 20,725.6" fill="black" transform="rotate(180,24,720)"/>
              <polygon class="arrowhead" points="32,544 20,538.4 20,549.6" fill="black" transform="rotate(180,24,544)"/>
              <polygon class="arrowhead" points="32,384 20,378.4 20,389.6" fill="black" transform="rotate(180,24,384)"/>
              <g class="text">
                <text x="36" y="52">NARG</text>
                <text x="92" y="52">Verifier</text>
                <text x="184" y="52">V(session_id,</text>
                <text x="280" y="52">instance,</text>
                <text x="372" y="52">narg_string)</text>
                <text x="28" y="84">1.</text>
                <text x="100" y="84">prover_msg[..]</text>
                <text x="172" y="84">:=</text>
                <text x="284" y="84">deserialize(narg_string)</text>
                <text x="28" y="100">2.</text>
                <text x="68" y="100">derive</text>
                <text x="132" y="100">verifier</text>
                <text x="208" y="100">messages:</text>
                <text x="60" y="148">session_id</text>
                <text x="340" y="148">Init</text>
                <text x="52" y="228">instance</text>
                <text x="176" y="228">encode[0]</text>
                <text x="348" y="228">Absorb</text>
                <text x="64" y="292">prover_msg[1]</text>
                <text x="176" y="308">encode[1]</text>
                <text x="348" y="308">Absorb</text>
                <text x="80" y="372">verifier_msg[1]</text>
                <text x="200" y="388">decode[1]</text>
                <text x="352" y="388">Squeeze</text>
                <text x="64" y="452">prover_msg[2]</text>
                <text x="176" y="468">encode[2]</text>
                <text x="348" y="468">Absorb</text>
                <text x="80" y="532">verifier_msg[2]</text>
                <text x="200" y="548">decode[2]</text>
                <text x="352" y="548">Squeeze</text>
                <text x="72" y="580">.</text>
                <text x="344" y="580">.</text>
                <text x="72" y="596">.</text>
                <text x="344" y="596">.</text>
                <text x="72" y="612">.</text>
                <text x="344" y="612">.</text>
                <text x="64" y="628">prover_msg[k]</text>
                <text x="184" y="644">encode[k]</text>
                <text x="332" y="644">Absorb</text>
                <text x="80" y="708">verifier_msg[k]</text>
                <text x="216" y="724">decode[k]</text>
                <text x="336" y="724">Squeeze</text>
                <text x="28" y="772">3.</text>
                <text x="56" y="772">Run</text>
                <text x="88" y="772">the</text>
                <text x="152" y="772">interactive</text>
                <text x="236" y="772">verifier</text>
                <text x="80" y="820">Interactive</text>
                <text x="164" y="820">Verifier</text>
                <text x="84" y="836">(instance,</text>
                <text x="192" y="836">prover_msg[..],</text>
                <text x="328" y="836">verifier_msg[..])</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+-------------------------------------------------------------------+
| NARG Verifier V(session_id, instance, narg_string)                |
|                                                                   |
| 1. prover_msg[..] := deserialize(narg_string)                     |
| 2. derive verifier messages:                                      |
|                                                                   |
|                                     +------+                      |
| session_id ------------------------>| Init |                      |
|                                     +------+                      |
|                                         |                         |
|                                         v                         |
|              +-----------+          +--------+                    |
| instance --->| encode[0] |--------->| Absorb |                    |
|              +-----------+          +--------+                    |
|                                         |                         |
|                                         v                         |
|prover_msg[1] +-----------+          +--------+                    |
|------------->| encode[1] |--------->| Absorb |                    |
|              +-----------+          +--------+                    |
|                                         |                         |
|                                         v                         |
| verifier_msg[1] +-----------+       +---------+                   |
| <---------------| decode[1] |<------| Squeeze |                   |
|                 +-----------+       +---------+                   |
|                                         |                         |
|                                         v                         |
|prover_msg[2] +-----------+          +--------+                    |
|------------->| encode[2] |--------->| Absorb |                    |
|              +-----------+          +--------+                    |
|                                         |                         |
|                                         v                         |
| verifier_msg[2] +-----------+       +---------+                   |
| <---------------| decode[2] |<------| Squeeze |                   |
|                 +-----------+       +---------+                   |
|       .                                 .                         |
|       .                                 .                         |
|       .                                 .                         |
|prover_msg[k]  +-----------+       +--------+                      |
|-------------->| encode[k] |------>| Absorb |                      |
|               +-----------+       +--------+                      |
|                                         |                         |
|                                         v                         |
| verifier_msg[k]   +-----------+   +---------+                     |
| <-----------------| decode[k] |<--| Squeeze |                     |
|                   +-----------+   +---------+                     |
|                                                                   |
| 3. Run the interactive verifier                                   |
|                                                                   |
| +------------------------------------------------+                |
| | Interactive Verifier                           |                |
| |  (instance, prover_msg[..], verifier_msg[..])  |                |
| +------------------------------------------------+                |
+-------------------------------------------------------------------+
]]></artwork>
        </artset>
      </figure>
      <t>Note that the prover does not need to compute the last verifier message <tt>verifier_msg[k]</tt>. The security guarantees provided by this transformation are described in <xref target="security-considerations"/>. The non-interactive verifier <strong>SHOULD</strong> be deterministic.</t>
    </section>
    <section anchor="terminology-and-conventions-in-this-document">
      <name>Terminology and conventions in this document</name>
      <t>The key words "<strong>MUST</strong>", "<strong>MUST NOT</strong>", "<strong>REQUIRED</strong>", "<strong>SHALL</strong>", "<strong>SHALL NOT</strong>", "<strong>SHOULD</strong>", "<strong>SHOULD NOT</strong>", "<strong>RECOMMENDED</strong>", "<strong>NOT RECOMMENDED</strong>", "<strong>MAY</strong>", and "<strong>OPTIONAL</strong>" 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>
      <t>The algorithms and procedures in this document are specified using Python-like pseudocode. Functions may depend on external parameters, such as the suite (<xref target="suites"/>); once selected, these parameters are treated as constants.</t>
      <section anchor="bytes-and-integers">
        <name>Bytes and integers</name>
        <t>A byte is an 8-bit unsigned integer (an octet), and a <strong>byte string</strong> is a finite sequence of bytes. An <tt>N</tt>-byte string is a byte string of length <tt>N</tt>. The empty byte string is written <tt>""</tt>; <tt>x || y</tt> is the concatenation of the byte strings <tt>x</tt> and <tt>y</tt>. <tt>len(x)</tt> denotes the length in bytes of the byte string <tt>x</tt>. <tt>zeros(N)</tt> denotes the <tt>N</tt>-byte string of zero bytes.</t>
        <t>Byte strings are indexed from zero. For integers <tt>0 &lt;= i &lt;= j &lt;= len(x)</tt>, <tt>x[i : j]</tt> denotes the <tt>(j - i)</tt>-byte substring of <tt>x</tt> consisting of the bytes at positions <tt>i, i+1, ..., j-1</tt>. In particular, <tt>x[0 : N]</tt> is the first <tt>N</tt> bytes of <tt>x</tt>, <tt>x[i : i]</tt> is the empty byte string <tt>""</tt>, and <tt>x[0 : len(x)]</tt> is <tt>x</tt> itself.</t>
        <t>A byte string <tt>x</tt> is a <strong>prefix</strong> of a byte string <tt>y</tt> if <tt>y == x || z</tt> for some byte string <tt>z</tt> (even empty). An encoding is <strong>prefix-free</strong> if, for any two distinct values, the encoding of one is never a prefix of the encoding of the other. A simple prefix-free encoding of a byte string <tt>b</tt> is <tt>LE(len(b), 4) || b</tt> as described in <xref target="serialize-byte-strings"/>.</t>
        <t><tt>LE(n, w)</tt> and <tt>LE2IP(x)</tt> are the integer/byte-string conversion primitives used throughout this document. <tt>LE(n, w)</tt> converts a non-negative integer <tt>n</tt> into a <tt>w</tt>-byte, little-endian byte string, and fails if <tt>n &gt;= 256^w</tt>. <tt>LE2IP(x)</tt> converts a byte string <tt>x</tt> into a non-negative integer using the little-endian byte order.</t>
        <t>The set of integers between <tt>0</tt> and <tt>N-1</tt> is denoted <tt>[0, N)</tt>. For a modulus <tt>M</tt>, <tt>Ns</tt> denotes the smallest integer such that <tt>256^Ns &gt;= M</tt>.</t>
      </section>
      <section anchor="duplex-sponge-interface">
        <name>Duplex sponge interface</name>
        <t>The Fiat-Shamir transformation relies on a cryptographic hash function, modeled as a random oracle and accessed through a stateful interface called a <strong>duplex sponge</strong> (<xref target="hash-instantiations"/>), named after the sponge <xref target="SPONGE"/> and duplex <xref target="DUPLEX"/> constructions. A duplex sponge <tt>Absorb</tt>s prover messages into an evolving internal state and <tt>Squeeze</tt>s from that state the bytes from which verifier messages are decoded. The state consists of a <strong>rate</strong>, through which bytes are absorbed and squeezed, and a <strong>capacity</strong>, which is never read or written directly. Security relies on the size of the capacity and on the properties given in <xref target="sec-transformation"/>.</t>
      </section>
      <section anchor="proof-systems-terminology">
        <name>Proof systems terminology</name>
        <t>The <strong>session identifier</strong> is a 32-byte string identifying the non-interactive argument and the application context (see <xref target="session-id"/>). The <strong>instance</strong> is the public input, and the <strong>witness</strong> is the prover's private input. The session identifier and the instance are held by both the prover and the verifier, whereas the witness is known only to the prover.</t>
        <t>For an NP language, the instance is a word, the witness is a proof of its membership in the language, and the non-interactive argument proves that the instance is in the language. This claim is also referred to as the <strong>statement</strong>. Proof systems might support different statements or express the same language in different ways.</t>
        <t>A <strong>prover message</strong> is a message sent by the interactive prover, and a <strong>verifier message</strong> is a message sent by the interactive verifier (a uniformly random value, sometimes called a <em>challenge</em>). The <strong>transcript</strong> is the ordered sequence of prover and verifier messages. The transcript does <em>not</em> include the instance or the session identifier.</t>
        <t>The notation in this document is for an interactive argument with <tt>k</tt> rounds in which the prover moves first (that is, sends the first message) and the verifier moves last. Other types of interactions can be expressed in the same notation: set the first prover message or final verifier message to <tt>""</tt> when the protocol omits that message. All messages in rounds <tt>2</tt>, ..., <tt>k-1</tt> <strong>MUST</strong> be non-empty.</t>
        <t>The <strong>NARG string</strong> (non-interactive argument string) is the serialized output of the non-interactive prover.</t>
      </section>
    </section>
    <section anchor="codecs">
      <name>Codec and serialization</name>
      <t>Prover messages are absorbed into the duplex sponge and serialized into the NARG string. This document keeps the two operations separate.</t>
      <t>A <strong>codec</strong> is the pair of maps between messages and the hash function's alphabet (bytes, in this document):</t>
      <ul spacing="normal">
        <li>
          <t><strong>Encoding</strong> converts the instance and each prover message into the bytes absorbed by the duplex sponge (<xref target="encoding-bytes"/>).</t>
        </li>
        <li>
          <t><strong>Decoding</strong> converts the bytes squeezed from the duplex sponge into an approximately uniform verifier message (<xref target="decoding"/>).</t>
        </li>
      </ul>
      <t><strong>Serialization</strong> is concerned with mapping prover messages to and from the NARG string (<xref target="narg-string"/>):</t>
      <ul spacing="normal">
        <li>
          <t><strong>Serialization</strong> writes the prover messages into the NARG string produced by the non-interactive prover.</t>
        </li>
        <li>
          <t><strong>Deserialization</strong> reads the prover messages back from the NARG string, and returns an error if the message is invalid.</t>
        </li>
      </ul>
      <t>Codecs and serialization serve different purposes. Codecs must maintain the soundness of the transformation, whereas deserialization keeps the NARG string unambiguous and rejects malformed proofs. In this specification, the encoding of a prover message coincides with its serialization (<xref target="type-serialization"/>).</t>
      <t><xref target="type-codecs"/> specifies the decoding, serialization, and deserialization functions for common types, which satisfy the requirements below.</t>
      <section anchor="encoding-bytes">
        <name>Encoding</name>
        <t>Encoding maps <strong>MUST</strong> satisfy the following requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>They are prefix-free: the encoding of one value is never a prefix of the encoding of another.</t>
          </li>
          <li>
            <t>They have an efficiently computable left inverse, which the knowledge extractor uses (<xref target="sec-codecs"/>). For the encodings of this document, deserialization is that inverse.</t>
          </li>
        </ol>
      </section>
      <section anchor="decoding">
        <name>Decoding</name>
        <t>Decoding maps <strong>MUST</strong> satisfy the following requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>They are infallible.</t>
          </li>
          <li>
            <t>They are <em>distribution-preserving</em>: on a uniformly random input, the output is statistically close to uniformly distributed over the verifier message type. The bias adds to the soundness error of the resulting non-interactive argument. An alternative to the decodings of <xref target="type-decoding"/> <strong>MUST</strong> have bias at most the soundness error of the interactive argument, so that the non-interactive soundness error stays within a small multiple of the interactive one.</t>
          </li>
        </ol>
        <t>Decoding maps <strong>SHOULD</strong> be amenable to straight-line implementations.</t>
        <t>Unlike deserialization, decoding need not be injective. Each verifier message type fixes the number of bytes to squeeze. Decoding a fixed-length byte string is the identity (<xref target="decoding-bytes"/>), and decoding an integer modulo <tt>M</tt> reads <tt>Ns + 16</tt> squeezed bytes as a little-endian integer and reduces it modulo <tt>M</tt> (<xref target="decoding-uint"/>).</t>
      </section>
      <section anchor="serialization">
        <name>Serialization and deserialization</name>
        <t>Serialization and deserialization <strong>MUST</strong> jointly satisfy the following requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>Deserialization inverts serialization and rejects any byte string that is not the serialization of a valid value, enforcing every validity condition of the value's type: for example, an elliptic-curve point lies in the prime-order subgroup, and an integer or field element is in its canonical range.</t>
          </li>
          <li>
            <t>Each value has a unique serialization. Accepting more than one serialization of a value makes proofs malleable.</t>
          </li>
          <li>
            <t>Length indicators and counts read from the NARG string are untrusted and are checked before being used for indexing, allocation, or arithmetic.</t>
          </li>
          <li>
            <t>If any trailing bytes remain in the input after deserializing the last prover message, verification fails. Accepting trailing bytes makes proofs malleable.</t>
          </li>
        </ol>
        <t>Serialization of fixed-length byte strings is the identity; serialization of an integer modulo <tt>M</tt> writes its canonical representative as an <tt>Ns</tt>-byte little-endian string. See <xref target="type-serialization"/> for the normative serialization requirements for common types.</t>
      </section>
    </section>
    <section anchor="hash-instantiations">
      <name>Duplex sponge</name>
      <section anchor="interface">
        <name>Interface</name>
        <t>Prover and verifier messages are handled via three operations:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Init(session_id) -&gt; state</tt>: create a new duplex sponge state, seeded by the 32-byte string <tt>session_id</tt>.</t>
          </li>
          <li>
            <t><tt>state.Absorb(x)</tt>: absorb <tt>x</tt> into the state.</t>
          </li>
          <li>
            <t><tt>state.Squeeze(n) -&gt; buf</tt>: produce <tt>n</tt> elements (bytes, in this document) from the state.</t>
          </li>
        </ul>
        <t>In the duplex sponge interface, messages can be absorbed incrementally, and <tt>Absorb</tt> inserts no separators: <tt>state.Absorb(x)</tt> followed by <tt>state.Absorb(y)</tt> (with no <tt>state.Squeeze</tt> in between) is equivalent to <tt>state.Absorb(x || y)</tt>.</t>
        <t>Each <tt>state.Squeeze(n)</tt> is uniformly distributed, and consecutive <tt>state.Squeeze</tt> calls continue one output stream.</t>
        <t>The security requirements for the 32-byte string <tt>session_id</tt> are given in <xref target="session-id"/>; its role in composability and reuse is discussed in <xref target="sec-session-identifiers"/>.</t>
      </section>
      <section anchor="xof-duplex-sponge">
        <name>XOF duplex sponge</name>
        <t>This section implements the duplex sponge from an eXtendable-Output Function (XOF). <tt>XOF(M, L)</tt> maps a byte string <tt>M</tt> to an <tt>L</tt>-byte string. The suite (<xref target="suites"/>) fixes the XOF, its rate <tt>R</tt> (the block size in bytes at which the XOF absorbs input, which <strong>MUST</strong> satisfy <tt>R &gt;= 32</tt>), and its security properties (<xref target="sec-transformation"/>).</t>
        <t>The state is a pair <tt>(M, offset)</tt>: <tt>M</tt> is the byte string absorbed so far, and <tt>offset</tt> is the number of output bytes already squeezed since <tt>M</tt> last changed.</t>
        <t>Each verifier message is obtained by decoding the XOF output computed over the session identifier, the encoded instance, and the encoded prover messages up to and including the current round. That is, the <tt>i</tt>-th verifier message (for <tt>1 &lt;= i &lt;= k</tt>) of byte length <tt>len_i</tt> is computed as:</t>
        <artwork><![CDATA[
verifier_msg[i] := decode[i](XOF(
                       session_id || zeros(R - 32)
                       || encode[0](instance)
                       || encode[1](prover_msg[1])
                       || ...
                       || encode[i](prover_msg[i]),
                   len_i))
]]></artwork>
        <section anchor="xof-init">
          <name>Init</name>
          <t>Seed the state by absorbing the session identifier, padded with zeros to fill the rate (the remaining <tt>R - 32</tt> bytes).</t>
          <artwork><![CDATA[
Init(session_id)

Input: session_id, a 32-byte string

Output: a duplex sponge state

1. assert len(session_id) == 32
2. return state := (M = session_id || zeros(R - 32), offset = 0)
]]></artwork>
        </section>
        <section anchor="xof-absorb">
          <name>Absorb</name>
          <t>Feed a byte string <tt>x</tt> into the state. Absorbing the empty string leaves the state unchanged.</t>
          <artwork><![CDATA[
state.Absorb(x)

Input: x, a byte string

1. if x != "":
2.    state.M = state.M || x
3.    state.offset = 0
]]></artwork>
        </section>
        <section anchor="xof-squeeze">
          <name>Squeeze</name>
          <t>Returns the next <tt>n</tt> bytes of the XOF output stream computed over the absorbed input.</t>
          <artwork><![CDATA[
state.Squeeze(n)

Input: n, the number of bytes to be squeezed

Output: a uniformly-distributed random n-byte string

1. out = XOF(state.M, state.offset + n)[state.offset : state.offset + n]
2. state.offset = state.offset + n
3. return out
]]></artwork>
          <t>Above, <tt>Squeeze</tt> re-hashes <tt>M</tt> on every call, at a cost quadratic in the number of rounds. Implementations <strong>SHOULD</strong> instead keep an incremental XOF context that absorbs <tt>M</tt> as it grows, and squeeze from a reader over a copy of that context, continuing from <tt>offset</tt>. Both approaches produce the same output.</t>
        </section>
      </section>
    </section>
    <section anchor="initialization">
      <name>Initialization</name>
      <t>Before any prover message is processed, both parties start the duplex sponge with the session identifier (<xref target="session-id"/>), and then the instance (<xref target="instance"/>). Session identifier and instance are not part of the NARG string.</t>
      <section anchor="session-id">
        <name>Session identifiers</name>
        <t>The procedure <tt>DeriveSessionID</tt> below is the <strong>RECOMMENDED</strong> way to obtain a session identifier from a human-meaningful variable-length <tt>tag</tt>.</t>
        <t>The <tt>tag</tt> is a byte string whose encoding as a sequence of bytes <strong>MUST</strong> be specified unambiguously, so that every implementation reproduces identical bytes. It is <strong>RECOMMENDED</strong> that the <tt>tag</tt> be a US-ASCII string, without byte-order mark at the beginning, nor <tt>0x00</tt> byte termination.</t>
        <t>When the <tt>tag</tt> is composed of several fields, those fields <strong>MUST</strong> be combined unambiguously, so that no two distinct tuples of field values yield the same byte string. Fixed-width fields or a delimiter that cannot occur within a field suffice. For example, plain concatenation maps both <tt>("SV1", "22")</tt> and <tt>("SV12", "2")</tt> to <tt>SV122</tt>, so the two tuples would share a session identifier.</t>
        <t>The tag has the following security requirements:</t>
        <ol spacing="normal" type="1"><li>
            <t>the tag <strong>MUST</strong> uniquely identify the <strong>non-interactive argument</strong> used, including the interactive argument, the types of prover and verifier messages, the hash suite, and the language associated with the interactive argument.</t>
          </li>
          <li>
            <t>the tag <strong>MUST</strong> uniquely identify the <strong>codecs</strong> used: the order and types of encodings and decodings at each round. For example, implementations that sample verifier messages differently must have different session identifiers.</t>
          </li>
          <li>
            <t>the tag <strong>MUST</strong> identify the application context in which the non-interactive argument is used, so that a NARG string produced for one application cannot be accepted in another. A namespace string under the application's control is sufficient, such as the URL <tt>https://example.com/login/v2</tt>. Freshness information, such as an epoch number or timestamp, <strong>MAY</strong> additionally be included when the application requires proofs not to be replayed within its own context (see <xref target="sec-session-identifiers"/>).</t>
          </li>
          <li>
            <t>the tag <strong>SHOULD</strong> begin with a fixed identification string that is unique to the application.</t>
          </li>
          <li>
            <t>the tag <strong>SHOULD</strong> include a version number.</t>
          </li>
        </ol>
        <t>An application <strong>MAY</strong> set the 32-byte <tt>session_id</tt> by its own means; it <strong>MUST</strong> then satisfy the same requirements.</t>
        <artwork><![CDATA[
DeriveSessionID(tag)

Input: tag, an application-chosen byte string (see above)

Output: session_id, a 32-byte string

1. duplex_sponge := DS.Init("irtf-cfrg-fiat-shamir/session-id")
2. duplex_sponge.Absorb(tag)
3. return duplex_sponge.Squeeze(32)
]]></artwork>
        <t>Above, <tt>DS</tt> denotes the duplex sponge in use (<xref target="hash-instantiations"/>), instantiated with one of the suites of <xref target="suites"/>. The 32-byte string <tt>"irtf-cfrg-fiat-shamir/session-id"</tt> is a domain separator for this derivation.</t>
        <t>As an example, consider a fictional application named Foo that implements sigma protocols over elliptic curves for encrypted messages shared during a time epoch <tt>tttt</tt>. A reasonable choice of tag is:</t>
        <artwork><![CDATA[
FOO-SV{xx}-{tttt}-DSFS-{hashID}-SIGMA-PROOFS-{yy}
]]></artwork>
        <t>where <tt>xx</tt> is the two-digit number indicating the version, <tt>yy</tt> is the two-digit number indicating the elliptic-curve ciphersuite, <tt>hashID</tt> is the hash identifier, and <tt>tttt</tt> is the epoch number written in decimal US-ASCII digits.</t>
        <t>As another example, consider a fictional application named Bar that implements an ad-hoc zero-knowledge virtual machine for correct execution of circuits. A reasonable choice of tag is:</t>
        <artwork><![CDATA[
BAR-COM{cc}
]]></artwork>
        <t>where <tt>{cc}</tt> is the commit hash of the associated version of the cryptographic specification of the protocol.</t>
        <t>Yet another reasonable choice for the tag is to append a description of the interactive argument together with the length of each prover and verifier message, after the version string. For instance:</t>
        <artwork><![CDATA[
BAZ-SV{xx}-DSFS-{hashID}-sumcheck-{ff}-A2round-messageS1challenge
]]></artwork>
        <t>where <tt>xx</tt> is the two-digit version number, <tt>hashID</tt> is the hash identifier, and <tt>ff</tt> is the two-digit identifier of the finite field over which the proof is computed. The suffix <tt>A2round-messageS1challenge</tt> describes one sumcheck round where the prover absorbs (<tt>A</tt>) two field elements <tt>round-message</tt>, and the verifier squeezes (<tt>S</tt>) one field element <tt>challenge</tt>. This is similar to the SAFE API <xref target="SAFE"/> <em>IO pattern</em>.</t>
      </section>
      <section anchor="instance">
        <name>Instance</name>
        <t>The prover and verifier <strong>MUST</strong> absorb <tt>encode[0](instance)</tt>, where <tt>encode[0]</tt> is the first encoding map. The encoded instance <strong>MUST</strong> be non-empty. While the session identifier of the previous section <xref target="session-id"/> fixes the language, the instance selects one of its members.</t>
        <t>Like every encoding map, <tt>encode[0]</tt> must be prefix-free (<xref target="encoding-bytes"/>). Otherwise, a malicious prover may be able to produce valid NARG strings on statements it cannot prove. The encoding map <tt>encode[0]</tt> <strong>SHOULD</strong> reuse the serialization functions of <xref target="type-serialization"/>.</t>
        <t>As an example, consider the sumcheck relation for multilinear polynomials in <tt>N</tt> variables over the field of size <tt>p^m</tt>. For a polynomial committed using the polynomial commitment scheme <tt>COM</tt>, the relation consists of:</t>
        <ul spacing="normal">
          <li>
            <t>instance <tt>(S, C)</tt>: <tt>C</tt> the commitment, and <tt>S</tt> the target sum;</t>
          </li>
          <li>
            <t>witness <tt>(F, r)</tt>: <tt>F</tt> is the multilinear polynomial in <tt>N</tt> variables, and <tt>r</tt> is the commitment opening information.</t>
          </li>
        </ul>
        <t>such that:</t>
        <artwork><![CDATA[
COM.Open(C, F, r)  = 1,
sum(F(b1, ..., bN) for (b1, ..., bN) in {0, 1}^N) = S
]]></artwork>
        <t>A valid instance-encoding function is:</t>
        <artwork><![CDATA[
SerializeField(S, p, m) || SerializeUint(N, 2^32) || COM.Serialize(C)
]]></artwork>
        <t>where <tt>COM.Serialize</tt> is the commitment-serialization function of the scheme <tt>COM</tt>.</t>
        <t>As another example, consider, in the discrete logarithm setting, the Chaum-Pedersen relation over an additive elliptic curve group with generators <tt>G</tt>, <tt>H</tt> (for which the relative discrete logarithm is not known). The relation consists of:</t>
        <ul spacing="normal">
          <li>
            <t>the instance <tt>(C, D)</tt>, a pair of Pedersen commitments;</t>
          </li>
          <li>
            <t>the witness <tt>(x, r, s)</tt>, scalar field elements with <tt>x</tt> the commitment message and <tt>r</tt>, <tt>s</tt> independent random commitment openings,</t>
          </li>
        </ul>
        <t>such that:</t>
        <artwork><![CDATA[
C = xG + rH, D = xG + sH.
]]></artwork>
        <t>A valid instance-encoding function is:</t>
        <artwork><![CDATA[
enc(G) || enc(H) || enc(C) || enc(D)
]]></artwork>
        <t>where <tt>enc</tt> is the group-element serialization function described in <xref target="serialize-ec-point"/>.</t>
        <t>Omitting public statement data from the transformation, such as <tt>N</tt> in the first example or the group generators <tt>G</tt>, <tt>H</tt> in the second, can compromise the soundness of the non-interactive argument. See <xref target="instance-encoding"/>.</t>
      </section>
    </section>
    <section anchor="narg-string">
      <name>Non-interactive argument string</name>
      <t>The NARG string is the concatenation of the serializations of the prover messages (<xref target="type-serialization"/>). Serialization and deserialization satisfy the requirements of <xref target="serialization"/>.</t>
      <t>Deserialization of the NARG string consists of reading the prover messages: each message is read by consuming, from the front of the input, a byte string whose length is determined by its type and the instance. Each deserialization function of <xref target="type-deserialization"/> returns the deserialized value together with the unread remainder of its input; the remainder is the input to the next read. Verification <strong>MUST</strong> fail if deserialization of any prover message fails.</t>
    </section>
    <section anchor="efficiency">
      <name>Efficiency considerations</name>
      <t><tt>Init(session_id)</tt> (see <xref target="interface"/>) can be precomputed. Implementations can therefore start each prover and verifier execution from a copy of the duplex sponge state, instead of initializing it every time. In the XOF duplex sponge (<xref target="xof-duplex-sponge"/>), the padded session identifier fills exactly one rate block (<xref target="xof-init"/>), saving one invocation of the permutation function per execution. Similarly, <tt>DeriveSessionID</tt> can be precomputed when the session identifier is derived from a tag. The same observation extends to longer shared prefixes: proofs for the same instance can additionally start from a stored copy of the state obtained after absorbing <tt>encode[0](instance)</tt>.</t>
      <t>Prefer batch algorithms for codecs and serialization when available. For example, Montgomery’s trick lets point compression share one modular inversion across a batch.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="sec-codecs">
        <name>Codecs</name>
        <t>Decoding guarantees approximately uniform output only for uniformly distributed input. Verifier messages <strong>SHOULD</strong> therefore be derived from <tt>Squeeze</tt> output, and never from prover-controlled or non-uniform bytes.</t>
        <t>An efficiently computable left inverse of the encoding function is required by the knowledge-soundness extractor to recover prover messages from the absorbed bytes <xref target="CO25"/>. This inverse is used only in the security analysis; neither the prover nor the verifier needs to compute it.</t>
      </section>
      <section anchor="constant-time">
        <name>Constant-time requirements</name>
        <t>In some applications, such as keyed-verification anonymous credentials, the non-interactive verifier builds an instance using the issuer's secret key. The instance, and potentially the prover messages, may contain confidential information. Constant-time implementation of all codec, serialization, and duplex sponge functions is <strong>RECOMMENDED</strong> to avoid leaking information about these inputs through execution time.</t>
      </section>
      <section anchor="sec-session-identifiers">
        <name>Session identifiers</name>
        <t>A session identifier names an application context, not an individual proof, and <strong>MAY</strong> be reused across proofs that share that context. Session identifiers provide domain separation to prevent protocol-confusion attacks and support composability.</t>
      </section>
      <section anchor="sec-transformation">
        <name>Security of the transformation</name>
        <t>The Fiat-Shamir transformation carries over the soundness and zero-knowledge properties of the interactive argument. The random oracle instantiation <strong>MUST</strong> be extraction-friendly and simulation-friendly indifferentiable to preserve soundness and zero-knowledge of the transformation. Both properties are stronger than indifferentiability alone <xref target="CO25"/>.</t>
        <t>Completeness of the non-interactive argument is preserved: if the instance-witness pair is in the relation, then the resulting non-interactive argument string is valid.</t>
        <section anchor="knowledge-soundness">
          <name>Knowledge soundness</name>
          <t>If the interactive argument is state-restoration knowledge sound, then so is the non-interactive argument, with a loss quadratic in the number of queries the adversary makes to the random oracle <xref target="CO25"/>. In particular, valid proofs cannot be generated without the corresponding statement being true (in the random oracle model).</t>
        </section>
        <section anchor="zero-knowledge">
          <name>Zero-Knowledge</name>
          <t>If the interactive argument is honest-verifier zero-knowledge, then the non-interactive argument is zero-knowledge. In particular, the resulting non-interactive argument string does not reveal any information beyond what can be directly inferred from the statement being valid.</t>
          <t>The additive zero-knowledge loss introduced by the transformation is linear in the number of queries the adversary makes to the random oracle <xref target="CO25"/>.</t>
          <t>Zero-knowledge holds only if the prover's randomness is indistinguishable from fresh uniform randomness to any party that does not know the witness. For example, two Schnorr proofs that reuse the same commitment nonce reveal the witness. Prover randomness can be generated using a cryptographically secure random number generator following <xref target="RFC4086"/>, or derived using a pseudorandom function with a protocol-specific construction.</t>
        </section>
        <section anchor="quantum-adversaries">
          <name>Quantum adversaries</name>
          <t>If the interactive argument is state-restoration sound against quantum adversaries, then the non-interactive argument after the Fiat-Shamir transformation in the random oracle model is also secure against quantum adversaries.</t>
          <t>The loss introduced by a quantum adversary is polynomial (larger than quadratic) in the number of quantum random-oracle queries.</t>
        </section>
      </section>
      <section anchor="instance-encoding">
        <name>Instance encoding</name>
        <t>Incorrect encoding of the instance has historically led to a number of critical security vulnerabilities. These bugs are grouped under the term <em>weak Fiat-Shamir transformation</em>. In these cases, the cryptographic hash function is not provided with the full statement being proven.</t>
        <t>As an example <xref target="BPW16"/>, a Chaum-Pedersen proof of equality for an instance <tt>(G, H, X, Y)</tt> proves knowledge of a witness <tt>x</tt> such that <tt>X = x * G</tt> and <tt>Y = x * H</tt>. The prover sends commitments <tt>(A, B)</tt>, obtains a challenge <tt>c</tt>, and replies with a scalar <tt>f</tt>. The verifier accepts if the verification equations hold: <tt>f * G == A + c * X</tt> and <tt>f * H == B + c * Y</tt>. Suppose the challenge <tt>c</tt> is derived only by absorbing <tt>(A, B)</tt> and omitting the instance <tt>(G, H, X, Y)</tt>. A malicious prover can pick <tt>A</tt>, <tt>B</tt>, <tt>H</tt>, and <tt>f</tt> at random, derive <tt>c</tt>, and then set <tt>X</tt> and <tt>Y</tt> to satisfy the verification equations. Verification passes, yet no single <tt>x</tt> satisfies both <tt>X = x * G</tt> and <tt>Y = x * H</tt>. A false statement has been proven. Other examples are available in <xref target="DMWG23"/> <xref target="CVE-2022-29566"/>.</t>
        <t>The transformation itself does not validate the instance. The verifier <strong>MUST</strong> therefore check that the instance is well-formed before use, exactly as it validates prover messages during deserialization (<xref target="type-deserialization"/>). For example, the verifier checks that each claimed group element lies in the prime-order subgroup and that integers are in their canonical ranges. The prover is not required to validate the instance. However, if the prover is invoked on an instance-witness pair outside the relation, no guarantee is provided on its output. In particular, zero-knowledge may be lost.</t>
      </section>
      <section anchor="implementation-guidance">
        <name>Implementation guidance</name>
        <t>Absorb each prover message in the same function call that writes it to, or reads it from, the NARG string. This keeps hashing and serialization synchronized and helps prevent omitted or reordered messages, which have caused implementation vulnerabilities <xref target="GNARK-KZG"/> <xref target="CVE-2024-45039"/> <xref target="CVE-2026-46654"/>. Prefer the byte-level interface described in this document over proof data structures whose fields are randomly addressable.</t>
        <t>The NARG string is untrusted input (<xref target="narg-string"/>). For example, in <xref target="deserialize-byte-strings"/> the 4-byte length prefix read by <tt>LE2IP</tt> in <tt>DeserializeVarLenString</tt> is attacker-controlled, and can be as large as <tt>2^32 - 1</tt>, so computing <tt>4 + N</tt> can overflow 32-bit integers. As another example, a crafted length indicator can make verification checks trivial, or exhaust memory on deserialization before any cryptographic check runs <xref target="GNARK-OOM"/>.</t>
        <t>Negative testing helps check that invalid proofs are rejected. For example, tamper with a valid NARG string by flipping bits, by appending or prepending bytes, or by replacing each prover message in turn with a different value.</t>
      </section>
    </section>
    <section anchor="suites">
      <name>Suites</name>
      <t>The suites defined by this document, and the identifiers used by the test vectors, are:</t>
      <table anchor="tab-suites">
        <name>Duplex sponge suites</name>
        <thead>
          <tr>
            <th align="left">Identifier</th>
            <th align="left">XOF(M, L)</th>
            <th align="left">R</th>
            <th align="left">Alphabet</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>SHAKE128</tt></td>
            <td align="left">SHAKE128(M, 8 * L) <xref target="SHA3"/></td>
            <td align="left">168</td>
            <td align="left">bytes</td>
          </tr>
          <tr>
            <td align="left">
              <tt>TurboSHAKE128</tt></td>
            <td align="left">TurboSHAKE128(M, 0x1F, L) <xref target="RFC9861"/></td>
            <td align="left">168</td>
            <td align="left">bytes</td>
          </tr>
        </tbody>
      </table>
      <section anchor="suite-shake128">
        <name>SHAKE128</name>
        <t>In the SHA-3 family, two XOFs, SHAKE128 and SHAKE256, are defined over the Keccak-f permutation; SHAKE(M, n) outputs an n-bit string. The corresponding collision and second-preimage-resistance for SHAKE128 are min(n/2,128) and min(n,128) bits, respectively (see Appendix A.1 of <xref target="SHA3"/>). This instantiation targets 128-bit security. The SHAKE128 state is a 200-byte (1600-bit) string, with a capacity of 32 bytes (256 bits).</t>
      </section>
      <section anchor="suite-turboshake128">
        <name>TurboSHAKE128</name>
        <t>TurboSHAKE128 <xref target="RFC9861"/> is an XOF built on Keccak-p[1600, 12], the Keccak-f[1600] permutation reduced to its last 12 rounds. Its state is a 200-byte (1600-bit) string, with a capacity of 32 bytes (256 bits). The corresponding collision and second-preimage-resistance are min(n/2,128) and min(n,128) bits for an n-bit output string, respectively. This instantiation targets 128-bit security. The domain-separation byte is fixed to its default value <tt>D = 0x1F</tt>.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank Thomas Pornin, Vishruti Ganesh, Brent Zundel, Hart Montgomery, Opal Wright, Giap Vu, David Wong, Théophile Wallez, and Thomas Coratger for their reviews and contributions to this specification.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="SHA3" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf">
          <front>
            <title>SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author initials="" surname="Standards for Efficient Cryptography Group (SECG)">
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9861">
          <front>
            <title>KangarooTwelve and TurboSHAKE</title>
            <author fullname="B. Viguier" initials="B." surname="Viguier"/>
            <author fullname="D. Wong" initials="D." role="editor" surname="Wong"/>
            <author fullname="G. Van Assche" initials="G." role="editor" surname="Van Assche"/>
            <author fullname="Q. Dang" initials="Q." role="editor" surname="Dang"/>
            <author fullname="J. Daemen" initials="J." role="editor" surname="Daemen"/>
            <date month="October" year="2025"/>
            <abstract>
              <t>This document defines four eXtendable-Output Functions (XOFs), hash functions with output of arbitrary length, named TurboSHAKE128, TurboSHAKE256, KT128, and KT256.</t>
              <t>All four functions provide efficient and secure hashing primitives, and the last two are able to exploit the parallelism of the implementation in a scalable way.</t>
              <t>This document is a product of the Crypto Forum Research Group. It builds up on the definitions of the permutations and of the sponge construction in NIST FIPS 202 and is meant to serve as a stable reference and an implementation guide.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9861"/>
          <seriesInfo name="DOI" value="10.17487/RFC9861"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FIPS204" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf">
          <front>
            <title>Module-Lattice-Based Digital Signature Standard</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2024"/>
          </front>
          <seriesInfo name="FIPS" value="204"/>
        </reference>
        <reference anchor="CO25" target="https://eprint.iacr.org/2025/536.pdf">
          <front>
            <title>A Fiat-Shamir Transformation From Duplex Sponges</title>
            <author fullname="Alessandro Chiesa">
              <organization/>
            </author>
            <author fullname="Michele Orrù">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="SPONGE" target="https://keccak.team/files/CSF-0.1.pdf">
          <front>
            <title>Cryptographic Sponge Functions</title>
            <author fullname="Guido Bertoni">
              <organization/>
            </author>
            <author fullname="Joan Daemen">
              <organization/>
            </author>
            <author fullname="Michaël Peeters">
              <organization/>
            </author>
            <author fullname="Gilles Van Assche">
              <organization/>
            </author>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="DUPLEX" target="https://keccak.team/files/SpongeDuplex.pdf">
          <front>
            <title>Duplexing the Sponge: Single-Pass Authenticated Encryption and Other Applications</title>
            <author fullname="Guido Bertoni">
              <organization/>
            </author>
            <author fullname="Joan Daemen">
              <organization/>
            </author>
            <author fullname="Michaël Peeters">
              <organization/>
            </author>
            <author fullname="Gilles Van Assche">
              <organization/>
            </author>
            <date year="2011"/>
          </front>
        </reference>
        <reference anchor="BPW16" target="https://eprint.iacr.org/2016/771">
          <front>
            <title>How not to Prove Yourself: Pitfalls of the Fiat-Shamir Heuristic and Applications to Helios</title>
            <author fullname="David Bernhard">
              <organization/>
            </author>
            <author fullname="Olivier Pereira">
              <organization/>
            </author>
            <author fullname="Bogdan Warinschi">
              <organization/>
            </author>
            <date year="2012"/>
          </front>
        </reference>
        <reference anchor="DMWG23" target="https://eprint.iacr.org/2023/691">
          <front>
            <title>Weak Fiat-Shamir Attacks on Modern Proof Systems</title>
            <author fullname="Quang Dao">
              <organization/>
            </author>
            <author fullname="Jim Miller">
              <organization/>
            </author>
            <author fullname="Opal Wright">
              <organization/>
            </author>
            <author fullname="Paul Grubbs">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="FROZENHEART" target="https://blog.trailofbits.com/2022/04/18/the-frozen-heart-vulnerability-in-plonk/">
          <front>
            <title>The Frozen Heart vulnerability in PlonK</title>
            <author>
              <organization>Trail of Bits</organization>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="SOLANA-ZK" target="https://solana.com/news/post-mortem-may-2-2025">
          <front>
            <title>Post Mortem: ZK ElGamal Proof Program Bug</title>
            <author>
              <organization>Solana Foundation</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="POSEIDON2" target="https://eprint.iacr.org/2023/323">
          <front>
            <title>Poseidon2: A Faster Version of the Poseidon Hash Function</title>
            <author fullname="Lorenzo Grassi">
              <organization/>
            </author>
            <author fullname="Dmitry Khovratovich">
              <organization/>
            </author>
            <author fullname="Markus Schofnegger">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="SAFE" target="https://eprint.iacr.org/2023/522">
          <front>
            <title>SAFE: Sponge API for Field Elements</title>
            <author fullname="JP Aumasson">
              <organization/>
            </author>
            <author fullname="Dmitry Khovratovich">
              <organization/>
            </author>
            <author fullname="Bart Mennink">
              <organization/>
            </author>
            <author fullname="Porçu Quine">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="GNARK-OOM" target="https://github.com/Consensys/gnark/security/advisories/GHSA-cph5-3pgr-c82g">
          <front>
            <title>Out-of-memory during deserialization with crafted inputs</title>
            <author>
              <organization>Consensys</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="GNARK-KZG" target="https://github.com/Consensys-Incorporated/gnark/security/advisories/GHSA-7p92-x423-vwj6">
          <front>
            <title>Plonk verifier KZG multi point verification</title>
            <author>
              <organization>Consensys</organization>
            </author>
            <date year="2023"/>
          </front>
        </reference>
        <reference anchor="CVE-2022-29566" target="https://nvd.nist.gov/vuln/detail/CVE-2022-29566">
          <front>
            <title>CVE-2022-29566: Fiat-Shamir hashing omits public values from the statement and the proof in Bulletproofs (Frozen Heart)</title>
            <author>
              <organization/>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="CVE-2024-45039" target="https://nvd.nist.gov/vuln/detail/CVE-2024-45039">
          <front>
            <title>CVE-2024-45039: gnark Groth16 commitment extension unsound for more than one commitment</title>
            <author>
              <organization/>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="CVE-2026-46654" target="https://nvd.nist.gov/vuln/detail/CVE-2026-46654">
          <front>
            <title>CVE-2026-46654: Plonky3 Fiat-Shamir challenge collision from a non-binding transcript</title>
            <author>
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="J. Schiller" initials="J." surname="Schiller"/>
            <author fullname="S. Crocker" initials="S." surname="Crocker"/>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC9496">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="H. de Valence" initials="H." surname="de Valence"/>
            <author fullname="J. Grigg" initials="J." surname="Grigg"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="I. Lovecruft" initials="I." surname="Lovecruft"/>
            <author fullname="G. Tankersley" initials="G." surname="Tankersley"/>
            <author fullname="F. Valsorda" initials="F." surname="Valsorda"/>
            <date month="December" year="2023"/>
            <abstract>
              <t>This memo specifies two prime-order groups, ristretto255 and decaf448, suitable for safely implementing higher-level and complex cryptographic protocols. The ristretto255 group can be implemented using Curve25519, allowing existing Curve25519 implementations to be reused and extended to provide a prime-order group. Likewise, the decaf448 group can be implemented using edwards448.</t>
              <t>This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9496"/>
          <seriesInfo name="DOI" value="10.17487/RFC9496"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-pairing-friendly-curves">
          <front>
            <title>Pairing-Friendly Curves</title>
            <author fullname="Yumi Sakemi" initials="Y." surname="Sakemi">
              <organization>GMO CONNECT Inc.</organization>
            </author>
            <author fullname="Satoru Kanno" initials="S." surname="Kanno">
              <organization>GMO CONNECT Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Carnegie Mellon University</organization>
            </author>
            <date day="1" month="November" year="2026"/>
            <abstract>
              <t>   Pairing-based cryptography, a subfield of elliptic curve
   cryptography, has received attention due to its flexible and
   practical functionality.  Pairings are special maps defined using
   elliptic curves and they can be applied to construct several
   cryptographic protocols such as identity-based encryption, attribute-
   based encryption, and so on.  At CRYPTO 2016, Kim and Barbulescu
   proposed an efficient number field sieve algorithm named exTNFS for
   the discrete logarithm problem in a finite field.  Several types of
   pairing-friendly curves such as Barreto-Naehrig curves are affected
   by the attack.  In particular, a Barreto-Naehrig curve with a 254-bit
   characteristic was adopted by a lot of cryptographic libraries as a
   parameter of 128-bit security; however, its security level is
   estimated at approximately 100 bits due to the effect of the attack.
   In this memo, we list the security levels of certain pairing-friendly
   curves, and motivate our choices of curves.  First, we summarize the
   adoption status of pairing-friendly curves in standards, libraries
   and applications, and consider them at the 128-bit, 192-bit, and
   256-bit security levels.  Then, from the viewpoints of "security" and
   "widely used", we select the recommended pairing-friendly curves
   considering exTNFS.  This memo also specifies the serialization and
   deserialization of the points and scalars that protocols exchange,
   restating a format that is already in widespread use, and states
   which of the remaining decisions belong to the calling protocol.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-pairing-friendly-curves-15"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
      </references>
    </references>
    <?line 657?>

<section anchor="type-codecs">
      <name>Codecs and serialization</name>
      <t>This appendix specifies the normative decoding, serialization, and deserialization functions for common types.</t>
      <section anchor="type-decoding">
        <name>Decoding</name>
        <section anchor="decoding-bytes">
          <name>Byte strings</name>
          <t>The decoding function for fixed-length byte strings is the identity.</t>
          <artwork><![CDATA[
DecodeBytes(buf, N)

Inputs:

- buf, a byte string
- N, the expected byte length

Output: out, a byte string of length N

1. assert len(buf) == N
2. return buf
]]></artwork>
        </section>
        <section anchor="decoding-uint">
          <name>Unsigned integers</name>
          <t>To sample an approximately uniform element modulo <tt>M</tt>, squeeze <tt>Ns + 16</tt> bytes, interpret them as a little-endian non-negative integer via <tt>LE2IP</tt>, and reduce modulo <tt>M</tt>.</t>
          <artwork><![CDATA[
DecodeUint(buf, M)

Inputs:

- buf, a byte string of length Ns + 16
- M, the modulus

Output: out, an integer in the range [0, M)

1. assert len(buf) == Ns + 16
2. return LE2IP(buf) mod M
]]></artwork>
          <t>The 16 extra bytes bound the statistical distance between the reduced value and the uniform distribution over <tt>[0, M)</tt> to <tt>2^-128</tt>. More generally, sampling <tt>n</tt> extra bytes has bias at most <tt>2^-8n</tt>.</t>
          <t>In three cases this approach is inefficient:</t>
          <ul spacing="normal">
            <li>
              <t>if <tt>M</tt> is a power of two, since the decoding bias is always 0;</t>
            </li>
            <li>
              <t>if <tt>M</tt> is only slightly below a power of <tt>256</tt> (for example, the secp256k1 scalar field order) where squeezing just <tt>Ns</tt> bytes and reducing with a single conditional subtraction already has bias of approximately <tt>2^-128</tt>;</t>
            </li>
            <li>
              <t>if the soundness error of the interactive argument is much larger than the bias introduced, for example a protocol with 30-bit challenges does not require such a big modular reduction.</t>
            </li>
          </ul>
          <t>In such cases, applications <strong>MAY</strong> use an alternative decoding function that meets the requirements of <xref target="decoding"/>. See <xref section="5" sectionFormat="of" target="RFC9380"/>.</t>
        </section>
        <section anchor="decoding-field">
          <name>Field elements</name>
          <t>A field element of a field of order <tt>p^m</tt> is decoded coordinate by coordinate, via <tt>DecodeUint</tt> (<xref target="decoding-uint"/>), starting from the least-significant. This consumes <tt>m * (Ns + 16)</tt> bytes.</t>
          <artwork><![CDATA[
DecodeField(buf, p, m)

Inputs:

- buf, a byte string of length m * (Ns + 16)
- p, the prime characteristic of the field
- m, the extension degree

Output: out, an element of the field of order p^m, given by its
        coordinates (a[0], ..., a[m-1]) over the prime field

1. assert len(buf) == m * (Ns + 16)
2. for i in 0, ..., m-1:
3.    chunk = buf[i * (Ns + 16) : (i + 1) * (Ns + 16)]
4.    a[i] = DecodeUint(chunk, p)
5. return (a[0], ..., a[m-1])
]]></artwork>
          <t>A prime field is the case <tt>m = 1</tt>, where <tt>DecodeField</tt> is <tt>DecodeUint</tt>, and <xref target="decoding-uint"/> applies, including its alternatives.</t>
          <t>For <tt>m &gt; 1</tt>, decoding relies on <tt>16 * m</tt> additional randomness bytes. Applications with big-integer arithmetic available <strong>MAY</strong> use a more randomness-efficient decoding algorithm, by instead sampling <tt>Nm + 16</tt> bytes, where <tt>Nm</tt> is the smallest integer with <tt>256^Nm &gt;= p^m</tt>, interpreting them as an integer via <tt>LE2IP</tt>, reducing modulo <tt>p^m</tt>, and recovering the coordinates <tt>(a[0], ..., a[m-1])</tt> as the base-<tt>p</tt> digits of the result (least-significant digit first), with the same <tt>2^-128</tt> bias bound.</t>
        </section>
      </section>
      <section anchor="type-serialization">
        <name>Serialization</name>
        <section anchor="serialize-byte-strings">
          <name>Byte strings</name>
          <t>Serialization of an <tt>N</tt>-byte string is the identity function.</t>
          <artwork><![CDATA[
SerializeBytes(s)

Input: s, an N-byte string

Output: out, an N-byte string

1. return s
]]></artwork>
          <t><tt>SerializeBytes</tt> carries no length information of its own. It <strong>MUST NOT</strong> be used unless <tt>N</tt> is fixed by the message's type and the instance, so that prover and verifier agree on <tt>N</tt> before the NARG string is parsed (see <xref target="deserialize-byte-strings"/>). On such a fixed-length domain the identity is prefix-free, as required of encodings by <xref target="encoding-bytes"/>.</t>
          <t>Otherwise, when the length is below 2^32 bytes, a prefix-free serialization is given by</t>
          <artwork><![CDATA[
SerializeVarLenString(s)

Input: s, an N-byte string

Output: out, an (N+4)-byte string

1. return LE(len(s), 4) || s
]]></artwork>
        </section>
        <section anchor="sequences-and-tuples">
          <name>Sequences and tuples</name>
          <t>A fixed-length array or a tuple is serialized as the concatenation of the serializations of its elements, with no separators.</t>
        </section>
        <section anchor="serialize-uint">
          <name>Unsigned integers</name>
          <t>An integer modulo <tt>M</tt> is represented by its unique integer representative in the range <tt>[0, M)</tt> and serialized via <tt>LE</tt>.</t>
          <artwork><![CDATA[
SerializeUint(x, M)

Inputs:

- x, an integer modulo M
- M, the modulus

Output: out, an Ns-byte string

1. assert 0 <= x < M
2. return LE(x, Ns)
]]></artwork>
        </section>
        <section anchor="serialize-field">
          <name>Field elements</name>
          <t>This section specifies the <em>default</em> serialization of a finite field of order <tt>p^m</tt>, where <tt>p</tt> is the prime characteristic and <tt>m &gt;= 1</tt> is the extension degree.</t>
          <t>Per requirement 2 of <xref target="session-id"/>, the tag identifies the choice of field serialization. The default is the serialization specified below, which encodes each prime-field coordinate as a fixed-width little-endian integer via <tt>SerializeUint</tt> (<xref target="serialize-uint"/>).</t>
          <t>If the standard the application builds on already fixes a canonical serialization for the field, that serialization <strong>SHOULD</strong> be pinned in place of the default. A pinned serialization is an encoding map and satisfies <xref target="encoding-bytes"/>.</t>
          <t>For example, Curve25519 <xref target="RFC7748"/>, Ed25519 <xref target="RFC8032"/>, ristretto255 <xref section="4.4" sectionFormat="of" target="RFC9496"/> serialize field elements as a fixed-width little-endian integer, matching the default. Similarly, in Section 7.1 of <xref target="FIPS204"/>, the integer coordinates of lattice vectors are serialized least-significant-byte first. Other standards instead fix a big-endian serialization, such as P-256 <xref target="SEC1"/> and BLS12-381 <xref target="I-D.irtf-cfrg-pairing-friendly-curves"/> via <tt>I2OSP</tt> (<xref section="4.1" sectionFormat="of" target="RFC8017"/>).</t>
          <t>With respect to a fixed basis, a field element is represented by its <tt>m</tt> coordinates in the prime field, each an integer in <tt>[0, p)</tt>, and serializes to <tt>m * Ns</tt> bytes, with <tt>Ns</tt> taken for the modulus <tt>p</tt>.</t>
          <artwork><![CDATA[
SerializeField(a, p, m)

Inputs:

- a, an element of the field of order p^m, given by its
     coordinates (a[0], ..., a[m-1]) over the prime field
- p, the prime characteristic of the field
- m, the extension degree

Output: out, an (m * Ns)-byte string

1. out := ""
2. for i in 0, ..., m-1:
3.    out := out || SerializeUint(a[i], p)
4. return out
]]></artwork>
          <t>A prime field is the case <tt>m = 1</tt>, where <tt>SerializeField</tt> is <tt>SerializeUint</tt>.</t>
        </section>
        <section anchor="serialize-ec-point">
          <name>Elliptic curve group elements</name>
          <t>A group element is serialized using the group's element-serialization function, into an <tt>Ne</tt>-byte string, where <tt>Ne</tt> is fixed by the group.</t>
          <t>For many prime-order elliptic-curve groups, this is the compressed Elliptic-Curve-Point-to-Octet-String conversion of <xref target="SEC1"/>. This document alters <xref target="SEC1"/> serialization: uncompressed and hybrid encodings are forbidden, so the only accepted initial octets are <tt>0x00</tt>, <tt>0x02</tt>, and <tt>0x03</tt>; the identity is encoded as <tt>Ne</tt> zero octets instead of <xref target="SEC1"/>'s single <tt>0x00</tt> octet. Restricting the accepted initial octets guarantees unique serialization. Padding the identity element removes branching from the parsing of the NARG string.</t>
          <t>The ristretto255 and decaf448 <xref target="RFC9496"/> encodings of the identity are already fixed-length <tt>Ne</tt>-byte strings.</t>
        </section>
      </section>
      <section anchor="type-deserialization">
        <name>Deserialization</name>
        <section anchor="deserialize-byte-strings">
          <name>Byte strings</name>
          <t>For an <tt>N</tt>-byte string whose length is known from the message's type and the instance, deserialization reads <tt>N</tt> bytes.</t>
          <artwork><![CDATA[
DeserializeBytes(input, N)

Inputs:

- input, the unread remainder of the NARG string
- N, the expected byte length

Output: an N-byte string, and the unread remainder of input

1. fail if len(input) < N
2. return (input[0 : N], input[N : len(input)])
]]></artwork>
          <t><tt>DeserializeBytes</tt> is the inverse of <tt>SerializeBytes</tt> (<xref target="serialize-byte-strings"/>).</t>
          <t>A byte string whose length is not known in advance is deserialized by <tt>DeserializeVarLenString</tt>, the inverse of <tt>SerializeVarLenString</tt> (<xref target="serialize-byte-strings"/>).</t>
          <artwork><![CDATA[
DeserializeVarLenString(input)

Input: input, the unread remainder of the NARG string

Output: an N-byte string, and the unread remainder of input

1. fail if len(input) < 4
2. N := LE2IP(input[0 : 4])
3. fail if len(input) - 4 < N
4. return (input[4 : 4 + N], input[4 + N : len(input)])
]]></artwork>
        </section>
        <section anchor="sequences-and-tuples-1">
          <name>Sequences and tuples</name>
          <t>Deserialize each element in order. Fail if any element fails to deserialize. The number and types of the elements are fixed by the protocol.</t>
        </section>
        <section anchor="unsigned-integers">
          <name>Unsigned integers</name>
          <t>Read the next <tt>Ns</tt> bytes as a little-endian integer <tt>x</tt>, and fail if <tt>x &gt;= M</tt>. This is the inverse of <tt>SerializeUint</tt> (<xref target="serialize-uint"/>).</t>
          <artwork><![CDATA[
DeserializeUint(input, M)

Inputs:

- input, the unread remainder of the NARG string
- M, the modulus

Output: x, an integer in the range [0, M), and the unread
        remainder of input

1. fail if len(input) < Ns
2. x := LE2IP(input[0 : Ns])
3. fail if x >= M
4. return (x, input[Ns : len(input)])
]]></artwork>
        </section>
        <section anchor="field-elements">
          <name>Field elements</name>
          <t>A field element of a field of order <tt>p^m</tt> is deserialized coordinate by coordinate: read <tt>m * Ns</tt> bytes and deserialize each <tt>Ns</tt>-byte coordinate as an integer modulo <tt>p</tt> using the unsigned-integer deserialization above. This is the inverse of <tt>SerializeField</tt> (<xref target="serialize-field"/>).</t>
          <artwork><![CDATA[
DeserializeField(input, p, m)

Inputs:

- input, the unread remainder of the NARG string
- p, the prime characteristic of the field
- m, the extension degree

Output: a, an element of the field of order p^m, given by its
        coordinates (a[0], ..., a[m-1]) over the prime field, and
        the unread remainder of input

1. for i in 0, ..., m-1:
2.    (a[i], input) := DeserializeUint(input, p)
3. return ((a[0], ..., a[m-1]), input)
]]></artwork>
        </section>
        <section anchor="elliptic-curve-group-elements">
          <name>Elliptic-curve group elements</name>
          <t>Read the next <tt>Ne</tt> bytes and convert them to a group element using the group's element-deserialization function.</t>
        </section>
      </section>
    </section>
    <section anchor="example-sumcheck">
      <name>Example protocol: sumcheck</name>
      <t>This appendix describes the Fiat-Shamir transformation for the sumcheck protocol. This protocol is not meant for standalone use; it is a toy example where the verifier's final check would still require the evaluation <tt>y = f(r[1], ..., r[v])</tt>, which is normally obtained via a polynomial commitment scheme opening.</t>
      <t>The protocol is parameterized by a prime <tt>p</tt> and a number of variables <tt>v</tt>. The witness is the table <tt>w</tt> of the <tt>2^v</tt> evaluations of a multilinear polynomial <tt>f</tt> on the hypercube: entry <tt>w[j]</tt> is <tt>f(j_0, ..., j_{v-1})</tt>, where <tt>j_0</tt> is the least-significant bit of <tt>j</tt>. The instance is <tt>(v, S)</tt>: the number of variables and the claimed sum <tt>S</tt> of all table entries. All field arithmetic below is modulo <tt>p</tt>.</t>
      <t>In each round the prover message is the coefficient pair <tt>(a0, a1)</tt> of the round polynomial <tt>g(X) = a0 + a1 * X</tt> of the lowest unbound variable: <tt>g(0)</tt> and <tt>g(1)</tt> are the even- and odd-indexed half-sums of the table. Each verifier message is one field element, decoded from <tt>Ns</tt> squeezed bytes as <tt>LE2IP(Squeeze(Ns)) mod p</tt>. (For the Mersenne31 instantiation below, the bias of the reduction is approximately <tt>2^-31</tt>, less than the soundness error of the interactive argument.)</t>
      <artwork><![CDATA[
SumcheckProve(session_id, v, w)

Inputs:

- session_id, a 32-byte string
- v, the number of variables
- w, a table of 2^v field elements

Outputs: narg_string; y, the final folded evaluation
f(r[1], ..., r[v])

 1. S := w[0] + w[1] + ... + w[2^v - 1]
 2. state := Init(session_id)
 3. state.Absorb(SerializeUint(v, 2^32) || SerializeField(S, p, 1))
 4. narg_string := ""
 5. for i in 1, ..., v:
 6.    a0 := w[0] + w[2] + ... + w[len(w) - 2]
 7.    a1 := (w[1] + w[3] + ... + w[len(w) - 1]) - a0
 8.    msg := SerializeField((a0, a1), p, 2)
 9.    state.Absorb(msg)
10.    narg_string := narg_string || msg
11.    r := LE2IP(state.Squeeze(Ns)) mod p
12.    w := (w[0] + r * (w[1] - w[0]), w[2] + r * (w[3] - w[2]), ...)
13. return (narg_string, w[0])
]]></artwork>
      <t>After <tt>v</tt> rounds the single remaining entry <tt>w[0]</tt> is <tt>f(r[1], ..., r[v])</tt>, where <tt>r[i]</tt> is the verifier message of round <tt>i</tt>. The NARG string is the concatenation of the round messages.</t>
      <artwork><![CDATA[
SumcheckVerify(session_id, v, S, narg_string, y)

Inputs:

- session_id, v, as in SumcheckProve
- S, the claimed sum
- narg_string, the NARG string
- y, the evaluation f(r[1], ..., r[v]), supplied by the caller

Output: accept or reject

 1. state := Init(session_id)
 2. state.Absorb(SerializeUint(v, 2^32) || SerializeField(S, p, 1))
 3. for i in 1, ..., v:
 4.    ((a0, a1), narg_string) := DeserializeField(narg_string, p, 2)
 5.    fail if 2 * a0 + a1 != S
 6.    state.Absorb(SerializeField((a0, a1), p, 2))
 7.    r := LE2IP(state.Squeeze(Ns)) mod p
 8.    S := a0 + a1 * r
 9. fail if narg_string != ""
10. fail if S != y
11. return accept
]]></artwork>
      <t>The test vectors (<xref target="tv-narg"/>) instantiate <tt>p = 2^31 - 1</tt>, <tt>v = 4</tt>, and the witness <tt>w = (1, 2, 4, ..., 2^15)</tt>, giving <tt>S = 65535</tt>. They report the NARG string as <tt>NargString</tt> and <tt>f(r[1], ..., r[v])</tt> as <tt>FinalEvaluation</tt>.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>Each test vector in this section is a block of lines of the form <tt>Key = Value</tt>, with no repeated keys. A value is written inline or on indented lines below its key; wrapped lines are concatenated without a separator. A sequence has one item per line, introduced by <tt>- </tt>, and an item's continuation lines carry a further two spaces of indentation.</t>
      <t>Every vector carries <tt>Id</tt>, a stable name of the form <tt>fiat-shamir/&lt;section&gt;/&lt;vector&gt;</tt>, and <tt>Function</tt>, the operation that the remaining keys describe. The suite (<xref target="suites"/>) is identified with the key <tt>Suite</tt>. A vector without <tt>Suite</tt> has the same outcome under every suite. The key <tt>ByteOrder</tt> marks the vectors exercising a non-default serialization (<xref target="serialize-field"/>). A vector carrying <tt>Expected</tt> is a verifier decision, <tt>accept</tt> or <tt>reject</tt>. The prose accompanying each rejected vector states which check fails. Each key has a value of one of the following kinds:</t>
      <ul spacing="normal">
        <li>
          <t>an integer, written in decimal or in hexadecimal with the prefix <tt>0x</tt>;</t>
        </li>
        <li>
          <t>a byte string, written in lowercase hexadecimal. The empty byte string is denoted <tt>""</tt>;</t>
        </li>
        <li>
          <t>a name (for <tt>Id</tt>, <tt>Function</tt>, <tt>Suite</tt>, or <tt>Expected</tt>);</t>
        </li>
        <li>
          <t>a sequence of values (one item per line, each introduced by <tt>- </tt>), including the duplex sponge operations described in <xref target="tv-duplex-sponge"/>.</t>
        </li>
      </ul>
      <t>A copy of the test vectors below is provided in JSON format as part of this specification's repo.</t>
      <section anchor="tv-duplex-sponge">
        <name>Duplex sponge</name>
        <t>Each <tt>Operations</tt> item is either <tt>absorb</tt> followed by a byte string, or <tt>squeeze</tt> followed by a number of bytes. Each vector runs the operations in order after initializing the state with <tt>SessionId</tt>. <tt>Output</tt> is the concatenation of all squeezed bytes, written as two hexadecimal characters per byte.</t>
        <section anchor="tv-duplex-shake128">
          <name>SHAKE128</name>
          <t>Squeeze 32 bytes right after initialization.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/init_squeeze
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - squeeze 32
Output =
  63e1b3543377fab6fb8cf0f7698a9980ca0211d5bc4aba213dd7a6ef7dd63cfa
]]></artwork>
          <t>Absorb the byte string <tt>hello world</tt>, then squeeze 64 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/absorb_squeeze
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 68656c6c6f20776f726c64
  - squeeze 64
Output =
  f627ff348dfee50d2aa5918a2621a0c1daf74c7ef930d49b5ea6eae73455e8c7
  56d433cbde0ade711bdd55d7ed5de38bb9adea8b2eec4402a0df090c16371413
]]></artwork>
          <t>Absorb <tt>ab</tt>, then <tt>c</tt>, then squeeze 32 bytes. Absorbs insert no separator, so the output is that of absorbing <tt>abc</tt> in one call.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/absorb_split
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 6162
  - absorb 63
  - squeeze 32
Output =
  a629c32a309dda7605798fd07ce20ab14c76635446868eb46e20b6dfd1dd9e41
]]></artwork>
          <t>Absorb <tt>abc</tt>, squeeze 32 bytes, absorb the empty string, and squeeze 32 more bytes. Absorbing the empty string leaves the state unchanged, so the second squeeze continues the output stream of the first. The 64-byte output begins with the 32-byte output of the previous vector.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/empty_absorb
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 616263
  - squeeze 32
  - absorb ""
  - squeeze 32
Output =
  a629c32a309dda7605798fd07ce20ab14c76635446868eb46e20b6dfd1dd9e41
  d88e36c20e053248b90967a90051ba319688a10783c2ce174602eccc02e8d1a6
]]></artwork>
          <t>Interleave non-empty absorbs and squeezes. A non-empty absorb after a squeeze restarts the output stream over all the input absorbed so far.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/interleave
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 00010203040506070809
  - squeeze 16
  - absorb 6d6f72652064617461
  - squeeze 16
Output =
  2da3c7e3a65c6e92901e8b668c43917eb9f02e9988e66d5ce2fbd833a0ecb93e
]]></artwork>
          <t>Absorb a 600-byte string, longer than the rate <tt>R = 168</tt>, then squeeze 600 bytes:</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/multiblock
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb ababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    bababababababababababababababababababababababababab
  - squeeze 600
Output =
  d0dc63443a117b76b09845af3347a6dbc29d0ff381ad093e3cfea3a326abbd0d
  a81bfc7dd6220f785900a6d04d508439cc65107c8eb75909f277a6f2740ae55f
  c684b851b66662c22252b6bb8028b5f7402b0beafb391835613a6c3d8116323d
  bdcb4494a198ae886821fca3d2af345227ea06c5c2cdb131c90d3fe58eedf090
  a55bb5a8edc614ab99da6c4ed8fe95a6c289c18dc61918a9abaa4f3ed2358711
  7ced29b33bfb87351d4ffc562add96d384fffbcb7cfb4d4d2125bf809cb85b33
  a3f9b7541c5d3d3f435f7d0a837f92f6878276ca3c833ecc1691f923602e9b8c
  8adb9528d8857d7189384eabbab50f0706b82b53db1c92857c2aa84a3527ce4b
  fcfbdbe02ad953b8517c4b91d36b45f81df67e10e4e9a7c7c064aa9e7f593710
  10eab4fd71c7aebcf00a793e469a78c658dd9f2c1d5ed2e3110939c11e916c1f
  51c47553b1bbceeea92649c9bcc7e5538dab18ca95c298b540b6798c065cd2b4
  13fe3915534a5dc6e7100e012b8c53fccc1018cc24570ca09c8e1c8f6e4e523d
  db7b6dcf313b6e98bb4abc94b8063eac8fdbbce945c35dd021a91e8227aeb165
  02a5a6e9e1d85fbd13b6e1e523e8a24040bbb9ddab5e29315780a57d9ef0d758
  b66e0076704f456dec1fc11577fe3644e53ff70a99a912758c289f225ad64e24
  6af9d895d91e6972b18421ccaa2aed6f843870b9dda07d1e975e51c04d58e7ba
  d60c0b8934fec80d4468816793879bc34d831e2689b77525439837fd15f797ed
  3b78ccdfdec6a5574111de3e243464c77c1d7fa76fb170e3722315e70fbf855a
  33281e8b6c15029202d0bb34749b962cc314515c748b74f4
]]></artwork>
          <t>Test across the rate boundary: absorb exactly one rate block (<tt>R = 168</tt> bytes), then squeeze 167 bytes and 2 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/rate_block
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1
    e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4
    04142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616
    2636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838
    485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a
    6a7
  - squeeze 167
  - squeeze 2
Output =
  edae25852c909e4acea18d96ddd407e475eeaa7070ff591b49450c7a3ed21b7d
  0bd0ee62ab0c242e636c435b37c38ae6804a179ff434bed773c8d596cd66b928
  b0429247b19cbfc246bb1abd3b741841b21ad0234ba7738abe64ab93914bf5ad
  58a362d86f64d72b8f8603a888421a29769bb77579185409013a271ac258cd71
  a71aedf2801ba6eb4784636e9bfacca229a78aa8dc72af770380a1a981120b37
  16595564c520292578
]]></artwork>
          <t>A zero-length squeeze is a no-op. Absorb <tt>abc</tt>, squeeze 0 bytes, absorb <tt>def</tt>, and squeeze 32 bytes. The output is that of absorbing <tt>abcdef</tt> and squeezing 32 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/shake128/squeeze_zero
Function = DuplexSponge
Suite = SHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 616263
  - squeeze 0
  - absorb 646566
  - squeeze 32
Output =
  fc876a5ffbdc960106af16ca50e3b17b14a172f985f3a6f5df09c9a649ebf588
]]></artwork>
        </section>
        <section anchor="tv-duplex-turboshake128">
          <name>TurboSHAKE128</name>
          <t>Squeeze 32 bytes right after initialization.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/init_squeeze
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - squeeze 32
Output =
  7ad8a3af35a3083c055e4a953ff001cdd9eeb1198f4be7a3a9ec5a209434619b
]]></artwork>
          <t>Absorb the byte string <tt>hello world</tt>, then squeeze 64 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/absorb_squeeze
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 68656c6c6f20776f726c64
  - squeeze 64
Output =
  8b804d7a8c524c242a94e86f7ddfec329d90e29c1f584a98812e63029a0bdb07
  5b12c545bf9e2aa17c88673b6d9df4b08e728dc47f7d7094cee59a0d7d989634
]]></artwork>
          <t>Absorb <tt>ab</tt>, then <tt>c</tt>, then squeeze 32 bytes. Absorbs insert no separator, so the output is that of absorbing <tt>abc</tt> in one call.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/absorb_split
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 6162
  - absorb 63
  - squeeze 32
Output =
  51acee1ee6f0c6a0c5a33b625ac9eaea54bc6b9b1cb85f9b2ef843e73631792e
]]></artwork>
          <t>Absorb <tt>abc</tt>, squeeze 32 bytes, absorb the empty string, and squeeze 32 more bytes. Absorbing the empty string leaves the state unchanged, so the second squeeze continues the output stream of the first. The 64-byte output begins with the 32-byte output of the previous vector.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/empty_absorb
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 616263
  - squeeze 32
  - absorb ""
  - squeeze 32
Output =
  51acee1ee6f0c6a0c5a33b625ac9eaea54bc6b9b1cb85f9b2ef843e73631792e
  599e1dfb1bf60638046f82f5bfa28bcfcabf1404b200647d184ead03e51fbf01
]]></artwork>
          <t>Interleave non-empty absorbs and squeezes. A non-empty absorb after a squeeze restarts the output stream over all the input absorbed so far.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/interleave
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 00010203040506070809
  - squeeze 16
  - absorb 6d6f72652064617461
  - squeeze 16
Output =
  f2745534347564bed146c95655122f14636bcc58f768296be8494208db29b6be
]]></artwork>
          <t>Absorb a 600-byte string, longer than the rate <tt>R = 168</tt>, then squeeze 600 bytes:</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/multiblock
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb ababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    babababababababababababababababababababababababababababababababababa
    bababababababababababababababababababababababababab
  - squeeze 600
Output =
  0ef6787d725638e19364c25a2ba879af55a4e1c97bff52919e64cd37a218db44
  a475f9d7ef0e88d87b443fe6590f12fc90c41c546c92cbeb3480e679d6e1ea37
  fc1e10e3e41b15e80aea4745ad9ad31c22857ae360fb66848daab7df8f6135ef
  cc940c4cc6431617cca6c05aa9b8bdf041538206ef912c0861dc07e219875509
  24c848cb788532637cf6e7fb1a3ea233fc335077e4910e8d7da15fe89250f284
  58ec17ecf448e05cf660ca4ffd1fdcb4379570d3a871aa759bb4d763d60d3e1b
  36ab8efcd8cd6fcca8fa67a5071ab21a1d31e4610f7ca8825b5e81f22433c495
  862b642c009823c312fd60fcdcd888af9c6c554da3a370946fa7bfa66ac54480
  b9a36d73fa6ee73ccb78b425de22814667742864608a06fa7534b053a68905ff
  532089b6fc0d597671ae4da685b96b1ac5d2513c0fc944d11155ed43461559a1
  2b984fb0cb45b105d9f2391a137d104f7da6c82fcfe375143bf512824685913f
  2bf61613b1a2a8f55f86d1282aa36c02384381335927259361c9e5875dbe1314
  af82aa65264ff009f525d4f0aedcf80cb908e308132113311d0e9a6783f27a13
  93ae28c10914018e263020dc97f219ebdae4118a79c318bef2d3766452075e35
  79f4b1cddbb80a5bca83a2f1fbec44e9d487925ba23cbfce111ba865e0fdb164
  589c66cbb757865d1bfb4540c01dece5b4180eef4262efc24c4ae3f76c4497a5
  3fb7f38a0de18a7053ab59b59b180ad53e3d2318661783682298d54b9f9ee6e3
  3b2be660295ccdd7d6cc976e21827c66880a0fbcc202743cd1ea0b7351755ee4
  b8a0b140bbc4f6a45eb6b05798721094cebe00e08f4f7bde
]]></artwork>
          <t>Test across the rate boundary: absorb exactly one rate block (<tt>R = 168</tt> bytes), then squeeze 167 bytes and 2 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/rate_block
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1
    e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4
    04142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616
    2636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838
    485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a
    6a7
  - squeeze 167
  - squeeze 2
Output =
  dc4b6f89697ec7e56ad210e6244a3ff25dab91ebd60981761db8f83db3a3a781
  ab43ffd7f325c98b912746b65d233fb5b99fd923cbff5e327b75436afd035c42
  ac9953ca4d686e30e5729aa460b813adf96c16917471679a4de36b19c452aef4
  47f93f4574ddcf09bdf6410774b426ffe415ff8eb2be44c8301ae071b534895b
  0ab66aa0136ffe9656c607bb6e1acaea4069454e297ec0ad4eab437c25455c88
  aeb77d6f33f7b578e9
]]></artwork>
          <t>A zero-length squeeze is a no-op. Absorb <tt>abc</tt>, squeeze 0 bytes, absorb <tt>def</tt>, and squeeze 32 bytes. The output is that of absorbing <tt>abcdef</tt> and squeezing 32 bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/duplex-sponge/turboshake128/squeeze_zero
Function = DuplexSponge
Suite = TurboSHAKE128
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 616263
  - squeeze 0
  - absorb 646566
  - squeeze 32
Output =
  61d3fecc576c3faafb92db1cb22b60794075a024df9626436394c7b852ade899
]]></artwork>
        </section>
      </section>
      <section anchor="tv-session-id">
        <name>Session identifier derivation</name>
        <t>Derive the session identifier of the application tag <tt>interop-test-v00</tt> (<xref target="session-id"/>).</t>
        <artwork><![CDATA[
Id = fiat-shamir/session-id/shake128/derive_sid
Function = DeriveSessionID
Suite = SHAKE128
Tag = 696e7465726f702d746573742d763030
SessionId =
  b508aca89eecac56cd33e4a28f817f43f849d035922f354173ae8466628308cf
]]></artwork>
        <t>Derive the session identifier of the application tag <tt>interop-test-v00</tt> (<xref target="session-id"/>).</t>
        <artwork><![CDATA[
Id = fiat-shamir/session-id/turboshake128/derive_sid
Function = DeriveSessionID
Suite = TurboSHAKE128
Tag = 696e7465726f702d746573742d763030
SessionId =
  4326208c9e56ae847be9356ca7c4447c752a9d7326a44a6cbee0c0dfc69505ac
]]></artwork>
      </section>
      <section anchor="tv-codec">
        <name>Codecs</name>
        <t>This section contains vectors for decoding verifier messages (<xref target="decoding"/>).
The encoding of a prover message is its serialization (<xref target="codecs"/>), covered in <xref target="tv-serialization"/>.</t>
        <t>Decoding is infallible and reduces modulo <tt>M</tt> (<xref target="decoding-uint"/>): the <tt>Ns + 16 = 48</tt>-byte little-endian encoding of <tt>M</tt> itself, the order of the P-256 group, decodes to 0. Deserialization instead rejects non-canonical integers (<xref target="tv-serialization-invalid"/>).</t>
        <artwork><![CDATA[
Id = fiat-shamir/codec/decode_uint_wraparound
Function = DecodeUint
Modulus =
  0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325
  51
Input =
  512563fcc2cab9f3849e17a7adfae6bcffffffffffffffff00000000ffffffff
  00000000000000000000000000000000
VerifierMessage = 0x00
]]></artwork>
        <t>Absorb the instance <tt>instance</tt>, serialized as a variable-length byte string, then squeeze <tt>Ns + 16 = 48</tt> bytes and decode them into a scalar of P-256 (<xref target="decoding-uint"/>).</t>
        <artwork><![CDATA[
Id = fiat-shamir/codec/shake128/decode_uint
Function = DecodeUint
Suite = SHAKE128
Modulus =
  0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325
  51
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 08000000696e7374616e6365
  - squeeze 48
Output =
  7124d02b7cdfec99c4033dfd05624cfe2ff3af2c0e71656f770e676bd36de622
  8f85fcb39f34f7bfc24c9f54ab35ddba
VerifierMessage =
  0xf860997c65f8dabecbcc3459a7b89bf69301b19fa1a0e036eb0d132724436d
  4f
]]></artwork>
        <t>Absorb the instance <tt>instance</tt>, serialized as a variable-length byte string, then squeeze <tt>Ns + 16 = 48</tt> bytes and decode them into a scalar of P-256 (<xref target="decoding-uint"/>).</t>
        <artwork><![CDATA[
Id = fiat-shamir/codec/turboshake128/decode_uint
Function = DecodeUint
Suite = TurboSHAKE128
Modulus =
  0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325
  51
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
Operations =
  - absorb 08000000696e7374616e6365
  - squeeze 48
Output =
  82a031e31b103ac01253ba3aae215f650a06a4bb24963a05ee1f8c0b82eae90d
  7bd36ea8cb560a91604ae8a97eb0d564
VerifierMessage =
  0xc2088b455016d0126fcdd76335a79566e7fd8379db1de019871d459bfee955
  8b
]]></artwork>
      </section>
      <section anchor="tv-serialization">
        <name>Serialization and deserialization</name>
        <t>This section contains vectors for the serialization and deserialization of prover messages (<xref target="narg-string"/>).</t>
        <section anchor="tv-serialization-valid">
          <name>Valid inputs</name>
          <t>Serialize the byte string <tt>proof</tt> as a variable-length string: its length in 4 little-endian bytes, then its bytes (<xref target="serialize-byte-strings"/>).</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/serialize_varlen
Function = SerializeVarLenString
Input = 70726f6f66
Output = 0500000070726f6f66
]]></artwork>
          <t>The serialization of the empty byte string as a variable-length string contains only the length prefix.</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/serialize_varlen_empty
Function = SerializeVarLenString
Input = ""
Output = 00000000
]]></artwork>
          <t>Serialize the integer <tt>0xdeadbeef</tt> modulo <tt>p = 2^256 - 189</tt> in <tt>Ns = 32</tt> little-endian bytes (<xref target="serialize-uint"/>).</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/serialize_uint
Function = SerializeUint
Modulus =
  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  43
Value = 0xdeadbeef
Output =
  efbeadde00000000000000000000000000000000000000000000000000000000
]]></artwork>
          <t>Serialize <tt>0xdeadbeef</tt> as an element of the scalar field of P-256, whose standard fixes a big-endian serialization (<tt>I2OSP</tt>, <xref target="serialize-field"/>).</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/serialize_field_be
Function = SerializeField
ByteOrder = big-endian
Modulus =
  0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325
  51
Value = 0xdeadbeef
Output =
  00000000000000000000000000000000000000000000000000000000deadbeef
]]></artwork>
        </section>
        <section anchor="tv-serialization-invalid">
          <name>Invalid inputs</name>
          <t>A payload shorter than the length specified by its prefix is rejected (<xref target="deserialize-byte-strings"/>).</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/deserialize_varlen_reject_truncated
Function = DeserializeVarLenString
Input = 0500000070726f6f
Expected = reject
]]></artwork>
          <t>The maximal length prefix <tt>2^32 - 1</tt> exceeds the available payload length. The length check must not overflow.</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/deserialize_varlen_reject_overflow
Function = DeserializeVarLenString
Input = ffffffffdeadbeef
Expected = reject
]]></artwork>
          <t>An integer modulo <tt>p</tt> is serialized by its representative in <tt>[0, p)</tt>. The modulus itself is rejected.</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/deserialize_uint_reject_modulus
Function = DeserializeUint
Modulus =
  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  43
Input =
  43ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Expected = reject
]]></artwork>
          <t>An integer modulo <tt>p = 2^256 - 189</tt> is serialized in exactly <tt>Ns = 32</tt> bytes. Deserialization rejects inputs with fewer bytes.</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/deserialize_uint_reject_short
Function = DeserializeUint
Modulus =
  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  43
Input =
  efbeadde000000000000000000000000000000000000000000000000000000
Expected = reject
]]></artwork>
          <t>Every coordinate of an extension-field element is validated. This degree-2 element is rejected because its second coordinate (<tt>2^256 - 1</tt>) is non-canonical, even though its first coordinate (<tt>p - 1</tt>) is canonical.</t>
          <artwork><![CDATA[
Id = fiat-shamir/serialization/deserialize_field_reject_coordinate
Function = DeserializeField
Modulus =
  0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  43
ExtensionDegree = 2
Input =
  42ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Expected = reject
]]></artwork>
        </section>
      </section>
      <section anchor="tv-narg">
        <name>NARG strings</name>
        <t>This section contains NARG strings of the sumcheck protocol of <xref target="example-sumcheck"/>, over Mersenne31 (<tt>p = 2^31 - 1</tt>) with <tt>v = 4</tt> variables. Each vector carries the session identifier, the instance (<tt>NumVariables</tt> and <tt>ClaimedSum</tt>), and the NARG string. The valid vectors also carry the witness and the evaluation <tt>y</tt> as <tt>FinalEvaluation</tt>; the adversarial vectors are rejected before the final check (step 10 of <tt>SumcheckVerify</tt>), whatever <tt>y</tt>.</t>
        <section anchor="tv-narg-valid">
          <name>Valid NARG strings</name>
          <t>The sumcheck protocol of <xref target="example-sumcheck"/> for the witness <tt>w = (1, 2, 4, ..., 2^15)</tt>, with the session identifier derived from the application tag <tt>sumcheck</tt>.</t>
          <artwork><![CDATA[
Id = fiat-shamir/narg/shake128/sumcheck
Function = Sumcheck
Suite = SHAKE128
Modulus = 0x7fffffff
Tag = 73756d636865636b
SessionId =
  0568cefdf774622a3854d82934915fb3e38bc89dc44b6d673fc91b972c886fc2
NumVariables = 4
ClaimedSum = 0xffff
Witness =
  - 1
  - 2
  - 4
  - 8
  - 16
  - 32
  - 64
  - 128
  - 256
  - 512
  - 1024
  - 2048
  - 4096
  - 8192
  - 16384
  - 32768
NargString =
  555500005555000023e362696ba9283c90a3362a74953379afc3b041d3eb126f
FinalEvaluation = 0x3ebfb3b3
Expected = accept
]]></artwork>
          <t>The sumcheck protocol of <xref target="example-sumcheck"/> for the witness <tt>w = (1, 2, 4, ..., 2^15)</tt>, with the session identifier derived from the application tag <tt>sumcheck</tt>.</t>
          <artwork><![CDATA[
Id = fiat-shamir/narg/turboshake128/sumcheck
Function = Sumcheck
Suite = TurboSHAKE128
Modulus = 0x7fffffff
Tag = 73756d636865636b
SessionId =
  abcbcae1f2f90d02b7e6417dbb2ffe162ab00477453eac3ce83d4e7e61000280
NumVariables = 4
ClaimedSum = 0xffff
Witness =
  - 1
  - 2
  - 4
  - 8
  - 16
  - 32
  - 64
  - 128
  - 256
  - 512
  - 1024
  - 2048
  - 4096
  - 8192
  - 16384
  - 32768
NargString =
  55550000555500006ff9a71d4decf758430dfb69f9c6b5359d8ab2744b13d83d
FinalEvaluation = 0x654028db
Expected = accept
]]></artwork>
        </section>
        <section anchor="tv-narg-invalid">
          <name>Adversarial vectors</name>
          <t>The coefficient <tt>a0</tt> of the first prover message is serialized as <tt>p + a0</tt>, a non-canonical representative. Deserialization rejects it (step 4 of <tt>SumcheckVerify</tt>), before the first squeeze.</t>
          <artwork><![CDATA[
Id = fiat-shamir/narg/sumcheck/noncanonical_coefficient
Function = Sumcheck
Modulus = 0x7fffffff
SessionId =
  000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
NumVariables = 4
ClaimedSum = 0xffff
NargString =
  5455008055550000b8eefc2728ccf677b7aabd44c1001d074205d5576c3d307d
Expected = reject
]]></artwork>
          <t>The NARG string carries one trailing zero byte (step 9).</t>
          <artwork><![CDATA[
Id = fiat-shamir/narg/shake128/sumcheck/trailing_bytes
BaseId = fiat-shamir/narg/shake128/sumcheck
Function = Sumcheck
Suite = SHAKE128
Modulus = 0x7fffffff
Tag = 73756d636865636b
SessionId =
  0568cefdf774622a3854d82934915fb3e38bc89dc44b6d673fc91b972c886fc2
NumVariables = 4
ClaimedSum = 0xffff
NargString =
  555500005555000023e362696ba9283c90a3362a74953379afc3b041d3eb126f
  00
Expected = reject
]]></artwork>
          <t>The NARG string carries one trailing zero byte (step 9).</t>
          <artwork><![CDATA[
Id = fiat-shamir/narg/turboshake128/sumcheck/trailing_bytes
BaseId = fiat-shamir/narg/turboshake128/sumcheck
Function = Sumcheck
Suite = TurboSHAKE128
Modulus = 0x7fffffff
Tag = 73756d636865636b
SessionId =
  abcbcae1f2f90d02b7e6417dbb2ffe162ab00477453eac3ce83d4e7e61000280
NumVariables = 4
ClaimedSum = 0xffff
NargString =
  55550000555500006ff9a71d4decf758430dfb69f9c6b5359d8ab2744b13d83d
  00
Expected = reject
]]></artwork>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
Fifb1jTOvrKySdFjTqLgqtN7DlT/nL2hAkDCEZt75NiFhsMQ7N6eYmZHw6ZU
agVsrIiGxCEnAtn6xafELkg7V25JvWTgy/5T59Ob0MEwBDzlWtDU2e0Kngps
gOhjyZGu0VSQThHQLxswq7Qm/ThU1EuTnMFTBNtueQJ9fSDWW7i9mvQ/zMCo
K+eV878+de7cOaK1E+Lz67xm/RsW/IpsiPZmt95uuSbdXK1Xcy8s+Gvt5GWW
R/FtUo16GXAWV1JyeoQ5WXoORa3thXa6Q7tS7VIdcQ1AZTKM1UaVVuGY2j4l
7ZxaTIdAozyjT2ne+xpEkz5gPnYWB9/3rhxtPfADgXsAzuEzBHSNjfikgvX9
HECZdIkfeGBKKrnkDB5OAWWDmJShCUlPoXqA/cdGlKRgF8a06qCjgm0wyPqe
G9vjQ9yMjERygCtzplU3ef9M8gKb8UZC03wEuzRO6RiNiZ0bYnpOkrCjWSgn
bLG8uFZoIdZmzInR6Aj5+S0jSQ+dzygRgaM0kIXKkGP1uw1jKrw6VF0L63Vn
+OztfaaMVzJBhzGoRqXpkpY2UckOnKAo2Se5Wo9oVW1Xu5FUiv1BMkcrQI2J
q0NieM78zk7gk/GsjF5GBrlLaG6GluxAoXYUDQdp2DXUzkfpOV0Pu9lDLoHW
7z15OFOue6O1DHK2KeWA6EqpHNwub2vSeqfPNudiMaXem5gcJWRdChiipH8a
Ob4WpzOtd/Hv29m8V2fkBG6d8+w72UoM7kWJrXzqLkpDFpLxnypq6Tst2Qpf
aodcqfr3z03WsWqNN4RD64tVMyfTzPnjyfT+yYMnT9qgl2k1x1mNyqV0Tj1m
9au5PK2p0TKeXJDW475yXcUrdVaSaS/3ncGdFkzK4CCOWQEgl9wgjz1SrF4R
0NRfPdjgpZz1xB2gganXSz1dE8o3yhlCzi7d4fea/2hJrmcJPGavyVVdYn/1
DDjpsJRzyuBk7k6kLhaEycsCKmLnp1ZfaTYUZpEqKNK67i7mgu0sOy9bxbKJ
XGf7d06+9ahywPfvmCxTvubzRbpGtildoBSDZtlG0PUir5Yb+vYZR+13J4IA
/uzC6ztIRy1M5Sld65fafVCuP5i6JnlMk9mu0AO9wnypr1uPBwn4ayb546YM
mUkX7md7rVPy20wj6iVe1FwD0HK70dgICbZbL1MFvfSijrrsHvV9M/UuDmY7
4tk45CQCbVH0MGQQh1CI1vDNEadUGz/GFDlgzCEaKx9rm4+yX3Vrob31jeX3
9VJ+duao1I3eZkOMYjxiT+YROTp6X1LURDyI/Z7K12DCmM59TmVtLigVto1g
l0bR6sb5nfKlrJZzjsZtTLSzX0/yx6+/cmZt83oFfO5jPl+Cm9279CnReCWb
M5Wtt7Ci7GYY8kZcLPG7UUmoCgwzXGOwiaNrfyhwV6tTfbBFHCjixK2yyzCy
YaApr/Xt6vNFcqlaCF9rLNZOespK3Mq/3OGYOWDndbfvVlTstNY97HW8qcUW
PalBrEN7/bXmb83+cC8a/YLJVROOSYRXEKMUn0Vv+QZoJnnLWEk9dxbMObN4
bolNPqwOkVlBsQNAzN1tjqbV8IHCsI9Jd6o4/pjoVBozuWlBAqmXTK+ALki1
Pej08psNPTBTpYO90DoYTLWHJ4dsNt4ZPS3tXrefdw6IS/XeNxYTT79TvPvP
GGODvAA9dfzhST9vfujBJWq+Kbu8u2T4K7svlVanXGgqpmzcacrLNvRWvn3h
WquCYUMCtPUHa/8n1wlwgrDSNO4r6jQ81dQpMoIX+owtG+9UkvzjpWZalieS
T7VrkwAbpfGb6JvD0TfdbVodkoRhWubMYrg0p0YI5g6aZczW+JkRU6OEnaWK
SQPBaqUQEgHVxhf0+Nmz6cm3r1+9ejN9Ta+9mT48eXwy5T158vDN9OTJ50/v
T59//ewZXb2+fqO2mJOBYKW/al130BNgKJ6CWjTH0mE1qy95wxxudn1965cG
kciivsB3tTCeqSm2Y7Ggtp0urOAwKNpSKJujmtx6yhaGPkyHybTKKc+pMXvN
MuKdN/wzsdracCL6cnq2LNhbMu2yXy6BoxsMcw7JTQkDKuq0oqx/fJid+yps
pntYN7fb3c/ufz2FRv66KPr7RhesQj46lkHBTxOXpddc9k+q6Vei9Huv60cM
PgN8f5brFn7bszXhBTVl9o9ecM2m0HVTF/awoypBv10762bKcCIF6S09zydW
4YpZZaujc8xWGZUtLP9iKKVPIs3mnIO/09dV9WZ632fFa6o/cuK1+dtvp5y+
BLstilfVyFCWranhp2tGlQHBQOllWVMmdOcsNvGKivK/ZrvXNLMOqOAwvIaF
0j5VzqD5Au+DdoPsz+7PDti26Pc3d2a9L806nbvdPe0soTFOyPG9kIM8g1k3
O50YTKoaTKs5UaRSLOgoIj6C6PVr+pXykJ48cy7EmtKX7h7q2K3a/9YbsIVI
rV5gQqMjru6Zzpy0bg6KOKWV36ercQfhhR053s53Z/Vc7nKxtNQoL+nohjYS
1ve8WAGoHTUmqga6MbLXqiYBmL6iJCblLrCXMemtlm2HvF9ROZqmrFLzr2rK
ERSUegDlmqZufFHiWsV3VYqVcWypHBjLEuCqKKtYpG6NaR7IgrGebm+2lm6p
ApTbqTddzmeX0jZIMrhBT1Dai6ETOddj0nE5lH5GCWNA1Ivl/HqxPMeYnDZD
lb7GOdR0PmBNzZUKEM4u/nre1jB2A2gOv24L6BkvhrdVGQBmBT1iBqExU3jQ
TtCqfuNshBZBZvsnE+cBh/4ezCyJosxtVZE304yeDsyhxdM5EqZaabb/eOKs
+P3HLWmMg2ILEnr81UCY8VqWkCWqRLC1r7Arba2mZutY6eEzPLn/YOLwPBzn
U8eb4Lnz/cf7uSnLzo8PeIv6Vyhc7U4c781f8cenzonWfzVKGghNW1yzjsjR
nzc5NZLPQSNIgnjOuYK4vfVHiL7944nj/xUqNt2hObd39x8c9CRL7+YIXKbj
uNzq1RYGvEUBmhi3OcXvqaGEA/tWJTSRkbVmrx3df3AmNufT57KkJNxFh1Ka
o2oz9lIOdF91trUS7eqEC07Smn1ORblfzFQctBNiatjL0enoLDqutdNlVDsR
u8f9ZoQXD4mLi7Y+pF1IB9TmE/1ih9SvgEyw5+nVphAkewaiTtU9vRqSTOty
15iNtTYzTiAj3YhjxSoGs43qzWQEv4GXrz53PnZWX2Ah5o/mi8N3x1Xc2v/8
QMdU979of3vQ/vawj4q41CIg7+XUyOgdOLizXF4WU05DZMb6jJgZe3xUoWd3
ilop1qJLIBpWMBjfCnEQjblaAivMNiVuCu3GMM7USkjKqJxwwhFpTPhgbQTF
sIxid7q0ylDbArxKc3GGzX4GlVrO64/sshelo9jesJu6dPSg31h6ey9lYWf9
xC0ybXfWPCh7fUtWDpNlt0M3vepripC1gqw/7SOl91txK87kzDkLFkydmVKL
Ivhlse4sDFUwPBJeMY1KmrazkEol4ao9Sr4e1gbrhNZd1SK9XPhhfuLKCg9b
DXt1cGHE5tkseI0qe6BUuh/NjBf0idNlFtA9k5rJWaRaHeYgNI1xqJtydS4z
pXdSzijFxUdOSxsJFqoMU8JicwB7cd1KDY10rz+S7T2g71Zu48w4HdtMP0qX
0il+F+boJrJUhiFaeobgo2KZKjq50xbsjGsdkuvCrUOHlU6jNGFfLh3V4VMm
OBM3I0+MLmuSI8lqIKvtbDVydzEyq0SRsYhhTYl84FTUB4CVcU4bUelhekzO
UKGhGsHNEbj/yeJyObDPgb+b9QAfL2xYgMKVuUSRr+3g5/YmdP7mkZkb/5mp
LRRk8GsDk+PROZXCqPnwMZKqGGVOgFkZP5eyHYi8tfPaOA94iFZcF602oZ3i
avv1dxtwc1n2tlili7TZYcoj0CX0jFp0h5TMSzXtTi7WfOZi285K+W12VOUx
kMQliIMTqvuhmadgRKfLcyDQ//e//09qlFZjX+eSzg7l/HuWMxq4KgRHu8up
09x2y/gORLFaNhwjprkxEbY9I/okyEaurgek8HdbbWVVuVi93MYLP011MLUv
oMWPVyLpvgrfboWYLGOrI1nu32YhTJfX0Z7qCNiqIjV+QBH2VEdmKIcaMyHB
a2ZpGkLdv1WB2lbBm32ypZZmbR5168ObWhVGbS3besmnzNFMh+K1lUFWPS95
tM3hbsZ3oeekg18K0p0eojZWANmvIR0/AVRqlg2WZFwsB1VgVFrU2L3+6vWh
RgblcZ+yM7knt6mI27r5htOyuaWT5fm02qq9lNeynPbqDiif//qc7Hlo58we
uEHcmJLUTjXf1BQf5+waTeKdCVs3zYbbdwAOkJn0TcVW+mmZF8u1+tj8ekxh
mLBfgXBHR8+rWk+uZzkOgDNIjiA5SG3viIDGy0b7CcetA2EsbWIJJrGETj6X
6hRXaxoUD+KGTtSNTp0G7Zj2M50oYwl0Y6rLeByPzIERBs6h0UHAqstEIruK
96esL+uSnNjModWyTcyNY4yMv5o/aS6uAtBnqsVVl980lujTdpMcxGl4wUv2
c+lmJex9Jm5QbRRLXK9F8VJzZN1VpJeNbmClqWm0AFqDbZAU/dYuToVYrWrb
Y9NxCZrOIAxgJWHf4PXW9muv01MvfNbzF2pmVNtnUzIk6vPNfHBmJW2iju7X
nZtNqnLyG2c+CjOdjGatits5rldKtHPxVv+TujhgTrKtZYRU6E7kBjK+hWGl
UtXUnMsjUz/fmlnGQGdjvmtgY7wBExXjVZfeVvJq2VqmJJ/SPr9sodKCDOzy
hiiGLuyVU3xyvdQ4/bI/ip5Ys2xz5XdMamLC7XOisxtSHCFUV6bkXZQkZQS0
V1X9pe2CPo51kmnQnlC5EDRJd5kW2oKW3XmiyiJdYZkXS3Wmdme7q4q59QoW
zr7ZlN7nuc/ZgYbxXwj9WkC/FbxnQKhm3XXU7WOvtek3YVX/pS0ovBvOtI13
iW9RAHFx3WP0ubxecgRFpYKxUqS7gNFzqqHSyEHyCowGHb/hvdXetQHJMn6Y
w5k7hWb7sF3thv2ACLS395f+XM6WnAbHuo3tjWhPsTZ9rYhdcEPNTQ2xQSyK
YVBRNk2rlFqvcNHFNe/TtRIxLeDp67bPbqCQU3DqpDiD9rTqSSsrKECmh+WF
W3DPWL2fvYF17Z81L72lHYkotWbQ6k+ZMCSXWlBq8LfeKSvF7vXr/+Prxw9C
N+WDtJerVos2Y6tmuXqgVqnV7KIVnCaoOzxNmMju3zYQMpvzdrux/e/B2pih
OeJUEFcmFjUc8zYE2QVvbxC/uxlJ251Mg/eG2Wg6GqEXsfX4NYufLmCxP6eY
h5Z1LTM+GCMmNZCa6lRPVZNYPyDZGiakhLdZAoN2pq2+TKmYMCToBHeFT3Pd
ic36+Pax7JebOSEYC+RadwsD2vNp7VzyRz5STpM1IS1yizl3r6Cz3rAhd41j
pCFbvTFJljede65d920r8dbrVW3m8y3Gx2xjK0vHPmBeDMMRbaM82DuC9Y+2
W1kbBPh84nwxcf40cf58MDP98HrKj+g8/69mdkPQP5HL3bnrfK4zbv+s//5C
d17W1ohqZWYFFPDR+xPnMwofKO8E2fRtZNuZFTPTMOiCS/M1FetQw6zSw7cS
T6U9Noa99iwzWrgyR4gPH+FtmjBV/9x3PnYK/PEnPXu68QXd+Ezf+DO+c0I6
teaJvRnarh/m7b1iKbNA1afS+PQH0Rcb8JTzshUUJkZ6Qb6S2X1y0n+mPPUm
NWJG6bCKpCbmILMWdEqhkrRJZnM4Bdp2Xo/DaeAmvaDyKaDyteQEceK2c6kQ
gYei/VE52Ddhw32nAkOyZTmRbi4VihJW69Z1Gql1+zTjT1Ihk4dPv/vcD7ht
+4NvH0191/enfhbFMUvdb0bkO/d67qQiaw6mV2rnze7hkp0PqX02Kpo92iLy
Ss7nU930SXdH2FCE3/gyVTmM+e52z1ed4jZ0Pe/v8p8fDAW5PXWep5bk7BTm
VpWYmQr6mPjU27pdaPwRbQ9g01+c3qhXww4XTY/Wa6P4aU8SUG4H1L9YXklu
PtlTinQTsOVLJiubU/WtG2jc5O4b2DdA0Narp8t6FGNd6rxfVR401G4HyqPO
xYBM1L6jvhcen8B6CAFef9R3lUzNHfI2qLSZ8Z53nYrVigKSXwrqbZ8IAI9V
HdVpplau3skweKR9aapVGYkX1bJmq23a9aI4g3HKwRa6fSbnF03rWljqJAr+
nOm32bmRVCSac+QLwb6OgZNoIFNBop9jjl9Ov/zL5zbBhtMwcoPMvhRPwziO
QjK9tOeZFsglM3PMzW7k3Auh9vtwGjckxBUHSpVyx+cuXNn1MKLVNok6y5Lc
zroFyEiUsWuFokJKWw35hjUIxKassNagFTqvLJzaxcy6DZmJ46lG4hyMnXVx
Q/mtWH0lFyc8jkroZbdPzy+s+yXoPhHUEHTFVRzOjHIrnKnjqcIX5RhlIRVC
0B2rmAfBr6K6L8owrjvSB+seyZIgVZ501LI75UD3meHByEzqSxfDmiCksKKJ
6nELVYUbm54vVxT12eKCeVex11eidHrRZtHh2bNnT1kKHJvG6iAhXqRCc4uF
6xaDxu5hhOAmRXJYUUL1CCYUKbZTsWi/qnmt2joCZiCT/FqnebKySggpzV+6
Jwgu5teqJkF1M9rBHygVXX+4K0rhGKkKe6gM8dcf6fRw3b1AXS2BUgvrYJqu
h1wbybU8j0zNxj6WfCgOufcp/WhF+aE/OU86d+lPTtskAr9/jf+/b1qEqlPA
ev+Pd2cnX9z/8pHnpzM8a36nAVJoBhjk9WtcJJn+k+PFKf6rAgX86jebVb60
3+9doEHcV97jiRqGDnLJ0tgbGYrOH1qLfKrBo08c6ve5UffuqM425hMGvpRW
/1Liwpu2YwsemQZQas5riiOSPQ3AAGbtqwRq/sOP4onuuq62pXWXfimLQryc
VnbU8hP1Ei1ucaDlFWv7CyZLu+NG39kE63ZeNyZnQWVxUCu++hwoRRZqrbUW
MgC6WWJe5/Vif3HPn+Bv1V2YL6g/FVrTZ1STNjBNDl3fV1j+yrl/6Kl4v9rG
gzayY7tsVW5c42BItQptial1tJOxmm/4rqvY5L4X06/1+qBXVUkcyLSCx+fB
39Rm7wPaPGndN62HMe12rumqtaeDp2xcUifaUKSbwjUUDDTbdvHv39PcJljV
v/8w6W2ouvPvP/TC0arjG2tEpIpwcw/P74qx180HBsDPQZLb4IUxJRVmdhX9
PEcbZd4DJ1QYZGqFQcz5QqrQSgMRJCU2c80YITGpRQFYwkwVgN8/vs+RLTss
3G+mTEYIdEZ+UrfJ5lfvF0YbZHsVHET5E2T56R02ZO5ojis26zPKoiIXyEvM
HNNunOfL1aKGNvpt3ZytIGqdzwUU1zMYhMzF/0J+BcjALyh634XGJ86zC+jU
362oteLE+bwWF863m4nzUECFdb5bElS/Ofuv/3t5wZnR35Et+jfF0vV3H5AP
ihwyOn+gJl3uspZXpvnbom3SqZ2Yw9a0WDz4Nvfxbbtej0X7X39k95jVUBWG
J/Q7znadyD5Q79mtTqf9tpvKmdc7Hqlrhto2nmUkk8MYeMWN/W7Z+K0thyMw
8KFY+/mmorNWdDWc6mzG1/qNOKbOse618+qCFQ+7v01XD7fcztjqjrc6HvY2
wXe4qcmx1dME17qOHX8cHMjVgwt3mwRYlqZkdmc7bGNGdp3tJm2Th64bZtsC
TR/IRss9H2uKOXoaDrWJ06qw8QRxOnz3zR7wOYmY4fz0bbC3Iajmiseeqt3Q
J+MMN6Br5td5XKEx0LE69Lkdu6AH7/ZCHRHE9/Eh56naGMJDL1aBTM3Cc/Yg
m8iH7ojLKSfMmk3zdmX5Kpmi+J/R7sxO2V15ldYxU5NWxfD+X6ekVx2CB62M
t56byTEGsIFAXe2smbHPxu5iS2Oki5lpZEfFD+z5VKzFNOpQNn2bnKIy7CvT
TIuy+a90TccVDF7V/2pt0yd/k33adOKF437SG4C9b82c2CZXCpMVYw1Kxxbp
fOqe2wQC5wK3Xnr9FGa2fQ90XYvCa5rCjxs+kqwxvWxapOQ8Su2fVL6xtiMp
+Zw3uYlQt52+WiiSa7VHYmZL9Pr6IfW39ggmWJyTc9Z2y7MtzeBrnfsTuymq
FRxRywhY2eh8nY0dzWOnjs6DwbCnbY4Wg0JLEEqeoSe0D9zOoWlzJijMJPot
lbe5sT4yQuq+dtu5tl2rZZNxfKILgSJ6gCJGWZC6urneR87jfpK6xf547zlH
pF9vxd7vthBF+cm4EkW5f1UpU7HEDerWIVUqrvlrovhYx6NGG/xOVB5f2+2G
ljqX0A6nxK5ZNKu0CHWmQLOhhJXZOcynfc1kDmZtEljHE1XNBTNArrq4PV/s
DY2HLyadq5DwgvAOopr4Uld/h4/h0XMj1tZy0aik91MwhW2OasG3fb+DMAA8
0Y0XVR5y286sAy5UXfG9+4MuWBHfn0+9Hw4620rNVs1rB4vurxOMmpvZEpN3
9agY80g3wirONlDwPiXIfV/bLzpHzn5Nvx7YV3+gngH4EdSD7lPHElM8EPbk
gGr+tWgYWYmpYLDW0aa9g64IAT5lj44uR7A2XR3aZ2GdEqFbmKcoU0lp01qE
lGqLKBt9UBO+9gf+Wkuk3RFdM4ivuw4oostNtYPB5uxOmwswowH7mLYdsdtO
wZbPv8crVEvkbtxpK06sPt0mV5UdMSaXuZNmx+d95USD7vi8LeTYOv1O1bHw
wXfn1GCSSN/SanRQ51x3tRhVX1opYZQXNYYSIJw+2fZLtJB7NoITM9ODIwcG
TGcXM13L3e9j7+xvcQ/1nCoIOZhYzavIA22EjhITrHyM9RzXavawyfiIrr3D
+znSY1mMHuhq69itMDgclJQpfbuxugQyXzkebw5o2M7xVksJ0/xP0dusP/6s
TXGDkdh6Orv4ki5FWF4tuE2UfXoyOWHZs7ZZzDlyejzrrFftbdP+vt/tKLPo
esGMJfeLU+6irGoGtad0EBngCIhY0Sx0vcFu1zQVqC6MZO+ZQDojsbcrKg3N
FLzyQchtxKfXvgcr3S6GpTKndVsM26bXd3UoSodjt7UmVWF/b2CM1k0rKwZI
YrvN3xlX9o8/Dg924Ys+ErVpj0RtrM6IukGZPlaJ+0spzcKCKvBKXKveWPwE
J5N01TDinSqcCAmNVqPJu9f7+XC3Adjhg7YA74/2LufkcN2pvKsO0g1tzPOD
XuY9a6m1PAZHXmlWORvSN8vKV1sG3auePaYn+PQWJtxxs7WVWiXgY5FfOb/H
MLaxRh8/bqz+nlvKYwc6oz32ujL3vSAvtKvqxVg3/377gp6e2Uqpi1ZIjSpi
HHFnEeV1LUEGahjVdvA2tXq045uita5qXncRE6ddlEAjY9uHQzdq659eoDwq
yh83OGlN9ABSKvo2QUVVhdKYSAjFo9X4llotmpYrqd5y4wdrMDL1UGimujH2
cJybPT9pS2QWpVhtn86pk/Mts001ExBW+HvgsFpaZesTxbiHx23YJ6pc1AtF
i9TbrmizjDUIKWVCP7HF7cSiX+HPJNUmY4zy215c6wEVIPtR5GU6rS5JwpQ2
/lFpX03dwKerhGEgi/USNy0TKzwMWyMrzGI6acrAeVgNfLvto2KFdXFmtKEW
EFa9FoBlPp+YwMPjJ89PfDc0iGtwwVamyLYR6zVhrw5uqWTtjg1tqUyKW7DG
ZFJTDK40rWpJkVu2g9sDGvp+TVMw8nxKXnmA7tEDT58b/NlXJ54/DVKPgP1k
+vCwa+RE+Q1sk+rMddUgiMLHjN9P/Gcnzxmvu53wzE6krpcoBP+OpID2wquU
OK17iKZmgbp1gMkIg5+dz3qAtLNGDKIz3fadZMzsLw60ltuCmZ3ObLm2fhQt
rdixshYvZUdG7THVF1uyQZm2YsywFe9vXb6Xafn3sY73FYy2tQ/KMz+i5s1v
M1f1g/TPVrcFsknZAA1Hug3f2uDs74ayOfusV2sdj8b6HoyK0bYQnubRz1nq
a0ddmRQ/9btW+9nR/4EtNnV0wbHs2RudESi39XMeXDPPc1UK3GVLDdp38bOc
8Vm3gQJT1ogRDRCmzHunz2mZ0/Vy+gzIsp6ebB14r0KqzC6GB4Cyed503KS3
5CPqDt59lvN8rvNVXdotNVccBM7rEvK97YXKXlSrfyRX/zpLmp96RbWnnfC/
vklCxO/B7JMt48A0+eGGBIAsJViZsawaY7MGKnPTeYWqBy4/euh8LWmXijZ3
ctf0rErO8ZOVnpNvwiRgmnka3IIqxDmvOcZQ4qf1w5H1ZOUd97stk8LTk426
V6mowjDVMlRLxsG5ftYkOM3R0jBaA2GIqW3YazQSN0wU3BEE22ma69O4h9b4
sEGAOs+7Bc9bDdhhUM+cmTZ0WLbzUma9blYwCKRZhwaONQUYbNBtg2xDQ7BL
khntPEBzYFZsugaQGchXD2BC2LE3dfV71zlyjn+YqDe/P8Zf3RvGzTcbQqBV
4a2q3S3fRE+zHVrzxEJv2sm2Ywy3ii0vTUJrrycDJaTtykKb7J5fP1vtLdMc
IEDPZFdQas32d0SAv88Wh7TFxyRcVUCv2+XwB+4jOvLW1AkZOcIhcoT0GiXh
tQjCf40iyW7XggU+pY21UnOhVJ5D57GeFEkxc5c7WZBKZu25MuN08USvJTNT
UqvQr2RfVFp9EUc9DXQuhFAwV4dCWJG03Qclzl5pOWNgOntFFu5Tq/fdTiS8
0fobIB2rRRq7nv5MprPLEfHqbZHkIVa2MY93YkANoeerMfQ8bvr4qUBp4+Sr
lks1OzGw7wV554CZxVx2Rc2OVDJs304YpIhoPO/OyRv4CrZ9WBczS2vcaPRs
4w9DOcWdiW+BZFr37WGZcgaNoZmyWzRGbdsu74xqH9L0+BmG03vaTozv7Qi3
4Maj5o46w0bbNJoMqDH0OHFf2J2e90dmasboEP7RiJ5v4f+QrUkbYfVR9CpE
xDZ436rZbcfsyoZSjYd06N4w3aOu5eLrj7SXp+3cupWd1TU1pQ/fUF/YdqEx
g7dMXhFGmzeg1QnqKb7mt5SnhAvdN43kNuOc6LFeXrd5B137VBPS+B2ZXxQ9
VF/TJzKs6SQpk3nAOEzJLmqGs2vYpNX+6nvPbOPq+8sfVFvSutB6zuqcKwPb
NjjkRBnpIGm3iNQt5w7b7qjtOsmjfk5dsox+JDRKE4Ph41KtysOup+XsUpes
mRoW09OWA52zq5mhuJn/18uZtUSVJLKrYyTVgC2VJDmDnF4VmxzsEwtZQXG7
+v5H1Y11Vu3/+MIQzY8vXl9OvTdW61bca9XN7cghp3aC5f0467cf4YH3LyfO
CTW3XJ/J0XUbiWYKkYBK3DBTtxRRy6f5chnm/bk+xMSOB7en0XScXOWYdAdB
GA1kcKaPMsG7OLE+0E8AFMI7aEGuhrCherr/J+p4KVzoYsJTFYL6YTouswHh
LlSSllnpEb3kmoNHTvdpeNHiq1xMVR1gSRKnlKQ3nYl5RTTa6lZr1Tdp9yF/
w17Akzb/RDUSIlm5fQa1CkPvmz72x82BSj8DFJ19c+z8Uy4WXcjAGyTpakd9
m0TUBpp1to9jsrx6KUwBuYk46tmmIL1DGtPhgXb3abbD9eX79tkAwLqrvui8
8eSAKb2wA0OpVeuEu3bl6mR00N/Ae21kZHPkUO3PCzXqJ871RMtIYlnVck47
0RHu3jZb2ttzIMZOSDxdQfAAua7wBP7BI/wHfXvqeD/sOeaoMHp261w8JzAH
iekTDPruvUurmepoB1bvAGNA7bNWo52KTmSJWdML9vJoz4lVMovbm7tvz520
xSuydHxMP1GPe3yanl7k1ffB6POkHoA83D0n5bfOG57NYOaGankBdCJjZh1P
p8GANw/2PJdvDNZm/wmw4Mk9z+MHV52q3D9erqOUPU8pGVd6Obz8FWX78NKm
DBFKq1AQ0XcCdcenO1g0ZmZpHtZ8Jup17X7lun9IC10WoGhHuca68xNbBu+2
DH5UBDJ7X0Ezavn7FmMxp8HReZyKwd+2z6Z6zVQIHvZpliuIr4dEC/TrLfx6
NxFfck4BhXtsLoCHTiZDgYKLvVG39WRNqZbisA2wCXdPmtedSUsFmXJlacjs
fFQFklQupsj5BjL1PwCZBjsIUmWXWWRhgWCoAKtBezDSRBTxKMYg9IG4Rub9
L2r4rMl+fBGjdHlgaP82ZKUJnhliJ2tXTNtmTjbh8qmVTODm7gldu2ZS1pSl
NqlLrbYL2riq+nJKQ1K7TesEFigVkPfYDk+XSc4u8XdodehvGyBc4cY+dsKf
OKHeD/+vXkQEB8uI08xO8EgcRUGkKIqr/Zb6FEGbutg5jskYR5mq6t8mZX7w
MYmZRy0GqwqXb2h13+rVvf5ordoA8Z9v9HnBFgDaotn23GhupchNNilCCvWy
lfCcPz77UpKC/S0ll8+6vBKqaeS2Li/lNZ/VobLPqRq+PXaEBnP4qCoqDVUx
RfUBrc+tuY3eJ3iFDBNzk3SmjttYzZVEl81CX2zPAKRcau4EuoaFRcWaNM5k
0MlkNnX0VpJjAE/+rj01XLED9XHK9SKFvtqsON5LRX18apbKseFlmCqZR9wN
VcPVJInNnpTcS7tR2sSCG4Da8LSP6Pm93oU/3Pu9GuYPJqZizuXWLlbqLya6
fGilfxlRQFvQWnQ7D+Kumy6Xw2oygpeBrfQUd2jQqzEg13fa4+7M+ZoFNUZU
rVFUT1j+jvo2j0ju6WfkMJjxaYdG8igshfK7Kmrds4dqP0zKyFYDhBGPSjdJ
3iumtkfau69rCVoJR+fe6EN5FFOYET7OFO/u+pM0HFVanl+IxXVbj2vqgc3X
mIU12qhU1qlqA6zUdVr1GbsxFSWQw2Rhbb3pYfQSOKTD1FbSw8hZPYpWz2Aq
myvtnul68Zn7iqsEejncvbHIUllx5NYaRx8PwccLD7Iu1WFWQL87d/TIjL/q
PG5GbBsxNXJwPXO3BQfqRfuETn1m5P4IkTKotyn1YHjUYb+9ZEsOHd7rjurg
7YPGwxwFsTvi9sRBa1m2XSIwzL+ePDt2lA+E+G531uqwVO53nDCx1FG53hTB
iYdT0dx49qyd/UyBg4KlqqvpTHWPmWmEMe6F3v4StBvTMLb/3ODw49aSZATm
UvkeM2na4IBuNtXr96xTo9b6oNuZaZBcgnBmSiGa7dQOybLvG6IdYhIvAVu1
Ubt1XDaMG/SCjiJYdbsWQLuyXXMEdVv8yqWTw/UYls1njJfkMLK4cG+X7pmx
79HLL/Qa9gzaUx4/P37CT+8xCdDJGHqaey2UnE/3HMd1Xc/13cAN3ciN3cRN
3cwVbu4WbulKt/Jcz/N8L/BCL/JiL/FSL/OEl3uFV3rSq/Y6XOHxpm2VXeBr
pZSvx4H08iAKgyBJKpHHVZ4WlVslcZaKLEvdQri+55VRXoQiF/hgWSYillVS
lnFQVMKca8ftStjStw+YO5NAMudquZqXM9OmUU8jDntR3NvCVqH5rw+6+pyj
OI2juMD/Kt9NkrhKfPwe9uCPPy34V7GfVFUQpmUlZeSWvhBR5qXCj31PuPic
qJKwSGSVBW4ZZnkkAX0hkyCMIpkWCYaI4hLbV+SldEEWieflZRlFZSLLqJRB
mucZLos096UswtD1hVtWWG7hxUGCBQa9LQQfMTvF3aB6e2ZIxZw4z+kY5KK2
84W7nBC1ylr3FCLa7jpcibzgPiXE2clWek80gM21/vUhgRf7vb+DGwhQxH5W
BL4I3KwsRRK7UZKlVekmhfRdkXvY/DgGgYZArVTmYYzLeVxWpVeWmQy94e4V
VkGtlQHfEaiS33Ys23qc62R6e2wYuv0aeXovdQhAMXrswBlFI8t291V7gHZs
rTHrl7pyfynOu3gRp0uSjhHrNjf6OT4rtenUGOOiMy3WB+d5KbH1jhjF63uh
4PSrxKhtLLIeIPfb3w/FHKdMUxnEhY9VRIEfpnnmZnEiMteNvFwEXhanqfDc
JA0Kv5BeEsauL4uiwH/T0hOxwtIn5LBl3OnOamsPvrMwke3C4RPmBIJ2kdQ3
EwrWKEZxwct8rt3EdKftJQ/8rMS7YkfdzvxXhxtjA/eQwYt7qFSyVIp8Nw5j
2ihv+LCFOX4pAgifQMRREcvMz1xPpnkcp0UYZF4i86zCDkNPSGUclxHwqcrL
NAiEK4s8C2SPOQknNm1JDPeZW+2uVUYDuVO+plzRON3SGFxXsaajd9s7Dn+x
o+JXt3dQqd7/fxz9/jkD/DbQbwP9NtBvA/3CA/WtI9e1BVDplkUchGEgPC/J
kzh3szSMRBUEIczQMi/8rHRhP6WeKF0IHJikUgQi8GOR53iZtJ/Uy6uC7FXf
h2GbRlBa8KoblpGbQowVRRxBcymg+SS4l1V+gqHx39AVMooqDFHEaZin0HRi
/PiF7/uRn8d5nrp+mkcw0Fw/d3MpqhxSMQ2i2IPELIIy9WBj+QHNIi+LPAyz
UHgwrGUKRcv3qkIEMPhg/UW+n0jhxkUE9anMIUmKzC2DSkaplGyt0UKiKM8j
kUqAxIM1nmUlvhLKMq1kFuFXP80KL6W7ZEFmgK0Iq0CWfhClMAsxBDS+0s/y
IMhh5ydB5JVhVRVR7AtoenEZpPizyos8Kao8LMPS9/woryDtCiwfr9EsgioD
oEKviMoAUwwDAKB0RRokVeZXcZqkfhJjZQX0AKiAXpx5uBGQQpjlaYEhUlHm
WeSnUCqjpIS0zPBhiQ0TeeRWEK9xnvp5FAAQRebjmQJWcRqKIPKxgJAQpsIE
y1zCmC2zKKC9SYowz7wyiPMwqlKvrOJEeq4MZSaSIimg7QiRyaSKMli9BE7c
FHlY4ftFImReVECLBCgUxngjBVKkgEnlQ4RHAJoMPA8IBgB7MvPiwiO8iLwi
TCJ838vzQkopMj8OsyLLCyhNuJ6W0K7TQmTY1gyYEkKthuqNyURF6efkF/Cw
yUAaPByKCFsH+92FSuH5AFUUVFChoVykReGHUULOmAx46hVpFWNlkUKtMk+g
rRdV4AU5lDQY/ECOIgPGunEgBR4uaXpZGBVBVJau74kMahxQDsv24ogUHF8A
gWQmvTKNAFkeyaMPyFT4IfSePM/JeMgj6WeBFyWpK7B3mazcMolSQvA4lq6b
xIkbVmEUlxIgArCiJMEC4xCzDaoqcUWW4es+3iF0rUBJooxD6RMsYlFlZZpF
JaYXZ4kP2IW+VxRC+EJCbQW1ponL83ATKFZZEklsAVFyKhNmQGUMnSwHQoWV
LFK3JJsm9QB0vIltCUJop5704xQ4nER+BPonxC09IHGWSAJnkGP3C1g/sohB
ckkI3a6UAaYYhDFMpQQYkVQwo6rcS1wZJL4PgMjErUApUUSzCAI/ZUW58CLX
z3zXLwFAsKwwyzMwkAKaYuRFRQJDKgG4dMSR3Mv6EKBWGeZMIbG6PjIq465z
7lqtWenIBwPlGTCwUgv99/K90ede/DoV6Z81MAsujI598sDbYd+Cv8d+4qfY
O+Hn4PhgAH4VuCAxP4DsCaIgDpIgDTLImjwAq4foqUIeyA29kHAlDCPgC7aY
uH6YhwUYqgyrCBYzEA/mdhRFcQRCiMC8ozwCPwU6V7Ebs8EG4ysG3cQRRE4C
wzyLRQyEgvkmYcC5iZf4SZCA/YDkkgTYnQgISMi5BEwudVMv9dMg5YHCNEqJ
L6cpZE8KxgLOK9MKss6DSRdkYRZloLcszYg4czAwEHZWCVd4oLxAgDMp4R6L
ZGAs9v/ueR1kKaSP1fkQZZkMRSEFhBOkTFmGbiIxczBMgZVAfkeZlwNMkQtW
TALLyxMiRRciXEpIJ+wjNkUCIDA8IYiSIoAUjVMX8jTJKgihEKZ9kkDolFhL
UcZxDslBbMkNsYlhknuQYRVGgdj2RF6CykOwFy/3SXPw8b7A66nIZUyiFSw5
zKuI8+ijVASxX6ZxFYcluFJapbEbCIAT3En4WRJnOXGTBFIXLB42ciD8xBMF
Vl9AvJDQxJ+Q437qejn4bB4maYjFQCBWAvzN90nkQMaVRQJ9IEncICXgZ1Ag
fBfLJUERA08iMCBY7lgROLCpueT+47o2x+wERzMXy+nywvjxhr5Bd+AanJWy
mm35A7Ur8JtbuHPpfet1uhy8H5/R339BC/vVcZoRV5zbu88ke4M3rirSBIIF
elZZZDFmCbEHhUJEkCWQKLlHOO1XGQQxtMgqIvWvyAQUCwmMTNMuuXzYnrYL
cw1b1H7wWFfvA+8W8OrN+heKeiWiBFFD845E4KZB4UYROFRGKgpmUJDbE6oR
VPUKfAUsCZpjEQnfzUgH8LL8HxT16kP5HUNf/1g4v2/8C+II+lsioO36ITF5
kYUSrBb2GjS4AOZd5kLlhDIZwQLIoMyRGAAHxGzL3OX4V+75BcRpXmUShgIs
AZhXCTTYMiuxfy50Q9ga0NQxaIIthKYe4fUS6muawbj8bxT/GkeIWwXBfhl0
eJdIWASRKWF1QL9xoXq7oDgYqjEshCKTQooozAuIdXwV9h6MUF+SRSATqGJQ
Anz5WyTsZ0XC+rj1TuGwXwy33j8m9rORDUNkZC/DCsxJaYfGFsJE9SvwIeGn
eVEVIq882M6577owBEqPnBylG8Bmhanoev9NY2JD0X/rwNgvgiV/z+gY+QjJ
cQPDHoo54OiFcZHBqItgRmLroeHnRRGlFew3P4tzSaag76Zl7mc5/vwlo2P9
XXyHENkvsov/vR3cvw3020C/DfTbQD9zoJviZK6s4iSFfeNH0ESklwUxrCmY
rLlIk0xUUSRC6RVZkldV5GdeJnG/DBLhexBHIVloAlKsyspEVq5M0zJNcDmo
ZBxlYNx+VWRuQUEfEnF+kcs8CFNXxklWUqRAsI+qKjyKuQQyBE+PZOpCkQoh
I0WZiTLwCp+COUIGsVtREkmYlkLkSVmlVewFkeRQW5GF+FABqzEgEVEUIoZ5
LkSWp3lZuZAcQQrpLKsMVp+bxl5ZuIn0YasnUcSyHXYkhi7yJE2jACpiUlSx
TKCniUAKPwiqIggiWKcyzDDZFHag8KJKppkfuZWfhuzyk4WXyIJ6MUk3wgCx
W4iwqkqvokBekGRR4pYBgOsJkURZnsOIjYMyxkXp0VYFschTWRVlWkCnwDLS
SsSJwIc9QU5HDwCR0C/cKsG91I9yAMyrfJ9yOcOMojJp7OdxiFW6WeoHRYBd
wAcwJAZNU1FlMLSjKCwp4EmGbVwJ7K+IY4Ftwu6Q+zMTQVwmAa5KKK8FQSUP
/aiU2AtoKHGShH4KXcdNhUvvQ53J3SgQcZq5UcVBrgAqC/SVCkI8ypKYXJn4
ZpxGOXQaqNFR6UdeUGBiWRiWkPBRJEt2lESws0mB8vMsDSuoATmsdM+NKK4W
kOQPoBW7IexybDJU56KSQRJ5YZBXUKFSP8RHMi+oeAjgCLAkJ5d0Cnyu0rik
ZwQWWLh+QMEhDxub+aABoD+QXUbAiTKXpHAQglf0NHS7OCQ3TwZCiMqwApKW
RZVicpmbysDFKL6HkTwPOkuGPUsDKHqYK4bIAiH9tPDcDIq9l0qfXBFuCbqq
gIEyLwEaz0tFkmG30lxWPmgsjkPok0kkA9rUJKvCnFxMFD4WUY7NDwS0xSqn
7FyZlSEIFtgATCWHtQQ8QcNxBPWpzL1YYSd2Pi7yPIkS3ClhgACwIBvXK2Uh
ozz0QJqyCv0YZksBeghBdNBC8YEMKEjYWeVJFWDPS0nTpR3PgcX4P7wqyiiQ
QeljCTFIMA2gvvpZWsImyqoMJpMMOE7m5xJ04WdRgeUkZQzaTWKQYuonmF+K
gUDnReG70JODAhoeVEEKOoNQpaSF5JhA7lFwsQirWISRhFrM2YmJ77GnJpcU
DU0r4Eheyl93nKyvUr9DsOxXYxj9FjH7RSNmZRGCzaY0sqQEgliUIAMZ+2Eo
gqoCtxJ55oHLxBAIXgLRR7GooMwBUpGkHGiCbIKUAm37UZGlOYXaQ0ABPBqC
LwfLzqoyY9ZSgSH5CaVyQFRVpRtERUj+E1FkWRRA2pWAIfihjBI/EwIiIgdr
FGWVxZzUAUhSYB3PQaBTeA1cTkje0jCpMmxulIQlWKubQXDHoQeRi03146oC
k4RsSSVxkBDSOnAhU7BBOaRPmkUkPl0BDUEI1wvo+Yy9ym6SU1qCKEitcOMM
6CJ9ghU4FuWPQCxD5wGWFClto5B5Aq5UYeFJDk4ps3+2iFmf47xT2OzX4rJ7
t9gZUB4qaVGAhAvoNKLKM5+yhHIfmpKbQHVMIuH6ISEpxDxYDoRIkqfAzBIK
XmZiZ45esHWUqToDvW2LeTm1uppTkzw+IF25c7de1W5XuwM4dUCfsXNseTFV
pdXUmnS/3y39YNc+dw91YVF1SPuLpi57u8tXzQY+3I6LfoOZfOqAG0pwAtAy
8UK/5N/BDX1SW7HVAxTIIyiEUE0g7QtoeDFsBWj1wge/8ZIKPAY8mlhG5oPJ
R6GXQDFKQ8qOAzGnhT437heEWp803g10fdp4L/iFMDygNpMOGhNkklxmAcAo
EuhgIYQOMBK2FuUpgrlDl5OSqKsq4gziThQtoupDFBkj+cDE4UEBFE4QFBMw
halUctseajNs2dHYZ0gxJLmk1/SD53ZR272QqN5+q8JaH99IR1DxOTRWIe3g
2PnDvb32vEU+zK0S83mdz6V1OF9jnxcxcs6V6hJlTgik/gqpbt7Xb/5oL4WP
nlg3cl7pWviV1QxPdVXnzmmmFxK3s3QPt7rkmp7DqrC7YS9818e/PQ5jf3vt
U31c9A04y2C8pybwghb7gpoaCG6Q0kdWcyLT3lPd3Jx59atK/7j6pxr85AXU
HyFKAQUoAypWAfQVUcDaiqEkcChE9VHRcRHyIMBe9QsoGzARwkx6UJQg94WM
82I4+vCrSnzc+LP3rUbKpxrD6NhVXB7G1NtmYTPz22xi9/HWNfOqF9PIkZsD
zb6PO73GkARZ1WZPdfo2Z/oBVRSajCDkzftpcZ52Y3fs5hbD/vDb+48yKVI1
ReaVAQVPYkrZinoCPUx7iRgehLXrQw2ncH8GJdINghLaaAStt6hgQlSBqPzC
lVA2o5hSoySU+7wM4hKKMemrEElRVeQBkJWsRLZ3YduHIqds11xso5uCawot
OoOhGlWUpisLWKpBGGWwCdIsr+IMSim02goaPYASxDJ3S9gyCZRxfJtYfPVP
hbFDgXlbtO0Ly/9JuJv6AuatDDC6G4jCBecMclhiQvowb+II84J0z3M/zOJA
uJHE91PKTvalkBnXJiSEyFKkRR7Frsi82A2hLQjYNMC2KA534G4B1SLNYei4
Xlziu3FFDpg4CCKRZNCgYc+WaZBkUI1L6ZJr1CuB2nklZRaxZzG3NOFe69qR
s5S1NtxvEP92HURpfW8bHAjb1zdYjlKXJd3oWyEupbt9S5JURa6bkUlNlaTt
DoqT25lZ+NSymo3ToXrmSB2vbk5rc8KBfqFNQKZTelKfm/72LuUjyqo1+fYv
+QLzwudtqhttjW5ktpO4pJPif11s2gFx8I91r21qtQX/LqfFhtUNMOr2m499
UK0/+b7qL/N+K37Bc7j9uu/csdZrVAteZR8B2nbg7qsSWhw0bWBA2w6UO3cR
w5w6XppxShax3U9heM7Gtv6mnuC3XvCQrfZ6u+3goe/3w6bIHvfgYjXLQKCX
qF3luApG8Z4/Q6D3AK36aQ86Q/ePTNYia6JPGWgP1TJHZu06IcnZ16cZTZwb
OmjfelP4vRe5HN0Y7le31/amoqNc21n9HYTezRv2vhvVjtVmED9R5skNTNUY
MHy4j7ieL+lM1LPlam0nphju0B3Rpg6A0u2m+HQo3RNr/+ZjJG+1Z9YAhneo
8V+sVxtuJzSwnEbPh2gZyZBZ7pmOVLinmzW2zPNcvOK2Qz1+R21rA5+b/zny
VSGlbr3ZHUZrIKdeU95BPYRqCHZOB4RTG2wShdV8efVzIWHGeRdAGAxt8WQH
IEYOeVTnC/YP/yAM2D7U0ZzupYBgzulSZrqNKe8OADae9fLNAQrjq/87sdnO
iiYn/M8a7x0gvyXBevsAiJtIWCfXtI966Ocw/g3NDTjJtJJXuq3WTp/07XaE
mcYvtR8/T8Tt2g3VxtE6PEIdStwekzDdOiSPeSnxJ3MsF5+jMPX7B+lpVgmb
VNDp1cr7xjnE1rf2Z+2uzw5Ur3rLKzXhxuEO9WI8PeMROKe4P8BF93L74rtv
spKbepe78XdstRKkH36vHxmgP2SQElHY9Oj/7G/8vAF2kzSksNXWVctg7jK7
y8jqPW40quEpC+qAtK3jHN5MVB6w1bN9v9++9kA37VM9bLte5/2WgKZp6bhr
f9L3huzPjjfn35qBdKvaB6oH88nmfGYdXmOfkcYCQukn7bmb82apO63afXXN
273DHcY736rT5kRJx7HQjOa9Mz0t2muPxLZPldhv1vLC8Vx1jkuvXTWt4uoM
iE/gxdd7Ruv4DrcW6zfvsoOtcX2brsLdYe07Al7mAIDRSIz56GwXV6BVWHV7
+vGeBm2u7XZzggMkhkhUsCUJkigu44CriYI4HzqBojgtZFVWSRLGvi+CNArL
1M+CMPOiKg+o6V2RZmURhjmGSYKqyLw8S3wqDKoKf89GR0LzvQ4ZeTo8le80
eJWbSOWBq/oCVc+UqusqXKkrD3Spk+erm+DP/G/kqdue66sHfDdUT4Ruph5J
vUw/EwdpqMdM4nSv6/Gs/PP4IZlk/vWx2tiPszgXmZ8GReaKABdEEmZREFDq
XxHkbuiVgczJUbQ3IAheL+4BbHlg86hhL+z/vvg5iJLfBkl3ODXfGVNFXuSF
oESZKnPZzy3j0EvKPIdAkh5XNrsh0DiiRg1BIdOgDCUe8mhrU/efCVPjqsoE
OSJLWVRJlIaBW1Z5nFEaYx4FUVamIvcT0KwXlIDDKKbGUQi4lPkuTCWWe3+E
uXc8tzNovxmc8DIT7qxXgTUSCe078yE5P3aEy227+0HBvt1zg6q91jIl3CFS
eoKI5qR90TdzZD3MvQV119VzemGtdRT5R9H8A7vfb4XPQ0QiRze+ZBApTyVl
NSZ+WhRVnCR5IkRehmEBovFKNwl9NyojThEpAzcpb7Ln7Y76RqehjMH1StCJ
Safq7Fn2i6p9ynb6KMZl4T0z0gu2ofY+E438HyVGP7T8IiT8R+7ouPS4/bb+
00ufD832b9jg/x/9NaxRvTgBAA==

-->

</rfc>
