<?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-schlesinger-mole-ec-act-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="EC-ACT">EC-ACT: Anonymous Credit Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-schlesinger-mole-ec-act-00"/>
    <author fullname="Samuel Schlesinger">
      <organization>Google LLC</organization>
      <address>
        <email>sgschlesinger@gmail.com</email>
      </address>
    </author>
    <author fullname="Jonathan Katz">
      <organization>Google LLC</organization>
      <address>
        <email>jkcrypto@google.com</email>
      </address>
    </author>
    <author fullname="Armando Faz-Hernandez">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <email>armfazh@cloudflare.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <keyword>moderation</keyword>
    <keyword>credential</keyword>
    <keyword>credits</keyword>
    <keyword>unlinkability</keyword>
    <keyword>privacy</keyword>
    <abstract>
      <?line 137?>

<t>This document specifies EC-ACT, a keyed-verification anonymous credential
scheme with a hidden credit balance. A Client spends a
public amount and receives a fresh Credential for the remaining balance and
a return amount chosen by the Moderator. The Moderator verifies each spend
without learning the balance or linking it to issuance or to other spends.</t>
      <t>EC-ACT uses a pairing-free BBS-style signature and proofs over linear relations.
This document defines its cryptographic operations, encodings, and security
requirements. The MOLE protocols use EC-ACT as a Credential scheme.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moderation-of-unlinkable-endorsements.github.io/internet-drafts/draft-schlesinger-mole-ec-act.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-schlesinger-mole-ec-act/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Moderation-of-unLinkable-Endorsements/internet-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 149?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Applications such as MOLE require an updateable state managed by a
client but authenticated by a server, with stringent requirements on
unlinkability of updates and tests. EC-ACT provides
such functionality: a Client holds a balance that is authenticated via
signature issued by a Moderator, and can be told to update the balance
in a verifiable manner.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>The capitalized terms Client, Moderator, and Credential are used as
defined in <xref target="ARCH"/>; a lowercase credential is the generic cryptographic
notion. The message-encoding conventions, Python notation, and helpers
<tt>I2OSP</tt>, <tt>U16Prefixed</tt>, <tt>random</tt>, and <tt>Seed</tt> are those of
Section 2 of <xref target="EC-IHAT"/>. The algorithms use <tt>bytes</tt> for byte strings,
<tt>int</tt> for integers, and <tt>Sequence</tt> and <tt>NamedTuple</tt> from Python's <tt>typing</tt>
module. Record fields appear in the same order as their tuple representation.</t>
      <t>The group <tt>G</tt>, protocol context <tt>ctx_proto</tt>, seed length <tt>Nseed</tt>,
generators, and balance width <tt>L</tt> are globals fixed by the EC-ACT
configuration (<xref target="ec-act-config"/>). Shared group methods from <xref target="EC-IHAT"/> use
the EC-ACT group instance <tt>G</tt>, which stores <tt>ctx_proto</tt> and applies EC-ACT
domain separation. Both schemes use <tt>Nseed = 48</tt>. Public byte-string
inputs retain the length bounds
specified by the operation that uses them.</t>
    </section>
    <section anchor="preliminaries">
      <name>Preliminaries</name>
      <t>This document contains executable Python code to specify much of the
protocol.</t>
      <t>EC-ACT uses three dependencies:</t>
      <dl>
        <dt>Group:</dt>
        <dd>
          <t>A prime-order group implementing the interface in <xref target="group"/>. <xref target="ciphersuites"/>
gives concrete instances.</t>
        </dd>
        <dt>Hash:</dt>
        <dd>
          <t>A cryptographic hash function, used by the <tt>HashToGroup</tt>, <tt>HashToScalar</tt>,
and derivation algorithms that the group of <xref target="EC-IHAT"/> provides.</t>
        </dd>
        <dt>Sigma protocol:</dt>
        <dd>
          <t>The compact non-interactive Sigma protocol of <xref target="SIGMA"/>, instantiated in
<xref target="ec-act-proofs"/>.</t>
        </dd>
      </dl>
      <section anchor="group">
        <name>Prime-Order Group</name>
        <t>EC-ACT uses the prime-order group interface and the <tt>Element</tt> and <tt>Scalar</tt>
types of Section 3.1 of <xref target="EC-IHAT"/>, instantiated as in <xref target="ciphersuites"/>.
The prime <tt>p = G.Order()</tt> is the group order and the scalar-field modulus.
The Python interface provides <tt>G.scalar(x)</tt> for an integer <tt>x</tt> in
<tt>[0, G.Order())</tt>, <tt>s.isZero()</tt> for a scalar, and <tt>A.isIdentity()</tt> for an
element. Arithmetic combines values of the same type: integer constants
are converted with <tt>G.scalar</tt> before scalar arithmetic. The negative of
an element <tt>A</tt> is <tt>G.Identity() - A</tt>.</t>
      </section>
      <section anchor="errors">
        <name>Errors</name>
        <t><tt>DeserializeError</tt>, <tt>VerifyError</tt>, <tt>DeriveError</tt>, and <tt>ValueError</tt> have the
meanings given in Section 3.2 of <xref target="EC-IHAT"/>. EC-ACT additionally uses
<tt>AmountError</tt> when a balance or amount is outside the range admitted by
<xref target="ec-act-amounts"/>:</t>
        <sourcecode type="python"><![CDATA[
class AmountError(ValueError):
    """A credit amount is outside its permitted range."""
]]></sourcecode>
        <t>An implementation that raises an error <bcp14>MUST</bcp14> abort the affected protocol run.</t>
      </section>
      <section anchor="derive-scalar">
        <name>Deriving Scalars</name>
        <t>Use <tt>G.DeriveScalars(rand: bytes, info: bytes, count: int) -&gt;
list[Scalar]</tt> from Section 4.2 of <xref target="EC-IHAT"/>, using the EC-ACT group
instance initialized with <tt>ctx_proto</tt>. It rejects <tt>rand</tt> whose length is not
<tt>Nseed</tt> with <tt>ValueError</tt>, and raises <tt>DeriveError</tt> in the negligible event that
a derived scalar is zero. EC-ACT applies the following requirements to this
shared algorithm.</t>
        <t><tt>rand</tt> <bcp14>MUST</bcp14> be <tt>Nseed</tt> bytes of output of <tt>random</tt> and <bcp14>MUST NOT</bcp14> be used for
more than one derivation. An algorithm derives all of its scalars with one
call, under an <tt>info</tt> string that names it. See <xref target="randomness"/>.</t>
        <t>For the <tt>P256-SHA256</tt> ciphersuite, <tt>Ns = 32</tt> bytes is the scalar encoding
length, while <tt>Nseed = 48</tt> bytes is the seed length. The group order <tt>p</tt> is
a 256-bit prime (<tt>2^255 &lt; p &lt; 2^256</tt>). The hash-to-scalar method reduces an
<tt>Ns + 16 = 48</tt>-byte string modulo <tt>p</tt>. If the input string is uniform, the
resulting scalar, conditioned on being nonzero, has statistical distance at
most <tt>2^-128</tt> from uniform over the nonzero scalars. The 16-byte margin
follows the hash-to-field method for a 128-bit security target
(<xref section="5" sectionFormat="of" target="HASH2CURVE"/>).</t>
        <t>This is a sampling bound for a uniform byte string. It does not establish
that the deterministic hash-derived scalars or nonces are uniform.
<xref target="ec-act-security"/> describes their analysis and the remaining proof gaps.</t>
      </section>
      <section anchor="keygen">
        <name>Key Generation</name>
        <t>Use <tt>G.DeriveKeyPair(seed, info)</tt> and <tt>G.GenerateKeyPair()</tt> from Section
4.4 of <xref target="EC-IHAT"/>, with the EC-ACT group instance of <xref target="ec-act-config"/>. Both
return <tt>tuple[Scalar, Element]</tt>; EC-ACT names the returned keys <tt>(skM,
pkM)</tt> because the Moderator is the issuer. The Moderator publishes
<tt>G.SerializeElement(pkM)</tt> in its configuration.</t>
      </section>
    </section>
    <section anchor="credential-scheme">
      <name>The Credential Scheme</name>
      <t>An Anonymous Credit Token is a
keyed-verification anonymous credential <xref target="KVAC"/> over a privately
verifiable, pairing-free BBS-style signature <xref target="BBS"/> <xref target="TZ23"/>, whose
hidden state is a <em>balance</em> <tt>c</tt>: a nonnegative integer number of credits.
A Moderator issues a Credential with an initial balance of its choosing,
and the Client later <em>spends</em> from it. A spend reveals a public amount <tt>s</tt>
and proves, in zero knowledge, that the Credential holds at least <tt>s</tt>
credits. It also reveals a nullifier, which the Moderator checks against
its record of accepted spends to enforce single use.</t>
      <t>In the same exchange the Moderator issues a <em>refund</em>: a message containing
a signature, a public return amount <tt>t</tt>, and a proof of correct signing.
The Client combines this message with its saved spend state to finalize a
fresh Credential with balance <tt>c - s + t</tt>. Every spend declares a public
<em>top-up allowance</em> <tt>a</tt>, the maximum permitted increase in the balance.
When no top-up is allowed, the spend sets <tt>a = 0</tt>.
The Moderator chooses <tt>t</tt> with <tt>0 &lt;= t &lt;= s + a</tt>, so the balance increases
exactly when <tt>t &gt; s</tt>, by at most <tt>a</tt>. With <tt>a = 0</tt>, the return amount is
at most <tt>s</tt>.</t>
      <t>A presentation hides its Credential's balance beyond the public amounts
and the predicates they establish. It is intended to be unlinkable to the
issuance or refund that produced that Credential and to other
presentations, subject to the assumptions and anonymity-set requirements
of <xref target="ec-act-security"/>.</t>
      <t>The scheme is a two-party protocol between a Client and a Moderator. The
Moderator holds a key pair <tt>(skM, pkM)</tt> and both issues and verifies
Credentials: they are not publicly verifiable, and only the Moderator can
check a spend. Each of the two flows, issuance and spending, is a single
request/response exchange followed by a Client-local finalization.</t>
      <t>For spending, both parties know <tt>s</tt>, the spend amount, <tt>a</tt>,
the top-up allowance, and a <em>spend context</em>
        <tt>ctx_spend</tt> that binds the proof to the Moderator's challenge
(<xref target="ec-act-spending"/>), typically a collision-resistant digest of the encoded
challenge.</t>
      <figure anchor="fig-ec-act">
        <name>Credential issuance and spending overview</name>
        <artwork><![CDATA[
   Client(pkM, ctx_cred)                     Moderator(skM, ctx_cred)
 ------------------------------------------------------------------
   state, request = IssueRequest()

                              request
                              -------->

                 response = IssueResponse(skM, ctx_cred, c, request)

                              response
                              <--------

   credential = FinalizeIssue(pkM, ctx_cred, state, response)

             Spending inputs at both parties: s, a, ctx_spend

   state, proof = ProveSpend(credential, ctx_cred, s, a, ctx_spend)

                         proof (includes nullifier k)
                              -------->

                   VerifySpend(skM, ctx_cred, ctx_spend, proof)
                   refund = IssueRefund(skM, ctx_cred, proof, t)
                   Record proof.k atomically, failing if present

                               refund
                              <--------

   credential = FinalizeRefund(pkM, ctx_cred, state, refund)
]]></artwork>
      </figure>
      <t>The Moderator chooses the initial balance <tt>c</tt> and the return amount <tt>t</tt>
according to its policy; both are outside the scope of this document, as is
the nullifier store the Moderator keeps to reject a second spend of the same
Credential.</t>
      <section anchor="ec-act-config">
        <name>Configuration</name>
        <t>A ciphersuite (<xref target="ciphersuites"/>) is identified by an ASCII byte string
<tt>identifier</tt>, and both parties <bcp14>MUST</bcp14> agree on it before
running the protocol. The Credential scheme is specified for the P-256
ciphersuite of <xref target="ciphersuites"/>; its protocol context is</t>
        <sourcecode type="python"><![CDATA[
def CreateCredentialProtocolContext(identifier: bytes) -> bytes:
    return b"EC-ACTv1-" + identifier
]]></sourcecode>
        <t>Throughout this section and wherever the algorithms of this section are
invoked, <tt>ctx_proto</tt> denotes this value, and <tt>HashToGroup</tt>, <tt>HashToScalar</tt>,
<tt>G.DeriveScalars</tt>, <tt>G.DeriveNonces</tt>, and the key generation of <xref target="keygen"/> are
parameterized by it.</t>
        <t>The scheme has one further parameter, the <em>balance width</em> <tt>L</tt>. Balances and
amounts are integers in <tt>[0, 2^L)</tt>. <tt>L</tt> <bcp14>MUST</bcp14> satisfy <tt>1 &lt;= L &lt;=
MAX_BIT_LENGTH</tt>, where <tt>MAX_BIT_LENGTH</tt> is fixed by the ciphersuite. The size
of a spend proof and the cost of producing and verifying it grow linearly in
<tt>L</tt>, so a deployment <bcp14>SHOULD</bcp14> choose the smallest <tt>L</tt> that accommodates its
largest balance. The Moderator publishes <tt>L</tt> together with its public key;
a Client <bcp14>MUST</bcp14> use the published value.</t>
        <t><tt>L</tt> is fixed for the lifetime of a key and credential context.
<xref target="ec-act-security"/> shows by induction over issuances and refunds that every
balance the Moderator has signed lies below <tt>2^L</tt>, assuming one value of <tt>L</tt>
per key and context. A Moderator that changes <tt>L</tt> <bcp14>MUST</bcp14> also change the
credential context or the key. Deployments are <bcp14>RECOMMENDED</bcp14> to include <tt>L</tt> in
the credential context, for instance by appending <tt>I2OSP(L, 1)</tt> to it, so
that changing <tt>L</tt> changes the context.</t>
        <section anchor="ec-act-generators">
          <name>Generators</name>
          <t>The scheme uses the group generator <tt>B = G.Generator()</tt> and four further
elements <tt>H1</tt>, <tt>H2</tt>, <tt>H3</tt>, <tt>H4</tt>, fixed by the ciphersuite:</t>
          <sourcecode type="python"><![CDATA[
def CreateGenerators() -> tuple[Element, Element, Element, Element]:
    return (
        G.HashToGroup(b"GenH1"),
        G.HashToGroup(b"GenH2"),
        G.HashToGroup(b"GenH3"),
        G.HashToGroup(b"GenH4"),
    )
]]></sourcecode>
          <t><tt>H1</tt> commits to the balance, <tt>H2</tt> to the nullifier, <tt>H3</tt> is the blinding
base, and <tt>H4</tt> binds the credential context (<xref target="ec-act-context"/>). The discrete
logarithm of any of these elements with respect to any other, or to <tt>B</tt>, <bcp14>MUST
NOT</bcp14> be known to any party; deriving them by hashing fixed labels ensures this.
The five elements are pairwise distinct except with negligible probability;
an implementation <bcp14>MAY</bcp14> verify this once when instantiating a ciphersuite.</t>
        </section>
        <section anchor="ec-act-keygen">
          <name>Key Generation</name>
          <t>A Moderator holds a key pair <tt>(skM, pkM)</tt>, generated with <tt>G.GenerateKeyPair</tt>
of <xref target="keygen"/> under the protocol context of this section, or derived from a
seed with <tt>G.DeriveKeyPair</tt>. The Moderator publishes <tt>SerializeElement(pkM)</tt> in
its configuration. The signing key <tt>skM</tt> is also the
verification key: <tt>VerifySpend</tt> requires it.</t>
        </section>
      </section>
      <section anchor="ec-act-context">
        <name>Credential Context</name>
        <t>Every Credential is bound at issuance to a <em>credential context</em> <tt>ctx_cred</tt>,
an opaque byte string of at most <tt>2^16 - 1</tt> bytes chosen by the Moderator and
agreed with the Client out of band. It
restricts <em>when</em>, or under which policy, a Credential may be spent, so that a
Moderator can for instance expire all Credentials of an epoch at once without
rotating its key.</t>
        <t>The context is bound as a signed attribute. It is mapped to a scalar and
carried under <tt>H4</tt>:</t>
        <sourcecode type="python"><![CDATA[
def CreateContextScalar(ctx_cred: bytes) -> Scalar:
    return G.HashToScalar(
        U16Prefixed(ctx_cred) + b"CredentialContext"
    )
]]></sourcecode>
        <t>No message of this document carries the context. Each party supplies it to
every algorithm of this section that computes or checks a signature, so a spend
verifies only under the context the Credential was issued under. A
Client keeps its own copy of the context for as long as it holds the
Credential. A Credential presented under a context other than the one it
was issued under fails verification; the mismatch is not otherwise
signalled.</t>
        <t>The set of Clients sharing a credential context <bcp14>MUST</bcp14> be coarse; see
<xref target="ec-act-security"/>.</t>
      </section>
      <section anchor="ec-act-amounts">
        <name>Amounts</name>
        <t>Balances and amounts are nonnegative integers below <tt>2^L</tt>. On the wire they
are <tt>uint64</tt> values; in the algebra they enter as scalars.
<tt>G.scalar(x)</tt> denotes the <tt>Scalar</tt> whose integer value is <tt>x</tt>.</t>
        <t>The spend range proof shows that a hidden value lies in <tt>[0, m]</tt> for a
public bound <tt>m &lt; 2^L</tt>. It decomposes the value into bits with the weights
returned by <tt>RangeWeights(m)</tt>: the powers of two below the leading power of
<tt>m</tt>, followed by a top weight chosen so that all weights sum to <tt>m</tt>. Every
weight is positive, so a sum of weighted bits lies in <tt>[0, m]</tt>, and every
integer in <tt>[0, m]</tt> is such a sum. <tt>Bits(x, weights)</tt> returns the bits of
<tt>x</tt> for these weights, least significant first, as scalars each equal to
<tt>0</tt> or <tt>1</tt>:</t>
        <sourcecode type="python"><![CDATA[
def RangeWeights(m: int) -> list[int]:
    if not 0 <= m < 2**L:
        raise AmountError
    n = m.bit_length()
    if n == 0:
        return []
    return [2**j for j in range(n - 1)] + [m - 2 ** (n - 1) + 1]


def Bits(x: int, weights: Sequence[int]) -> list[Scalar]:
    n = len(weights)
    if n == 0:
        return []
    top = (x >> (n - 1)) & 1
    rest = x - top * weights[n - 1]
    return [G.scalar((rest >> j) & 1) for j in range(n - 1)] + [
        G.scalar(top)
    ]
]]></sourcecode>
        <t>For <tt>x</tt> in <tt>[0, m]</tt> with <tt>m &gt;= 1</tt>, <tt>x &lt; 2^n</tt> where <tt>n</tt> is the bit length
of <tt>m</tt>, so <tt>top</tt> is set exactly when <tt>x &gt;= 2^(n-1)</tt>, which is at least the
top weight; <tt>rest</tt> then lies in <tt>[0, 2^(n-1))</tt>. When <tt>m</tt> is a power of two
minus one, the weights are the powers of two and <tt>Bits</tt> is the binary
decomposition. When <tt>m = 0</tt>, there are no weights and the value is zero.</t>
        <t>An implementation <bcp14>MUST</bcp14> compute <tt>Bits</tt> in constant time with respect to <tt>x</tt>,
which is derived from the Client's hidden balance. The number of weights
depends only on <tt>m</tt>, which is public.</t>
        <t>A party that receives an amount <bcp14>MUST</bcp14> check that it is below <tt>2^L</tt> before
using it, and <bcp14>MUST</bcp14> raise an <tt>AmountError</tt> otherwise. The spend range proof
bounds a difference of amounts. The bounds on each amount are needed to
interpret this difference over the integers (<xref target="ec-act-security"/>).</t>
        <t>The comparisons <tt>s &lt;= c</tt> and <tt>c + a &lt; 2^L</tt> in <tt>ProveSpend</tt>,
<tt>s + a &lt; 2^L</tt> in <tt>VerifySpend</tt>, <tt>t &lt;= s + a</tt> in <tt>IssueRefund</tt>, and
<tt>t &lt;= s + a</tt> and <tt>v1 + t &lt; 2^L</tt> in <tt>FinalizeRefund</tt> are integer
comparisons. The condition <tt>s + a &lt; 2^L</tt> is equivalent to
<tt>0 &lt;= 2^L - 1 - (s + a)</tt>; in <tt>ProveSpend</tt> it follows from the first two
comparisons rather than a separate check. Each sum can reach
<tt>2^(L+1) - 2</tt>, which does not fit in a <tt>uint64</tt> when <tt>L = 64</tt>, and an
implementation <bcp14>MUST</bcp14> compute them without overflow.</t>
      </section>
      <section anchor="ec-act-proofs">
        <name>Zero-Knowledge Proofs</name>
        <t>Each proof of this document is a compact NARG string
(<xref section="5.5" sectionFormat="of" target="SIGMA"/>) for a linear relation declared where it is
used, in the notation of <xref section="3.4" sectionFormat="of" target="SIGMA"/>. In a <tt>Relation</tt> block,
the reserved name <tt>G</tt> denotes the generator <tt>B</tt> at element index zero.
Compact proofs carry a single challenge scalar in place of all
per-equation commitments, reducing the size of the spend message.</t>
        <t>The ciphersuite is <tt>sigma-proofs_Shake128_P256</tt> of
<xref section="8" sectionFormat="of" target="SIGMA"/>. Its group is the group of <xref target="ciphersuites"/>
with the same element and scalar encodings, so statement elements are
encoded identically in both documents.</t>
        <section anchor="ec-act-tags">
          <name>Tags</name>
          <t>Every proof is bound to a <em>tag</em> (<xref section="5.1" sectionFormat="of" target="SIGMA"/>) built by <tt>Tag</tt>
from a label naming the operation and a possibly empty list of <em>bindings</em>:
public byte strings to which the proof must be bound that do not appear
in the relation.</t>
          <sourcecode type="python"><![CDATA[
def Tag(label: bytes, bindings: Sequence[bytes]) -> bytes:
    tag = ctx_proto + b"-" + label + b"-CMPT-with-" + SIGMA_SUITE
    for binding in bindings:
        tag += U16Prefixed(binding)
    return tag
]]></sourcecode>
          <t><tt>SIGMA_SUITE</tt> is the ciphersuite identifier <tt>"sigma-proofs_Shake128_P256"</tt>.
The labels are a fixed set, and each binding is length-prefixed, so
distinct inputs yield distinct tags (<xref section="5.1" sectionFormat="of" target="FIAT-SHAMIR"/>).
Bindings are arbitrary byte strings, not the US-ASCII text that section
recommends; the length prefixes keep the tag unambiguous.</t>
        </section>
        <section anchor="ec-act-prover-nonces">
          <name>Prover Nonces</name>
          <t><tt>ProveCompact</tt> draws one nonce per witness scalar from its <tt>rng</tt>, in
scalar-index order. The <tt>rng</tt> <bcp14>MUST</bcp14> return, on its <tt>i</tt>-th call, the value
that <tt>ProverNonces.random_scalar</tt> computes below. The nonces are derived
together with <tt>G.DeriveNonces</tt> (Section 4.3 of <xref target="EC-IHAT"/>) from the
witness, the session, the relation, and fresh randomness; see "Derived prover
nonces" in <xref target="ec-act-security"/>.</t>
          <sourcecode type="python"><![CDATA[
class ProverNonces:
    def __init__(
        self,
        witness: Sequence[Scalar],
        session_id: bytes,
        instance: bytes,
    ) -> None:
        self.nonces = G.DeriveNonces(
            b"".join(G.SerializeScalar(w) for w in witness),
            b"nonce",
            session_id + I2OSP(len(instance), 4) + instance,
            random(Nseed),
            len(witness),
        )
        self.count = 0

    def random_scalar(self) -> int:
        i = self.count
        self.count = i + 1
        return int(self.nonces[i])
]]></sourcecode>
          <t><tt>witness</tt> is the prover's whole witness in scalar-index order;
<tt>session_id</tt> is the 32-byte <tt>DeriveSessionID(tag)</tt> of
<xref section="5.1" sectionFormat="of" target="FIAT-SHAMIR"/>; and <tt>instance</tt> is the
<tt>SerializeLinearRelation</tt> of the relation (<xref section="3.6" sectionFormat="of" target="SIGMA"/>).</t>
          <t>This rule binds only the prover; a verifier following <xref target="SIGMA"/> accepts
these proofs unchanged. The derivation is deterministic in the witness,
the tag, the relation, and <tt>rand</tt>: replaying the bytes of <tt>random</tt>
reproduces a proof byte for byte, which the test vectors of
<xref target="ec-act-test-vectors"/> rely on, and a random source that repeats all of <tt>rand</tt>
reproduces the same proof.
A retried operation draws fresh <tt>rand</tt> and produces a different proof.</t>
        </section>
        <section anchor="ec-act-prove">
          <name>Proving and Verifying</name>
          <t>A relation is proven and verified as follows, where <tt>relation</tt> is the
declared relation compiled as in <xref section="3.4" sectionFormat="of" target="SIGMA"/>, and
<tt>DeriveSessionID</tt>, <tt>SerializeLinearRelation</tt>, <tt>ProveCompact</tt>, and
<tt>VerifyCompact</tt> are those of <xref target="FIAT-SHAMIR"/> and <xref target="SIGMA"/>.</t>
          <sourcecode type="python"><![CDATA[
def Prove(
    tag: bytes, relation: LinearRelation, witness: Sequence[Scalar]
) -> bytes:
    nonces = ProverNonces(
        witness,
        DeriveSessionID(tag),
        SerializeLinearRelation(relation),
    )
    return ProveCompact(tag, relation, witness, nonces)


def Verify(
    tag: bytes, relation: LinearRelation, proof: bytes
) -> bool:
    return VerifyCompact(tag, relation, proof)
]]></sourcecode>
        </section>
      </section>
      <section anchor="ec-act-issuance">
        <name>Issuance</name>
        <t>Issuance produces a signature on the attributes <tt>(c, k, r, ctx)</tt>, whose
group-element encoding is <tt>B + c * H1 + k * H2 + r * H3 + ctx * H4</tt>.
Here <tt>c</tt> is the balance chosen by the Moderator, <tt>ctx</tt> is the context
scalar, and <tt>k</tt> and <tt>r</tt> are chosen by the Client and hidden from the
Moderator:</t>
        <artwork><![CDATA[
  IssueRequest -> IssueResponse -> FinalizeIssue
]]></artwork>
        <t><tt>IssueRequest</tt> and <tt>FinalizeIssue</tt> are run by the Client, and
<tt>IssueResponse</tt> by the Moderator. The Python records are:</t>
        <sourcecode type="python"><![CDATA[
class ClientIssuanceState(NamedTuple):
    k: Scalar
    r: Scalar
    K: Element


class IssueRequestMessage(NamedTuple):
    K: Element
    pok: bytes


class IssueResponseMessage(NamedTuple):
    A: Element
    e: Scalar
    c: int
    pok: bytes


class Credential(NamedTuple):
    k: Scalar
    c: int
    r: Scalar
    A: Element
    e: Scalar
]]></sourcecode>
        <section anchor="ec-act-signing-exponent">
          <name>Signing Exponent</name>
          <t><tt>IssueResponse</tt> here and <tt>IssueRefund</tt> (<xref target="ec-act-refund"/>) choose the
exponent <tt>e</tt> of the signature <tt>(A, e)</tt>. It is derived with <tt>G.DeriveNonces</tt>
(Section 4.3 of <xref target="EC-IHAT"/>) from the signing key, the group-element
encoding of the signed attributes, and fresh randomness. Repeating these
inputs reproduces the same signature. Changing the signed encoding changes
the derivation input even when the random source repeats
(<xref target="ec-act-security"/>).</t>
          <sourcecode type="python"><![CDATA[
def SigningExponent(
    skM: Scalar, label: bytes, X_A: Element
) -> Scalar:
    instance = U16Prefixed(label) + U16Prefixed(
        G.SerializeElement(X_A)
    )
    (e,) = G.DeriveNonces(
        G.SerializeScalar(skM), b"e", instance, random(Nseed), 1
    )
    if (e + skM).isZero():
        raise DeriveError
    return e
]]></sourcecode>
          <t><tt>label</tt> is <tt>IssueResponse</tt> or <tt>Refund</tt>, the tag label of the
accompanying proof, and <tt>X_A</tt> is the group-element encoding being signed.
The abort when <tt>e + skM</tt> is zero has probability about <tt>1/p</tt>; a caller that
retries draws fresh randomness.</t>
        </section>
        <section anchor="ec-act-issue-request">
          <name>Issuance Request</name>
          <t>The Client commits to a fresh nullifier <tt>k</tt> and blinding factor <tt>r</tt>, and
proves that it knows the opening:</t>
          <artwork><![CDATA[
Relation Commitment(H2, H3, K):
  Witness: k, r
  Equations:
    K = k * H2 + r * H3
]]></artwork>
          <sourcecode type="python"><![CDATA[
def IssueRequest() -> (
    tuple[ClientIssuanceState, IssueRequestMessage]
):
    rand = random(Nseed)
    (k, r) = G.DeriveScalars(rand, b"IssueRequest", 2)

    K = k * H2 + r * H3

    tag = Tag(b"IssueRequest", [])
    pok = Prove(tag, CommitmentRelation(K), [k, r])

    return ClientIssuanceState(k, r, K), IssueRequestMessage(K, pok)
]]></sourcecode>
          <t>The nullifier <tt>k</tt> is revealed when the Credential is spent, and the
Moderator uses it to reject a second spend. A Client <bcp14>MUST NOT</bcp14> reuse it
across Credentials, and <bcp14>MUST NOT</bcp14> finalize one <tt>state</tt> against two
responses: the two Credentials would share <tt>k</tt>, and at most one of them
can be spent (<xref target="ec-act-security"/>).</t>
        </section>
        <section anchor="ec-act-issue-response">
          <name>Issuance Response</name>
          <t>The Moderator checks the request, chooses the balance <tt>c</tt>, and signs the
encoding <tt>X_A = B + c * H1 + ctx * H4 + K</tt> as <tt>A = X_A / (e + skM)</tt>. It
proves that <tt>A</tt> is such a signature under <tt>pkM</tt> without revealing <tt>skM</tt>,
with the witness <tt>x = e + skM</tt> and <tt>X_G = x * B</tt>, which the Client
computes as <tt>e * B + pkM</tt>:</t>
          <artwork><![CDATA[
Relation Signature(A, X_A, X_G):
  Witness: x
  Equations:
    X_A = x * A
    X_G = x * G
]]></artwork>
          <sourcecode type="python"><![CDATA[
def IssueResponse(
    skM: Scalar,
    ctx_cred: bytes,
    c: int,
    request: IssueRequestMessage,
) -> IssueResponseMessage:
    K, pok = request

    if not 0 <= c < 2**L:
        raise AmountError

    tag = Tag(b"IssueRequest", [])
    if not Verify(tag, CommitmentRelation(K), pok):
        raise VerifyError

    ctx = CreateContextScalar(ctx_cred)
    X_A = B + G.scalar(c) * H1 + ctx * H4 + K

    e = SigningExponent(skM, b"IssueResponse", X_A)
    x = e + skM
    A = G.ScalarInverse(x) * X_A
    X_G = G.ScalarMultGen(x)

    tag = Tag(b"IssueResponse", [])
    pok = Prove(tag, SignatureRelation(A, X_A, X_G), [x])

    return IssueResponseMessage(A, e, c, pok)
]]></sourcecode>
          <t>The check <tt>c &lt; 2^L</tt> bounds every issued balance; the soundness of
spending relies on it (<xref target="ec-act-security"/>).</t>
        </section>
        <section anchor="ec-act-finalize-issuance">
          <name>Issuance Finalization</name>
          <t>The Client checks the response and assembles the Credential.</t>
          <sourcecode type="python"><![CDATA[
def FinalizeIssue(
    pkM: Element,
    ctx_cred: bytes,
    state: ClientIssuanceState,
    response: IssueResponseMessage,
) -> Credential:
    k, r, K = state
    A, e, c, pok = response

    if not 0 <= c < 2**L:
        raise AmountError

    ctx = CreateContextScalar(ctx_cred)
    X_A = B + G.scalar(c) * H1 + ctx * H4 + K
    X_G = G.ScalarMultGen(e) + pkM

    tag = Tag(b"IssueResponse", [])
    if not Verify(tag, SignatureRelation(A, X_A, X_G), pok):
        raise VerifyError

    return Credential(k, c, r, A, e)
]]></sourcecode>
          <t>A Credential is the tuple <tt>(k, c, r, A, e)</tt>; its encoding, for storage, is
given in <xref target="ec-act-wire"/>. It is never sent. The Client also retains
<tt>ctx_cred</tt>, which is not part of the Credential but is needed to spend it.</t>
        </section>
      </section>
      <section anchor="ec-act-spending">
        <name>Spending</name>
        <t>Spending consumes a Credential with balance <tt>c</tt> and produces one with
balance <tt>c - s + t</tt>. The amount <tt>s</tt> and the top-up allowance <tt>a</tt> are
chosen by the Client to match the Moderator's challenge;
the return amount <tt>t</tt>, with <tt>0 &lt;= t &lt;= s + a</tt>, is chosen by the
Moderator. With <tt>s = a = 0</tt> a spend changes nothing but the nullifier and
refreshes the Credential. Spending consists of four algorithms:</t>
        <artwork><![CDATA[
  ProveSpend -> VerifySpend -> IssueRefund -> FinalizeRefund
]]></artwork>
        <t><tt>ProveSpend</tt> and <tt>FinalizeRefund</tt> are run by the Client; <tt>VerifySpend</tt>
and <tt>IssueRefund</tt> by the Moderator, in that order and only if <tt>VerifySpend</tt>
succeeds.</t>
        <t>A spend is bound to a <em>spend context</em> <tt>ctx_spend</tt>, an opaque byte string
of at most <tt>2^16 - 1</tt> bytes supplied by the verifier and known to the
Client. The spend proof uses <tt>Tag(b"Spend", [ctx_spend])</tt>, with
<tt>ctx_spend</tt> as its sole binding (<xref target="ec-act-tags"/>). <tt>ctx_spend</tt> is
typically a collision-resistant digest, such as SHA-256, of the challenge
that triggered the presentation, so that a spend proof produced for one
challenge does not verify under another. The top-up allowance is bound by the relation: a proof
produced for one value of <tt>a</tt> does not verify under another, so a
Moderator authorizes a top-up by verifying the proof with the value it
accepts, and a Moderator that offers none <bcp14>MUST</bcp14> reject a spend with
<tt>a != 0</tt>.</t>
        <t>The Python records for spending are:</t>
        <sourcecode type="python"><![CDATA[
class ClientSpendState(NamedTuple):
    kstar: Scalar
    r_star: Scalar
    v1: int
    s: int
    a: int
    K_prime: Element


class SpendMessage(NamedTuple):
    k: Scalar
    s: int
    a: int
    A_prime: Element
    B_bar: Element
    K_n: Element
    Com1: Sequence[Element]
    Com_c: Element | None
    pok: bytes


class RefundMessage(NamedTuple):
    A: Element
    e: Scalar
    t: int
    pok: bytes
]]></sourcecode>
        <t>An absent <tt>Com_c</tt> is <tt>None</tt>.</t>
        <section anchor="ec-act-spend-relation">
          <name>The Spend Relation</name>
          <t>A spend shows that the <em>remainder</em> <tt>v1 = c - s</tt> of the hidden balance <tt>c</tt>
satisfies</t>
          <artwork><![CDATA[
  0 <= v1 <= m,  where  m = 2^L - 1 - (s + a)
]]></artwork>
          <t>The lower bound shows that the Credential covers the spend, and the upper
bound that the <em>topped-up balance</em> <tt>c + a = s + v1 + a</tt> is below <tt>2^L</tt>, so
the Moderator may choose a return amount <tt>t &lt;= s + a</tt> without the
resulting balance exceeding <tt>2^L - 1</tt>. A single range proof over the bits
of <tt>v1</tt>, weighted by <tt>w = RangeWeights(m)</tt> (<xref target="ec-act-amounts"/>), shows both. A spend with
<tt>s + a &gt;= 2^L</tt> cannot satisfy them and is rejected with an <tt>AmountError</tt>.
The number <tt>n = len(w)</tt> of bit commitments is the bit length of <tt>m</tt> and is
fixed by the public amounts.</t>
          <t>A <em>refresh</em>, with <tt>s = a = 0</tt>, needs no range proof: the remainder is the
balance <tt>c</tt>, whose range follows from issuance and prior refunds
(<xref target="ec-act-security"/>). It commits to <tt>c</tt> in a single commitment <tt>Com_c</tt>
instead. The relation therefore has two shapes, selected by whether
<tt>s + a</tt> is zero; a group marked with a condition below is present exactly
when it holds.</t>
          <artwork><![CDATA[
Relation Spend(A_prime, B_bar, A_bar, H1_prime, K_n,
               s, a,
               w[0], ..., w[n-1],                 (s + a > 0)
               Com1[0], ..., Com1[n-1],           (s + a > 0)
               Com_c):                            (s + a = 0)
  Witness: e, r2, r3, c, r, kstar, rn,
           b1[0], ..., b1[n-1],
           s1[0], ..., s1[n-1],
           u1[0], ..., u1[n-1],                   (s + a > 0)
           rc                                     (s + a = 0)
  Equations:
    A_bar = -e * A_prime + r2 * B_bar
    H1_prime = r3 * B_bar - c * H1 - r * H3
    K_n = kstar * H2 + rn * H3
    for j in 0, ..., n-1:                         (s + a > 0)
      Com1[j] = b1[j] * H1 + s1[j] * H3
      Com1[j] = b1[j] * Com1[j] + u1[j] * H3
    K_n + s * H1 + sum_j w[j] * Com1[j]
      = c * H1 + kstar * H2 + rn * H3
        + sum_j w[j] * s1[j] * H3                 (s + a > 0)
    Com_c = c * H1 + rc * H3                      (s + a = 0)
]]></artwork>
          <t>The first equation states that <tt>A_prime</tt> is a rerandomization of a
signature under <tt>skM</tt>, since the verifier computes <tt>A_bar = skM * A_prime</tt>.
The second opens the signed encoding to the hidden balance <tt>c</tt> and blinding
factor <tt>r</tt>, relative to the public <tt>H1_prime</tt>, which fixes the nullifier
<tt>k</tt> and the context. The third opens <tt>K_n</tt> to the next nullifier and so
shows that <tt>K_n</tt> has no <tt>H1</tt> component, which would otherwise raise the
balance the refund signs.</t>
          <t>Each pair of bit equations is the <tt>Bit</tt> relation of
<xref section="3.4" sectionFormat="of" target="SIGMA"/>, with <tt>u1[j] = (1 - b1[j]) * s1[j]</tt> for an honest
prover. The sum equation ties the committed bits to the balance: given
the third equation, its left-hand side opens under <tt>H1</tt> to <tt>s + v1</tt> with
<tt>v1 = sum_j w[j] * b1[j]</tt>, so <tt>c = s + v1</tt> with <tt>0 &lt;= v1 &lt;= m</tt>. Its
left-hand side is <tt>s * H1 + K_prime</tt>, with <tt>K_prime</tt> the commitment the
refund signs (<xref target="ec-act-refund"/>); including <tt>K_n</tt> keeps it from being the
identity element when <tt>s = 0</tt> and <tt>m = 0</tt>, which <xref target="SIGMA"/> would reject.
The weights are public scalars of the relation, computed by both parties
from <tt>s</tt> and <tt>a</tt>. In a refresh, <tt>Com_c</tt> opens to <tt>c</tt> directly. The
witness scalars are supplied in the order listed.</t>
        </section>
        <section anchor="ec-act-prove-spend">
          <name>Spend Proof Generation</name>
          <t>The Client rerandomizes its signature, commits to the next nullifier and
to the remainder, and proves the spend relation.</t>
          <sourcecode type="python"><![CDATA[
def ProveSpend(
    credential: Credential,
    ctx_cred: bytes,
    s: int,
    a: int,
    ctx_spend: bytes,
) -> tuple[ClientSpendState, SpendMessage]:
    k, c, r, A, e = credential

    if not (0 <= s < 2**L and 0 <= a < 2**L):
        raise AmountError
    if s > c or c + a >= 2**L:
        raise AmountError
    v1 = c - s
    w = RangeWeights(2**L - 1 - (s + a)) if s + a > 0 else []
    n = len(w)

    ctx = CreateContextScalar(ctx_cred)

    # Four fixed scalars, then one for each bit of the remainder or
    # one for the commitment of a refresh.
    count = 4 + (n if s + a > 0 else 1)
    derived = G.DeriveScalars(random(Nseed), b"ProveSpend", count)
    (r1, r2, kstar, rn) = derived[:4]

    # Rerandomize the signature.
    B_msg = B + G.scalar(c) * H1 + k * H2 + r * H3 + ctx * H4
    A_prime = (r1 * r2) * A
    B_bar = r1 * B_msg
    r3 = G.ScalarInverse(r1)
    A_bar = r2 * B_bar - e * A_prime

    # Commit to the next Credential's nullifier.
    K_n = kstar * H2 + rn * H3

    Com1: list[Element] = []
    Com_c: Element | None = None
    witness = [e, r2, r3, G.scalar(c), r, kstar, rn]

    # Commit to the remainder: bitwise when it must be shown to be in
    # range, in one commitment when it is the balance of a refresh.
    if s + a > 0:
        b1 = Bits(v1, w)
        s1 = derived[4:]
        Com1 = [b1[j] * H1 + s1[j] * H3 for j in range(n)]
        u1 = [(G.scalar(1) - b1[j]) * s1[j] for j in range(n)]
        r_star = rn
        for j in range(n):
            r_star = r_star + G.scalar(w[j]) * s1[j]
        witness += b1 + s1 + u1
    else:
        rc = derived[4]
        Com_c = G.scalar(c) * H1 + rc * H3
        r_star = rn + rc
        witness += [rc]

    H1_prime = B + k * H2 + ctx * H4
    relation = SpendRelation(
        A_prime, B_bar, A_bar, H1_prime, K_n, s, a, Com1, Com_c
    )
    pok = Prove(Tag(b"Spend", [ctx_spend]), relation, witness)

    # The commitment the refund will sign, opened by the new
    # Credential's secrets; the Moderator recomputes it from `proof`.
    K_prime = G.scalar(v1) * H1 + kstar * H2 + r_star * H3

    state = ClientSpendState(kstar, r_star, v1, s, a, K_prime)
    proof = SpendMessage(
        k, s, a, A_prime, B_bar, K_n, Com1, Com_c, pok
    )

    return state, proof
]]></sourcecode>
          <t><tt>A_bar</tt> is not sent: the Moderator computes it as <tt>skM * A_prime</tt>. The
values <tt>kstar</tt> and <tt>r_star</tt> are the nullifier and blinding factor of the
Credential the refund will produce. They open <tt>K_prime</tt>, which equals
<tt>K_n + V1</tt> with <tt>V1</tt> the balance commitment of <tt>BalanceCommitment</tt>
below; the Moderator recomputes it from <tt>proof</tt> and signs it in
<tt>IssueRefund</tt>, and the Client keeps it in <tt>state</tt> to check the refund.</t>
          <t><tt>ProveSpend</tt> consumes the Credential: an implementation <bcp14>MUST NOT</bcp14> allow a
second call on the same Credential value. The Client <bcp14>MUST</bcp14> treat the
Credential as spent, and <bcp14>MUST</bcp14> have stored <tt>state</tt> durably, no later than
the moment <tt>proof</tt> becomes observable outside the Client; the refund is
unusable without the state, and a second proof from the same Credential
reveals the same nullifier (<xref target="ec-act-security"/>). <tt>state</tt> holds everything
<tt>FinalizeRefund</tt> needs. The Client additionally retains <tt>proof</tt> for refund
recovery.</t>
        </section>
        <section anchor="ec-act-verify-spend">
          <name>Spend Verification</name>
          <t>The Moderator checks the spend proof under its own key and contexts.</t>
          <sourcecode type="python"><![CDATA[
def VerifySpend(
    skM: Scalar,
    ctx_cred: bytes,
    ctx_spend: bytes,
    proof: SpendMessage,
) -> None:
    k, s, a, A_prime, B_bar, K_n, Com1, Com_c, pok = proof

    if not (0 <= s < 2**L and 0 <= a < 2**L):
        raise AmountError
    if s + a >= 2**L:
        raise AmountError

    ctx = CreateContextScalar(ctx_cred)
    A_bar = skM * A_prime
    H1_prime = B + k * H2 + ctx * H4

    relation = SpendRelation(
        A_prime, B_bar, A_bar, H1_prime, K_n, s, a, Com1, Com_c
    )
    if not Verify(Tag(b"Spend", [ctx_spend]), relation, pok):
        raise VerifyError
]]></sourcecode>
          <t>The shape of <tt>proof</tt> is fixed by <tt>s</tt> and <tt>a</tt> (<xref target="ec-act-wire"/>): <tt>Com_c</tt> is
present exactly when <tt>s + a = 0</tt>, and otherwise <tt>Com1</tt> holds one
commitment per weight of <tt>RangeWeights(2^L - 1 - (s + a))</tt>; a message of
any other shape is rejected at deserialization, and <tt>SpendRelation</tt> raises
a <tt>VerifyError</tt> on one. The amount checks of <xref target="ec-act-amounts"/> precede
verification (<xref target="ec-act-security"/>).</t>
          <t><tt>VerifySpend</tt> does not check whether <tt>k</tt> has been seen before, nor whether
the Moderator is willing to grant the top-up <tt>a</tt>. The Moderator <bcp14>MUST</bcp14> do
both. It <bcp14>MUST</bcp14> record <tt>k</tt> atomically, failing if <tt>k</tt> is already recorded,
and <bcp14>MUST NOT</bcp14> accept the spend or release a refund unless <tt>k</tt> was recorded.</t>
        </section>
        <section anchor="ec-act-refund">
          <name>Refund Issuance</name>
          <t>After a successful <tt>VerifySpend</tt>, the Moderator signs the remainder plus
its chosen return amount, proving the <tt>Signature</tt> relation under the
<tt>Refund</tt> tag.</t>
          <sourcecode type="python"><![CDATA[
def BalanceCommitment(proof: SpendMessage) -> Element:
    k, s, a, A_prime, B_bar, K_n, Com1, Com_c, pok = proof

    if s + a > 0:
        w = RangeWeights(2**L - 1 - (s + a))
        if len(Com1) != len(w):
            raise VerifyError
        V1 = G.Identity()
        for j in range(len(w)):
            V1 = V1 + G.scalar(w[j]) * Com1[j]
    else:
        if Com_c is None:
            raise VerifyError
        V1 = Com_c

    return K_n + V1


def IssueRefund(
    skM: Scalar, ctx_cred: bytes, proof: SpendMessage, t: int
) -> RefundMessage:
    k, s, a, A_prime, B_bar, K_n, Com1, Com_c, pok = proof

    if not 0 <= t < 2**L or t > s + a:
        raise AmountError

    ctx = CreateContextScalar(ctx_cred)
    K_prime = BalanceCommitment(proof)
    X_A = B + K_prime + G.scalar(t) * H1 + ctx * H4

    e = SigningExponent(skM, b"Refund", X_A)
    x = e + skM
    A = G.ScalarInverse(x) * X_A
    X_G = G.ScalarMultGen(x)

    tag = Tag(b"Refund", [])
    pok = Prove(tag, SignatureRelation(A, X_A, X_G), [x])

    return RefundMessage(A, e, t, pok)
]]></sourcecode>
          <t>The comparison <tt>t &lt;= s + a</tt> is between integers (<xref target="ec-act-amounts"/>). This
bound keeps the new balance below <tt>2^L</tt> without a range proof over the
refund (<xref target="ec-act-security"/>). The Moderator places the new balance anywhere in
<tt>[c - s, c + a]</tt> without learning where in that interval it falls.</t>
        </section>
        <section anchor="ec-act-finalize-refund">
          <name>Refund Finalization</name>
          <t>The Client checks the refund and assembles its new Credential.</t>
          <sourcecode type="python"><![CDATA[
def FinalizeRefund(
    pkM: Element,
    ctx_cred: bytes,
    state: ClientSpendState,
    refund: RefundMessage,
) -> Credential:
    kstar, r_star, v1, s, a, K_prime = state
    A, e, t, pok = refund

    if not 0 <= t < 2**L or t > s + a or v1 + t >= 2**L:
        raise AmountError

    ctx = CreateContextScalar(ctx_cred)
    X_A = B + K_prime + G.scalar(t) * H1 + ctx * H4
    X_G = G.ScalarMultGen(e) + pkM

    tag = Tag(b"Refund", [])
    if not Verify(tag, SignatureRelation(A, X_A, X_G), pok):
        raise VerifyError

    return Credential(kstar, v1 + t, r_star, A, e)
]]></sourcecode>
          <t>A refund issued for a different spend signs a different <tt>K_prime</tt> and
fails verification. <tt>FinalizeRefund</tt> consumes <tt>state</tt>: a Client <bcp14>MUST NOT</bcp14>
finalize one spend state against two refunds, since the two Credentials
would share the nullifier <tt>kstar</tt>. The Client <bcp14>MUST NOT</bcp14> spend the consumed
Credential again, whether or not the refund arrives. A Client that has
sent a spend proof and not received a valid refund keeps <tt>state</tt> and <bcp14>MAY</bcp14>
ask the Moderator for the refund again, and
the Moderator recognizes the request by the recorded nullifier <tt>k</tt>. The
Moderator can answer with the refund it issued, which requires storing
it with the nullifier, or run <tt>IssueRefund</tt> again. The latter produces a
second signature under a different exponent; this is harmless, because
every refund of one spend carries the nullifier <tt>kstar</tt>, so at most one
of them can ever be spent (<xref target="ec-act-security"/>).</t>
        </section>
      </section>
      <section anchor="ec-act-wire">
        <name>Encodings</name>
        <t>This section gives the encoding of the four messages exchanged and of the
Credential the Client stores. <tt>Element</tt> and <tt>Scalar</tt> are the fixed-length
encodings of <tt>SerializeElement</tt> and <tt>SerializeScalar</tt>, of <tt>Ne</tt> and <tt>Ns</tt>
bytes. A recipient <bcp14>MUST</bcp14> deserialize every received <tt>Element</tt> and <tt>Scalar</tt>
and <bcp14>MUST</bcp14> raise a <tt>DeserializeError</tt> if deserialization fails, which in
particular rejects the identity element. Amounts are <tt>uint64</tt> values,
checked against <tt>2^L</tt> as <xref target="ec-act-amounts"/> requires.</t>
        <t>Every <tt>pok</tt> field is a compact NARG string (<xref target="ec-act-proofs"/>) of
<tt>(Nw + 1) * Ns</tt> bytes, where <tt>Nw</tt> is the number of witness scalars of its
relation: <tt>2</tt> for the request, <tt>1</tt> for the response and the refund, and
for the spend</t>
        <artwork><![CDATA[
  Nw = 7 + (3 * n if s + a > 0 else 1),
  where  n = len(RangeWeights(2^L - 1 - (s + a)))
]]></artwork>
        <t>A recipient <bcp14>MUST</bcp14> reject a message whose <tt>pok</tt> has any other length, and
<bcp14>MUST</bcp14> reject a <tt>SpendMessage</tt> whose shape does not match its <tt>s</tt> and <tt>a</tt>.
A recipient of a <tt>SpendMessage</tt> <bcp14>MUST</bcp14> raise an <tt>AmountError</tt> if
<tt>s + a &gt;= 2^L</tt>, before computing <tt>n</tt>.
Rejecting the identity element at deserialization keeps every relation of
this document valid (<xref section="3.5" sectionFormat="of" target="SIGMA"/>).</t>
        <t>The Client opens issuance with its commitment:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Element K;
  opaque pok[3 * Ns];
} IssueRequestMessage;
]]></sourcecode>
        <t>The Moderator answers with the signature and the balance it chose:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Element A;
  Scalar e;
  uint64 c;
  opaque pok[2 * Ns];
} IssueResponseMessage;
]]></sourcecode>
        <t>The Client spends with a proof whose shape follows its two amounts, as
above. The <tt>select</tt> clause distinguishes a refresh from other spends:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Scalar k;
  uint64 s;
  uint64 a;
  Element A_prime;
  Element B_bar;
  Element K_n;
  select (s + a) {
    case 0:  Element Com_c;
    default: Element Com1[n * Ne];
  };
  opaque pok[(Nw + 1) * Ns];
} SpendMessage;
]]></sourcecode>
        <t>The Moderator answers a valid spend with the refund:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Element A;
  Scalar e;
  uint64 t;
  opaque pok[2 * Ns];
} RefundMessage;
]]></sourcecode>
        <t>Neither context appears in these messages; both are inputs held by each party
(<xref target="ec-act-context"/>, <xref target="ec-act-spending"/>). The Credential is held by the Client
and never sent:</t>
        <sourcecode type="tls-presentation"><![CDATA[
struct {
  Scalar k;
  uint64 c;
  Scalar r;
  Element A;
  Scalar e;
} Credential;
]]></sourcecode>
        <t>With <tt>Ne = 33</tt> and <tt>Ns = 32</tt>, the request is <tt>129</tt> bytes and the response
and refund are <tt>137</tt> bytes each. The spend message is <tt>468</tt> bytes for a
refresh (<tt>s = a = 0</tt>) and otherwise <tt>129 * n + 403</tt> bytes, at most
<tt>129 * L + 403</tt>, with <tt>n = L</tt> whenever <tt>s + a &lt; 2^(L-1)</tt>. The spend message
dominates and is linear in <tt>L</tt>; <xref target="ec-act-config"/> asks deployments to keep <tt>L</tt>
small for this reason.</t>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>A ciphersuite fixes the group, hash functions, encodings, and domain separation
tags. Both parties <bcp14>MUST</bcp14> agree on the ciphersuite as specified in <xref target="ec-act-config"/>.</t>
      <t><tt>ctx_proto</tt> is as computed in <xref target="ec-act-config"/>. The seed length, that of the
random input to every derivation, is <tt>Nseed = 48</tt> bytes.</t>
      <t>EC-ACTv1 is specified against the <tt>-03</tt> revisions of <xref target="SIGMA"/> and
<xref target="FIAT-SHAMIR"/>. A later revision that changes the NARG string or its
derivation <bcp14>MUST</bcp14> be adopted under a new ciphersuite identifier, and so a new
<tt>ctx_proto</tt>; <tt>EC-ACTv1-P256-SHA256</tt> then never denotes two transcript
formats.</t>
      <section anchor="ec-actp-256-sha-256">
        <name>EC-ACT(P-256, SHA-256)</name>
        <t>This ciphersuite uses P-256 (secp256r1) for the group and
SHA-256 for the hash function. The value of the ciphersuite
identifier is <tt>b"P256-SHA256"</tt>.</t>
        <t>Use the P-256 group, SHA-256 hash, hash-to-curve and hash-to-scalar
algorithms, and canonical encodings of Section 7.1 of <xref target="EC-IHAT"/>. EC-ACT
uses <tt>Ne = 33</tt>, <tt>Ns = 32</tt>, and <tt>Nseed = 48</tt>. Instantiate every hash with the
EC-ACT <tt>ctx_proto</tt> of <xref target="ec-act-config"/>, including the explicit DSTs of
<tt>G.DeriveScalars</tt>, <tt>G.ExpandScalars</tt>, <tt>G.DeriveNonces</tt>, and
<tt>G.DeriveKeyPair</tt>.</t>
        <t>For this ciphersuite <tt>MAX_BIT_LENGTH = 64</tt>,
which allows amounts to be carried as <tt>uint64</tt> values and keeps <tt>2^(L+1)</tt>
far below the group order (<xref target="ec-act-security"/>).</t>
      </section>
      <section anchor="randomness">
        <name>Randomness</name>
        <t>Every random value in this document is drawn with <tt>random</tt> and consumed in
inputs of <tt>Nseed</tt> bytes, by <tt>G.DeriveScalars</tt> (<xref target="derive-scalar"/>), by
<tt>G.DeriveKeyPair</tt> (<xref target="keygen"/>) for a key, or, for the values listed below, by
<tt>G.DeriveNonces</tt> (Section 4.3 of <xref target="EC-IHAT"/>); no scalar is sampled
directly. Implementations <bcp14>MUST</bcp14> draw with a cryptographically secure random
number generator and <bcp14>MUST NOT</bcp14> reuse randomness across derivations. Randomness is
as sensitive as the values derived from it, and the constant-time requirement
of <xref target="ec-act-security"/> covers both.</t>
        <t>The following values <bcp14>MUST</bcp14> be derived with <tt>G.DeriveNonces</tt>, with the inputs
stated where they are used; drawing them directly is not conformant:</t>
        <ul spacing="normal">
          <li>
            <t>the Moderator's signing exponent <tt>e</tt> in <tt>IssueResponse</tt> and
<tt>IssueRefund</tt>, through <tt>SigningExponent</tt> (<xref target="ec-act-signing-exponent"/>);</t>
          </li>
          <li>
            <t>every nonce of a <tt>ProveCompact</tt> prover of the Credential scheme,
through <tt>ProverNonces</tt> (<xref target="ec-act-prover-nonces"/>).</t>
          </li>
        </ul>
        <t>The Client's <tt>k</tt>, <tt>r</tt>, <tt>r1</tt>, <tt>r2</tt>, <tt>kstar</tt>, <tt>rn</tt>, <tt>rc</tt>, and <tt>s1</tt> are
derived with <tt>G.DeriveScalars</tt> from randomness alone; a repetition among them
harms only that Client. The signing exponent and the prover nonces are also
derived from a secret, because a repeated signing exponent, or a prover nonce
repeated under a different challenge, can compromise <tt>skM</tt> or reveal a
witness scalar (<xref target="ec-act-security"/>).</t>
      </section>
    </section>
    <section anchor="ec-act-security">
      <name>Security Considerations</name>
      <t>The Credential scheme is a keyed-verification anonymous credential <xref target="KVAC"/>
over the pairing-free BBS-style signature of <xref target="BBS"/> as analysed by <xref target="TZ23"/>,
with the balance, the nullifier, the blinding factor, and the context scalar
as the signed attributes. Because the Moderator is both issuer and verifier
and there is no pairing, the scheme is an algebraic MAC in the sense of
<xref target="KVAC"/>, of the shape introduced as <tt>MAC_BB</tt> by <xref target="BBDT16"/>.</t>
      <dl>
        <dt>Assumptions:</dt>
        <dd>
          <t>Credit conservation rests on the q-SDH assumption in <tt>G</tt>, for the
unforgeability of the signature <xref target="TZ23"/>; on no party knowing a nontrivial
linear relation among <tt>B</tt>, <tt>H1</tt>, <tt>H2</tt>, <tt>H3</tt>, and <tt>H4</tt>, which the
hash-to-curve derivation of <xref target="ec-act-generators"/> provides in the random
oracle model; and on the random oracle model for <tt>HashToGroup</tt>,
<tt>HashToScalar</tt>, and the Fiat-Shamir transform of <xref target="FIAT-SHAMIR"/>, with the
special soundness of the relations of <xref target="ec-act-proofs"/>. The reduction is
expected to follow that of <xref target="TZ23"/> in the algebraic group model with a
programmable random oracle: the keyed-verification oracle is answered
from the adversary's algebraic representations, since <tt>skM * B</tt>,
<tt>skM * H_i</tt>, and <tt>skM * A_j</tt> are all computable by the reduction, and the
derived signing exponents are programmed. <xref target="BBDT16"/> covers the
keyed-verification setting for the underlying MAC.</t>
        </dd>
      </dl>
      <t>The credit-conservation reduction and the statistical unlinkability
argument for the idealized scheme remain to be written out. Bounds for
the concrete scalar and nonce derivations in the random oracle model,
and unlinkability against quantum random-oracle queries, also remain
open. The arguments below describe the intended guarantees and proof
strategy.</t>
      <dl>
        <dt>Credit conservation:</dt>
        <dd>
          <t>Fix a Moderator key, a credential context, and a balance width <tt>L</tt>. For
any sequence of presentations the Moderator accepts, with amounts <tt>s_i</tt>
and return amounts <tt>t_i</tt>, and any set of issuances with balances <tt>c_j</tt>,
</t>
          <artwork><![CDATA[
sum_i s_i <= sum_j c_j + sum_i t_i
]]></artwork>
          <t>except with negligible probability, for an adversary controlling every
Client, provided the nullifier store (see "Nullifier store" below) rejects a repeated
nullifier. The right-hand side is under the Moderator's control. The
property rests on the following:</t>
          <ul spacing="normal">
            <li>
              <t>an accepted spend proof yields, by special soundness, a signature under
<tt>skM</tt> on <tt>(c, k, r, ctx)</tt>;</t>
            </li>
            <li>
              <t>every such signature was produced by <tt>IssueResponse</tt> or <tt>IssueRefund</tt>,
whose signing oracles are constrained by the proofs they verify, or
q-SDH is broken;</t>
            </li>
            <li>
              <t>the balance constraints of <xref target="ec-act-spend-relation"/> hold over the integers
("Amount validation" below), so the refund Credential has balance exactly
<tt>c - s + t</tt>; and</t>
            </li>
            <li>
              <t>a recorded nullifier is never counted twice.</t>
            </li>
          </ul>
        </dd>
        <dt>Unlinkability:</dt>
        <dd>
          <t>The intended property is that a spend hides which issuance or refund
produced its Credential, and the balance beyond the public amounts and
predicates, from a Moderator that sees every message and holds <tt>skM</tt>.
The idealized argument uses independent uniform blinding scalars and
prover nonces: the commitments <tt>K</tt>, <tt>K_n</tt>, and the bit commitments are
hiding <xref target="Pedersen91"/>, the pair <tt>(A_prime, B_bar)</tt> rerandomizes the
signature <xref target="TZ23"/>, and the proofs are statistically zero-knowledge in
the random oracle model (<xref section="7.5" sectionFormat="of" target="SIGMA"/>). This idealized
argument does not rely on the hardness of discrete logarithms.
</t>
          <t>For the specified hash-derived scalars and nonces, we are assuming
the security of Hash based pseudorandom generators in addition.  The
proof strategy replaces the derived vectors by independent random
scalars, with a loss accounting for scalar-reduction bias,
collisions, and queries to secret derivation inputs (Section 4.2 of
<xref target="EC-IHAT"/>). Concrete bounds for this replacement and its
composition with the proofs remain to be established. The public
amounts <tt>s</tt>, <tt>a</tt>, and <tt>t</tt>, and the configuration, determine which
Credentials could have produced a presentation; <xref target="ARCH"/> states the
anonymity-set requirements.</t>
        </dd>
        <dt>Quantum adversaries:</dt>
        <dd>
          <t>A quantum computer capable of solving discrete logarithms in <tt>G</tt> can
recover <tt>skM</tt> from <tt>pkM</tt> and forge tokens. The unlinkability of
recorded transcripts under the specified hash-derived randomness
requires an analysis in the quantum random oracle model. This analysis
remains open for this construction.</t>
        </dd>
        <dt>Amount validation:</dt>
        <dd>
          <t>The spend relation constrains <tt>c</tt>, <tt>s</tt>, <tt>a</tt>, and <tt>v1</tt> only modulo <tt>p</tt>:
the bit equations show that <tt>v1 = sum_j w[j] * b1[j]</tt> lies in <tt>[0, m]</tt>
as an integer, since every weight is positive and the weights sum to
<tt>m = 2^L - 1 - (s + a)</tt>, while <tt>c = s + v1</tt> holds in the scalar field.
For this to hold over the integers, <tt>s</tt> and <tt>a</tt> must be small, and they
are small only if the Moderator checks them, so <tt>VerifySpend</tt> <bcp14>MUST</bcp14> raise
<tt>AmountError</tt> on either being <tt>&gt;= 2^L</tt>, or on <tt>s + a &gt;= 2^L</tt>, before
verifying the proof. With those checks, <tt>s + v1 + a &lt;= 2^L - 1 &lt; p</tt>,
which <tt>MAX_BIT_LENGTH = 64</tt> guarantees, so the relation cannot wrap: the
balance <tt>c</tt> equals <tt>s + v1</tt> as an integer and <tt>c + a &lt; 2^L</tt>. A refresh
has no range proof and relies on <tt>c &lt; 2^L</tt> by induction: <tt>IssueResponse</tt>
rejects <tt>c &gt;= 2^L</tt>, and a refund produces <tt>v1 + t &lt;= c + a</tt>, which is <tt>c</tt>
for a refresh and was proved below <tt>2^L</tt> otherwise. The same reasoning
requires <tt>t &lt;= s + a</tt> in <tt>IssueRefund</tt>, which keeps every balance below
<tt>2^L</tt> without a range proof over the refund.</t>
        </dd>
        <dt>Randomness reuse:</dt>
        <dd>
          <t>A repeated nonce in the <tt>IssueResponse</tt> or <tt>Refund</tt> proof reveals <tt>skM</tt>,
and a repeated signing exponent <tt>e</tt> under one context lets a Client
holding two Credentials with that exponent forge Credentials at any
balance below <tt>2^L</tt>, each with a fresh nullifier, which the nullifier
store cannot detect. Both values are therefore derived with
<tt>G.DeriveNonces</tt> (Section 4.3 of <xref target="EC-IHAT"/>) from the key and the
operation (<xref target="ec-act-signing-exponent"/>, <xref target="ec-act-prover-nonces"/>), so that a rolled
back or snapshotted random source reproduces an earlier response instead of
yielding a second one. An implementation that draws either value
directly <bcp14>MUST</bcp14> treat every repetition as a compromise of <tt>skM</tt>.</t>
        </dd>
        <dt>Identity elements:</dt>
        <dd>
          <t>Deserialization rejects the identity element (<xref target="ec-act-wire"/>), and the
verifier of <xref target="SIGMA"/> rejects an instance that contains one. The check
is soundness-critical for <tt>A_prime</tt>: were it the identity, <tt>A_bar</tt> would
be too, the first spend equation would hold with <tt>r2 = 0</tt>, and the second
would let a prover present <tt>B_bar</tt> as a blinding of any message of its
choosing, at any balance, without holding a signature. An implementation
whose group library accepts an encoding of the identity must perform the
rejection itself.</t>
        </dd>
        <dt>Nullifier store:</dt>
        <dd>
          <t>The Moderator <bcp14>MUST</bcp14> check the nullifier of a spend against a
  permanent record and add it to the record atomically, so that a
  spend is either fully processed or not at all.  Losing the record
  re-admits every Credential spent while it was in effect; the record
  covers at least the lifetime of the credential context it was
  recorded under.</t>
        </dd>
        <dt>Single use of Credentials and states:</dt>
        <dd>
          <t>A Client <bcp14>MUST</bcp14> treat a Credential as spent, and <bcp14>MUST</bcp14> have stored the
returned state durably, no later than the moment the spend proof
becomes observable outside the Client, and <bcp14>MUST NOT</bcp14> run <tt>ProveSpend</tt> on
it again, whether or not the refund arrives. An implementation <bcp14>MUST</bcp14>
have <tt>ProveSpend</tt> consume the Credential value, <tt>FinalizeIssue</tt>
consume the issuance state, and <tt>FinalizeRefund</tt> consume the spend
state, so that no process can use any of them twice; a Credential or
state restored from a
backup after use is the wallet's responsibility. A second spend of the
same Credential presents the same nullifier, which the Moderator
rejects, and links the two presentations to each other; one issuance
state finalized against two responses, or one spend state against two
refunds, yields Credentials that share a nullifier, of which at most
one can ever be spent. A Client that loses the spend state after the
Moderator has recorded the nullifier loses the balance.</t>
        </dd>
        <dt>Constant time:</dt>
        <dd>
          <t><tt>Bits</tt>, every operation on the witness of the spend relation, and every
operation on the Client's randomness and the scalars derived from it <bcp14>MUST</bcp14> be
implemented in constant time with respect to those secrets
(<xref section="7.6" sectionFormat="of" target="SIGMA"/>). The bit equations are linear in the bits, so
nothing is selected by a bit's value. On
the Moderator, <tt>skM * A_prime</tt> in <tt>VerifySpend</tt> and the inversion of
<tt>e + skM</tt> and the multiplications by <tt>x</tt> in <tt>IssueResponse</tt> and
<tt>IssueRefund</tt> operate on the signing key with inputs the Client chooses,
and <bcp14>MUST</bcp14> be constant time with respect to <tt>skM</tt>; <tt>A_bar</tt> then enters the
verification through a group element rather than a scalar, which
<xref section="7.6" sectionFormat="of" target="SIGMA"/> addresses for keyed-verification credentials.</t>
        </dd>
        <dt>Derived prover nonces:</dt>
        <dd>
          <t><tt>ProverNonces</tt> derives the nonces of a proof together with
<tt>G.DeriveNonces</tt> (Section 4.3 of <xref target="EC-IHAT"/>) from the witness, the
session, the relation, and <tt>Nseed</tt> bytes of fresh randomness. Its security
analysis must establish that the nonce vector is indistinguishable from
fresh uniform randomness to parties without the witness, as required by
<xref section="8.4.2" sectionFormat="of" target="FIAT-SHAMIR"/>. This requires bounds on oracle queries
and collisions, as well as the accumulated scalar-reduction bias of
<xref target="derive-scalar"/>. If the random source fails independently of the
witness, the argument additionally requires sufficient entropy in the
witness that is unknown to the adversary.</t>
        </dd>
        <dt>Verification key secrecy:</dt>
        <dd>
          <t><tt>VerifySpend</tt> requires <tt>skM</tt>, so a Credential can be verified only by the
Moderator that issued it. A Moderator that shares <tt>skM</tt> with another party
lets that party issue Credentials in its name.</t>
        </dd>
        <dt>Context granularity:</dt>
        <dd>
          <t>The credential context is visible at every spend through the fact that the
proof verifies under it, and so partitions Clients into the set sharing its
value. It <bcp14>MUST</bcp14> be
coarse: every Client issued under a given context <bcp14>MUST</bcp14> derive the
byte-identical <tt>ctx_cred</tt>. The spend context does not partition Clients,
since it binds a single presentation to a single challenge.</t>
        </dd>
        <dt>Balance width:</dt>
        <dd>
          <t><tt>L</tt> is public and identical for all Clients of a Moderator, and fixed for
the lifetime of a key and context (<xref target="ec-act-config"/>). A Moderator that used
different values of <tt>L</tt> for different Clients would partition them by the
length of their spend proofs, and one that changed <tt>L</tt> under a key and
context with outstanding Credentials would invalidate the balance
invariant of the conservation argument.</t>
        </dd>
        <dt>System requirements:</dt>
        <dd>
          <t>The requirements on deployments are those of "Nullifier store", "Context
granularity", and "Single use of Credentials and states" above, consistent
configuration across Clients (<xref target="ARCH"/>), and the randomness requirements
of <xref target="randomness"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="EC-IHAT" target="https://datatracker.ietf.org/doc/html/draft-ladd-mole-ec-ihat-00">
          <front>
            <title>EC-IHAT: Issuer-Hiding Anonymous Tokens</title>
            <author initials="S." surname="Schlesinger">
              <organization/>
            </author>
            <author initials="W." surname="Ladd">
              <organization/>
            </author>
            <author initials="D. I." surname="Mohan">
              <organization/>
            </author>
            <date year="2026" month="November" day="02"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ladd-mole-ec-ihat-00"/>
        </reference>
        <reference anchor="ARCH">
          <front>
            <title>Moderation of unLinkable Endorsements (MOLE) Architecture</title>
            <author fullname="Samuel Schlesinger" initials="S." surname="Schlesinger">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Dennis Jackson" initials="D." surname="Jackson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="November" year="2026"/>
            <abstract>
              <t>   Moderation of unLinkable Endorsements (MOLE) is an architecture that
   lets a party performing access control (a Moderator) bootstrap trust
   in a client from a third party (an Anchor) that already has a trust
   relationship with that client, and then adjust that trust over time
   in response to the client's behaviour, for example by dynamically
   rate-limiting access.

   MOLE targets open deployments, in which independent parties may be
   responsible for access control and for vouching for clients, whilst
   maintaining strong privacy protections for clients.  These
   protections are designed to hold even if participants in the
   ecosystem collude or otherwise misbehave.

   This document specifies the roles, the information flows between
   them, the privacy and security requirements, and deployment
   considerations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jms-mole-architecture-01"/>
        </reference>
        <reference anchor="SIGMA">
          <front>
            <title>Sigma Proofs for Linear Relations</title>
            <author fullname="Michele Orrù" initials="M." surname="Orrù">
              <organization>CNRS</organization>
            </author>
            <author fullname="Cathie Yun" initials="C." surname="Yun">
              <organization>Apple, Inc.</organization>
            </author>
            <date day="16" month="August" year="2026"/>
            <abstract>
              <t>   This document describes Sigma Protocols for proving knowledge of
   preimages of linear maps in prime-order elliptic curve groups.  These
   are sometimes also called _Maurer Proofs_, or _proofs of knowledge of
   a preimage of a group homomorphism_.

   Examples include zero-knowledge proofs for discrete logarithm
   relations, ElGamal encryptions, Pedersen commitments, and range
   proofs.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-sigma-protocols-03"/>
        </reference>
        <reference anchor="FIAT-SHAMIR">
          <front>
            <title>Fiat-Shamir Transformation</title>
            <author fullname="Michele Orrù" initials="M." surname="Orrù">
              <organization>CNRS</organization>
            </author>
            <date day="16" month="August" year="2026"/>
            <abstract>
              <t>   This document describes the Fiat-Shamir transformation, which allows
   making a public-coin protocol non-interactive by means of a
   cryptographic hash function.

   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>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-fiat-shamir-03"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HASH2CURVE">
          <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="Pedersen91" target="https://doi.org/10.1007/3-540-46766-1_9">
          <front>
            <title>Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing</title>
            <author initials="T. P." surname="Pedersen" fullname="Torben Pryds Pedersen">
              <organization/>
            </author>
            <date year="1991"/>
          </front>
          <seriesInfo name="CRYPTO" value="1991"/>
        </reference>
        <reference anchor="BBS" target="https://crypto.stanford.edu/~dabo/pubs/papers/groupsigs.pdf">
          <front>
            <title>Short Group Signatures</title>
            <author initials="D." surname="Boneh" fullname="Dan Boneh">
              <organization/>
            </author>
            <author initials="X." surname="Boyen" fullname="Xavier Boyen">
              <organization/>
            </author>
            <author initials="H." surname="Shacham" fullname="Hovav Shacham">
              <organization/>
            </author>
            <date year="2004"/>
          </front>
          <seriesInfo name="CRYPTO" value="2004"/>
        </reference>
        <reference anchor="KVAC" target="https://eprint.iacr.org/2013/516">
          <front>
            <title>Algebraic MACs and Keyed-Verification Anonymous Credentials</title>
            <author initials="M." surname="Chase" fullname="Melissa Chase">
              <organization/>
            </author>
            <author initials="S." surname="Meiklejohn" fullname="Sarah Meiklejohn">
              <organization/>
            </author>
            <author initials="G." surname="Zaverucha" fullname="Greg Zaverucha">
              <organization/>
            </author>
            <date year="2014"/>
          </front>
          <seriesInfo name="CCS" value="2014"/>
        </reference>
        <reference anchor="TZ23" target="https://eprint.iacr.org/2023/275">
          <front>
            <title>Revisiting BBS Signatures</title>
            <author initials="S." surname="Tessaro" fullname="Stefano Tessaro">
              <organization/>
            </author>
            <author initials="C." surname="Zhu" fullname="Chenzhi Zhu">
              <organization/>
            </author>
            <date year="2023"/>
          </front>
          <seriesInfo name="EUROCRYPT" value="2023"/>
        </reference>
        <reference anchor="BBDT16" target="https://crypto.orange-labs.fr/acg/publication/infoPublication.php?id=225">
          <front>
            <title>Improved Algebraic MACs and Practical Keyed-Verification Anonymous Credentials</title>
            <author initials="A." surname="Barki" fullname="Amira Barki">
              <organization/>
            </author>
            <author initials="S." surname="Brunet" fullname="Solenn Brunet">
              <organization/>
            </author>
            <author initials="N." surname="Desmoulins" fullname="Nicolas Desmoulins">
              <organization/>
            </author>
            <author initials="J." surname="Traore" fullname="Jacques Traore">
              <organization/>
            </author>
            <date year="2016"/>
          </front>
          <seriesInfo name="SAC" value="2016"/>
        </reference>
      </references>
    </references>
    <?line 1519?>

<section anchor="ec-act-test-vectors">
      <name>Test Vectors</name>
      <t>The vectors below cover the Credential scheme under the <tt>P256-SHA256</tt>
ciphersuite at <tt>L = 4</tt>: the generators of <xref target="ec-act-generators"/>,
<tt>CreateContextScalar</tt>, one key pair, one issuance, and a chain of four
spends with their refunds, one for each pair of zero and nonzero amounts
<tt>s</tt> and <tt>a</tt> (<xref target="ec-act-spend-relation"/>). Byte
strings are in hexadecimal, wrapped at 64 digits with the continuation
lines indented; amounts and <tt>L</tt> are decimal.</t>
      <t>Every algorithm is a deterministic function of the bytes it draws from
<tt>random</tt>. Each <tt>rand</tt> entry is the concatenation of every <tt>random</tt> call
the algorithm makes, in the order made, including those of
<tt>SigningExponent</tt> and <tt>ProverNonces</tt>; an implementation
replays a vector by serving those bytes in place of <tt>random</tt>. The order
is: for <tt>G.GenerateKeyPair</tt>, the key seed; for <tt>IssueRequest</tt>, the
<tt>Nseed</tt> bytes of <tt>k</tt> and <tt>r</tt>, then the prover's <tt>Nseed</tt> bytes; for
<tt>IssueResponse</tt> and <tt>IssueRefund</tt>, the <tt>Nseed</tt> bytes of <tt>e</tt>, then the
prover's <tt>Nseed</tt> bytes; for <tt>ProveSpend</tt>, the <tt>Nseed</tt> bytes of its
scalars, then the prover's <tt>Nseed</tt> bytes. The <tt>state</tt> entries
are the <tt>ClientIssuanceState</tt> <tt>(k, r, K)</tt> as
<tt>SerializeScalar(k) || SerializeScalar(r) || SerializeElement(K)</tt>, and
the <tt>ClientSpendState</tt> <tt>(kstar, r_star, v1, s, a, K_prime)</tt> as
<tt>SerializeScalar(kstar) || SerializeScalar(r_star) || I2OSP(v1, 8) ||
I2OSP(s, 8) || I2OSP(a, 8) || SerializeElement(K_prime)</tt>. Every message
and <tt>credential</tt> entry is the
encoding of <xref target="ec-act-wire"/>, and the spend context of every spend is
<tt>ctx_spend</tt>.</t>
      <section anchor="ec-act-tv-suite">
        <name>Ciphersuite</name>
        <artwork><![CDATA[
suite.identifier = 503235362d534841323536
suite.ctx_proto = 45432d41435476312d503235362d534841323536
suite.L = 4
suite.H1 =
    021a3022391ada95c2e90ec5452609f54b6c72db02587405e64e23e1fb38e3a8
    dd
suite.H2 =
    02db70cf75af61816a299e607b0cb664d682416a82f62a34515849d42645b13c
    4a
suite.H3 =
    02eb51113045f6834d61ab89b9c1b29e136d07f37bbb7e8ad02a871bee85708a
    62
suite.H4 =
    035f47490268b4aff204f8dff672cf54b36e0d3c012617d480d1f7470734e844
    c7
suite.ctx_cred =
    45432d4143542d746573742d766563746f72732d636f6e74657874
suite.ctx =
    d685e534e574bcedc28a422bcc0f68267c59cf633771c1ad1d2a76a18f404346
]]></artwork>
      </section>
      <section anchor="ec-act-tv-key">
        <name>Key Pair</name>
        <artwork><![CDATA[
key.rand =
    d069967f203df4d58f4430bf9cb90beb883d542d7c89c551db69dce42570bf4a
    e3adacc80db708e282150cea9e505068
key.skM =
    34e271d1d4e404dc78a38a6b0ca4b3abc68bc4806b00997edbb901f13846f5f2
key.pkM =
    03263eb172073519ff125b897fdc7569e4bd908debe19208b59361e21e8e4cad
    78
]]></artwork>
      </section>
      <section anchor="ec-act-tv-issue">
        <name>Issuance</name>
        <artwork><![CDATA[
issue.request.rand =
    90cc52ee9f2addb59f11528b75bfbf1c4cdf583ab8c00ab56193c6e78e451c38
    cf21ac4d582578e7effb4a5af7bda867c14b1781c22924b02eb07e7a927fb859
    e07b66ca27390f209cb05c52cf856e2020b6062f2b487698b71352f7e29bb10d
issue.request.state =
    10fc7a30fa9fd08188d3e32f3c41e9939a037700c010220403fdf14771559d46
    645beb9f699d06abbe0346165bdebcf816b43b8b81c81010058d38878710906b
    028c4625c08d866d63ac5fe067cadabf1e6432c11735dabd8127c0fe5fa42ea6
    70
issue.request.message =
    028c4625c08d866d63ac5fe067cadabf1e6432c11735dabd8127c0fe5fa42ea6
    706708266fdc5bcd931f51be4ccb9b8cbb9944e9b89e52c2b980e83fe2c128f8
    6f296f482c0ad3e5e389ab1a2f50be2ff4dd2dfa3ae79d2ab7c8d579fe7c34a7
    ab69586198e6a59c857c1fc7db3ffbc8f74e3b448226431186283eae617f4521
    57
issue.response.c = 10
issue.response.rand =
    84e42dfed8e44d65a2832ab18f705cf12dc961978c29d8baf4fe0113def1e4f7
    d73a60863711e7ea31afc5a8d59d9a6b6f61ebce002cdc2d70122518f2092ba9
    368e21e0538b2a242f17b497a4814c6fb4e97ccf81025b1c46821c40c455dc24
issue.response.message =
    03971ccde028dee2ef52509320cdfc5f924404f78f5f761d77541eda9490a4cf
    99756a4528f1acc3cca034306dd3b1898c4676bb78083492b67c4466d2951951
    08000000000000000ae96a894b413d3b7505f9f4cc24641980ae58a9d2de237b
    0d911e69856535b051719ee0ad06fa8d00303e873ae6b545d5d38b8a8a4ae938
    8115a30988534d0e37
issue.credential =
    10fc7a30fa9fd08188d3e32f3c41e9939a037700c010220403fdf14771559d46
    000000000000000a645beb9f699d06abbe0346165bdebcf816b43b8b81c81010
    058d38878710906b03971ccde028dee2ef52509320cdfc5f924404f78f5f761d
    77541eda9490a4cf99756a4528f1acc3cca034306dd3b1898c4676bb78083492
    b67c4466d295195108
]]></artwork>
      </section>
      <section anchor="ec-act-tv-spend1">
        <name>Spend 1: ordinary spend (<tt>s = 3</tt>, <tt>a = 0</tt>)</name>
        <artwork><![CDATA[
spend1.s = 3
spend1.a = 0
spend1.ctx_spend =
    45432d4143542d746573742d766563746f72732d6368616c6c656e67652d6469
    67657374
spend1.rand =
    a343c4b867f1de824eb47951ed28c6d393fb2b9e31cab746571fabd63e7a79ea
    e967796ab6f8b28ea5166350134dd2137fa525deec68d8126f7a3da4505122d1
    a4bcb891b5fe184da4342a2b18c7a4c3466e334aedc6307f90951384e07c5e75
spend1.state =
    ca281b89a42946e503c819b3ed6d820b4946ed075c0ebd41e37ff7260bad4fdf
    27f5bd121fcecb0785a455d46d36612fd193e06d5648369edcdca6a6376704cd
    00000000000000070000000000000003000000000000000003f8c8bf93aacc88
    ae2c498eadc68269d46b0e2e0314adc4bd6df38724bead6f02
spend1.message =
    10fc7a30fa9fd08188d3e32f3c41e9939a037700c010220403fdf14771559d46
    0000000000000003000000000000000003e347ebc46950d96074e2033c46715f
    fceb842c81395590069acaa188f413c69903589508c33878a080df7b65d6f345
    f9d6fdf241f73fc593f5de7c61286d7acf9b03b117a3e919906a670ee02d6825
    b0a8a4e54456148b87a66a8c9fd53fa6faadb50208fbedbb6e37f02474acfa6f
    1fe051b6b15b6d31ff4865791eab72c10e7479ca03431c5a476b7070a48862a7
    4365b8a2c334f61141260a664a60fbaa6b382a2ed6036fccf8dbb72e8ed2865b
    475737e767d4aad1844fecb4ce8dd58ecd81d79bb02402448ed5928af211ecfa
    5868159713a2560e6e2bafee5fd48f7ecd5fd974e69a4f6c243ad036550dab1e
    5a5ebd6a3790f2918f6d59d2314f34e0f7452e66dd7aefb161f87018749558d1
    c294573c794c785a147de8705b95a61269065e236c813ed6e87c31af5aba8cd8
    a71cb95674cb95d728c4789047bd4a66111a93ce9760203863bf0db78e0030c0
    d64a9ec43ec3353d734bf3e7e42caeae6237f24254c778f0bb5a2669c678803c
    70b775d00fc4ac01d145eb975815e7e934f1307041dbcce38cdaefee312780ab
    7f61f7d2341f7b1aabcaab8e31c3d20424271c4b31ee5093685ff17dadf3bbb3
    9ae219c770bea16537e89b9a7cb75d588ce229d04f80345c19c6a480f9553d92
    fb6e0adef3926ce503c33df08ed5dcade21700c3f0a5d33782a0b145cd2716e8
    e2332d9325fce4ebe1edb78e10d443e2be9771d842991da98910461d7cfbe7ab
    f0259a1923b2a2c29f66c369949ed4b2171cfc500f1a3e995a7b87bfe9443891
    11a02ded19578826af776da483da19f31ce2ad566c34c1bf6d793cf41b152b99
    3a6504d56ef53a73eb2a81a1551a6263b476c86bd181678922cbf7261ac4f04c
    88b87c0d76b2cf9a4721250ce5ccb368ecd7ca20733151a9d59da0ce7bfb581e
    ebe9500dba0f5d8b1470e8be96f0d93d70f4743e35d566b12c7af686e26c6620
    44ab3b8bb7f0fabc28617f6e0e292f709b37edd1d5c9e712494b7c9779997c70
    624da9b9c9c86e129763826b1ccad68f1f17abb38e2804911986b1198ead1e7f
    bd0dd5ace2bbdc30d3e6dccee83711a278771a1063d21b60d7f8cdfa006a8faa
    8d29a7bb281b0199b8c0d669b875828df17bc9c60f89589c8a518f2478104777
    ebd6e96d2ed12be6af631bcb47efacf6855e7030dc9f847b40f364872d327c7a
    b242517f421d11a1d23acebfba61439c7dff4dff3b4d49
spend1.refund.t = 1
spend1.refund.rand =
    a29c40ee250bbc7f94fa1dfe1cd289fcc98b20049e52d83dbb5daf8de1f65d87
    ea834ad411474fd77bd30ccebbda1e35261b6484a89d8ea28e306c7ebad73a3a
    88a079153525b9bc4cf611118e7cd7fb40ed6636a3c6a6835009b24e8917ad93
spend1.refund.message =
    03c5bdf7e351668081bdff1e550f95b07de28686632e223c829745839228f1b0
    2f64c6ad4903faab1d30471713b00d14c8d6f74f3c892b6a7d9b320459d6b6bb
    8c0000000000000001a0225cd9effadc5cd70ef74852d3257a27e1c75af96a67
    21ff3fdc6271676f55d42d59544614da779fa9096cef8e27c9182ffd8694ec51
    61a0324dc3ce7e0a42
spend1.credential =
    ca281b89a42946e503c819b3ed6d820b4946ed075c0ebd41e37ff7260bad4fdf
    000000000000000827f5bd121fcecb0785a455d46d36612fd193e06d5648369e
    dcdca6a6376704cd03c5bdf7e351668081bdff1e550f95b07de28686632e223c
    829745839228f1b02f64c6ad4903faab1d30471713b00d14c8d6f74f3c892b6a
    7d9b320459d6b6bb8c
]]></artwork>
      </section>
      <section anchor="ec-act-tv-spend2">
        <name>Spend 2: refresh (<tt>s = 0</tt>, <tt>a = 0</tt>)</name>
        <artwork><![CDATA[
spend2.s = 0
spend2.a = 0
spend2.ctx_spend =
    45432d4143542d746573742d766563746f72732d6368616c6c656e67652d6469
    67657374
spend2.rand =
    03590adbeaa38bf6bdfc6c77e94f7d8852569c457344b438fddd0f9c396531bb
    2ab3a2d573e969ae7dfdd74291f5bcfba48c3799336404b50f08b0965e98f856
    3613284307e32f57d0e64cead84d346b71dc0ed9d134b2b206170df388389775
spend2.state =
    e2c5d5f6303fcd004ed0934169501daacfbef52e18badcb9e288b3329948e266
    fe1588e420eb910b3db621ad75227d26aa18bbbec572884943b869010c574570
    000000000000000800000000000000000000000000000000039097f13bb706da
    42b83612e50e0dcb3b421326d6d93a52aa1ae13b6200f2afae
spend2.message =
    ca281b89a42946e503c819b3ed6d820b4946ed075c0ebd41e37ff7260bad4fdf
    0000000000000000000000000000000002af0791abafae532be3892ad2bb0d14
    d8d4d6db82fb5e2732376fa962eced6c2102df52a12b26e00dc3e2c713438521
    d783b65acad55ff9c7b63623aa5adcf00d5502089619e75542ff84944bdacda8
    1fad238b286b38872a4818e9982df54b6202430316300ace17b546c4d319e104
    1e14e1590e25f113b2fcbe4a2198a337653cd0af866e9537e9e1cdf957faf381
    fc4718e29716d525753c21db484d9011040050df71e1bad74375a99c4bed4e9e
    e9cbda7d0681e5b5a7cb93e45f76442478fc1b240eaa8d5b5cae759cb0d03be7
    ddaedbcc38697578ebc5b9539ec7fa4baa1b9e802db0a0dc2f8113bc4cd7946d
    09f1281d5d405bf5f80cbff7a015ba5b258325165be62fc93643159803706e0a
    f64fc7eeb84f8e923b78d773ecf40f3a247b4707c9c6f3053f9d4c88490a72ee
    8dd881aa5dc8f1ec7fe4b0a175db56e6a21d47e374bc81d1f71f9e762661772a
    8ce52a6204920673ab459ad71d3f2a34177f20a5eb6fb1ae0f082c9a5e079cb7
    00117118d2df6f08bbbc6c72dbc7739b5ef12af4392b64b0d1b8a6bcbf8edc10
    f79b60fb97a0a77d10c2a7da08201d34af150294
spend2.refund.t = 0
spend2.refund.rand =
    4af336412b38462f4341cc2c59890106574ac3337b88da1d48eb24a1e1cdfdb0
    b0e8a47e9b37128c3058fa3d7c0772c1b81984214e8b1b925d56d19f3db0e760
    3cbb462710dd437c47105c8c6eaf697eaa9882766c4eff6c503c804c143745a8
spend2.refund.message =
    03ff6be15e4232edb30ef5578ee38559366ac33f06b8b90e795d3bf716c2102c
    df4bd6980945347f79711707ef8eefaaee85eacc898d130507ac1a8e32d7505a
    8b0000000000000000582d8a5ba13e7fcce6e04a53612da436a06e925e97e219
    ebd82be05e52b3131ae6553f623363e8ef02d9b9a2ea376ac74fa1b36c9d4bbb
    8d9f01fb59c157020f
spend2.credential =
    e2c5d5f6303fcd004ed0934169501daacfbef52e18badcb9e288b3329948e266
    0000000000000008fe1588e420eb910b3db621ad75227d26aa18bbbec5728849
    43b869010c57457003ff6be15e4232edb30ef5578ee38559366ac33f06b8b90e
    795d3bf716c2102cdf4bd6980945347f79711707ef8eefaaee85eacc898d1305
    07ac1a8e32d7505a8b
]]></artwork>
      </section>
      <section anchor="ec-act-tv-spend3">
        <name>Spend 3: pure top-up (<tt>s = 0</tt>, <tt>a = 2</tt>)</name>
        <artwork><![CDATA[
spend3.s = 0
spend3.a = 2
spend3.ctx_spend =
    45432d4143542d746573742d766563746f72732d6368616c6c656e67652d6469
    67657374
spend3.rand =
    24a32412b20712265bf9bd28b5d37200bdf1022dbc6243c71c8b0828cf40ef25
    e03cf72bfcbe0e6b44b2d2bb199535aef568d662d65390a853e86f7868fe6dd6
    bb3dee7e42a3c728a9185b7a246cac0bce2248632756ad88792481d1e942a60a
spend3.state =
    6b702de8c79573d19bae26457ce27017a2224b834e296eae4f0ce77673e443e2
    70da003305191208879f280802f4ca421f63aec33a5446726ad4ab1993adfb35
    0000000000000008000000000000000000000000000000020226b521f937bcd1
    7b81cfdd877055077c4ed2788e9826351809692a61e9932fbc
spend3.message =
    e2c5d5f6303fcd004ed0934169501daacfbef52e18badcb9e288b3329948e266
    000000000000000000000000000000020286e279a9fa15d1a8850b35acada6fd
    8bb66087d2a615ec02ae2308a590e957be021a50ddcc47d1b8e85a854ed385b0
    9f783ea06b8d0098949c35211984a860977c0295842de3f0a9c00fdcc4389734
    393df738a0e7f6ec08e65a8ed2580beebbf5a902f4d6bb38ba26f2d39fa4a845
    383b1be2d8c2e2c9f59704e25352a882297c16cb02d41551f6f980addca30acf
    704304280da75e47b21e444f300099e6926785b5520325625b86cb98543f70a6
    5b240025e4a1912873c0a5a7239da2a8be1c8f756b7c03c932dea8cc13c6cf79
    d87bc62b80f0ea1e099d4522edd7b16c6a65a08b89a780f9d66d55a9a577f51f
    6738273ef3fbe2ccd917394bf1b7c2af0eeb7254c1c46120e3cc77cabff58a56
    cfbb092e0eaa91ed78b3d6f7550b1e26281480fedede516f77d9a9b56b546627
    cfbabb504a4ed5285dfe64be8d443671ede57f1b8e08acae8e4a173540fc14a7
    a98aaf2d2b3f327ca8d52f349284311a108e6f157542f04fabbd9f9892266501
    630c18868ed028469e9a8c307113efe709fa9a12e98c78a80634cf3e51fec896
    12dfdb3878263da9b2ef4ee87e081fa522fb7c32a0b3a64a4499fe77b9d6e162
    ef44ec14915b2a7674f2d374fddec708bfc23a89f4d0c600700ab7c8aca1a844
    541ad72d6498f06aacc8587da53663b069e175b49f683cc491679858e7a39fce
    a6f6a3e421db93744e1595d42b1312bb6d6be48d44a3762a59f448cb9681eb8a
    6df3d1085ccbbf9c1ffe541cc8c2eabd5b5d2d63383564ffc59b15212e01b548
    5809c25d564810e2f3bbb76d71357576632bb3b147db29038dc5193380d5d646
    0e8149dd0d19b44d65f8b1c76efd896f089640607666ee8698ab261da99949a5
    7f963cfa368633a33dd2cafe012e3cee4588b9ad0ae5715c23743fb7b4b11813
    541cb63fa58fcd8d125efad3536ecb7f895a83b77a2dc52c6f36a1def7a86834
    080f7412cfbaceca985421911a234fa004fdf89b98743de6c5d804cb31a01536
    310d55f9e9ff433b887ae62c291604030d8774675ec065ca0c6df5c9d7579737
    56a6dbe61cf3ee929ac92482c2bf450b0092502668e5febb4919c9bb225edbe2
    5655c72140f79d3bebb653580e3e74a7c75f0e9984d2a28179ea14cc155a4ae6
    d8d0f8164cc34b7a541eefdf941e909294b2c779ae8c24707e3ca622532753ec
    cc6eec224e3824e7cb95dd884dbee608d7aef28fe86109
spend3.refund.t = 2
spend3.refund.rand =
    91389375873e00ce89289d026a010ed01427848a7ccf88f16edd7013072dfc65
    2017448bba631f9f0975ac017a8e5bebae89b3a36bd2a5710a32012af07d2457
    39c1aac9a875d43148101a6fc3f6ed92ddbceaf6d47c233eeeb153406405b579
spend3.refund.message =
    028eb7785090e04bd06f03fe909618b2e2c0a6cd4e0aa7a3f20ae41ad84fc9e5
    8b991560e17771ba4439ee3ac5684e61bc08c8dd3ea2e4739aad158cf9727337
    3f0000000000000002562ae12c4158aa88bae62147a3bd3364e62bddb9e5cc45
    5585387a2d9ed9451a399bf1451e583dc1e1882b371adf106016c386267cfc19
    7674a4252d0f0401bc
spend3.credential =
    6b702de8c79573d19bae26457ce27017a2224b834e296eae4f0ce77673e443e2
    000000000000000a70da003305191208879f280802f4ca421f63aec33a544672
    6ad4ab1993adfb35028eb7785090e04bd06f03fe909618b2e2c0a6cd4e0aa7a3
    f20ae41ad84fc9e58b991560e17771ba4439ee3ac5684e61bc08c8dd3ea2e473
    9aad158cf97273373f
]]></artwork>
      </section>
      <section anchor="ec-act-tv-spend4">
        <name>Spend 4: spend with top-up (<tt>s = 3</tt>, <tt>a = 2</tt>)</name>
        <artwork><![CDATA[
spend4.s = 3
spend4.a = 2
spend4.ctx_spend =
    45432d4143542d746573742d766563746f72732d6368616c6c656e67652d6469
    67657374
spend4.rand =
    4d1b8c9d578f0b4bcc0de3b557693579cddf27a975168f9cee97d9b83ecf0bd2
    efb0406a9e5eb1a7aab1db0b09e8d3b8bffceaff6e6136f97000c3e496b1a2c2
    ce820e4dff38c6c020ce794d93ca508a237b75ee6e2b54873ca80d9e915fa255
spend4.state =
    ba2cd13a8b2e9aaf59bc2334a375fd9b66c9494591053370786ef3732ba7fb93
    0535b57b758d30a850589bd1f682d8bc63db1a80976a7d9ccc95a8b900cdde7a
    0000000000000007000000000000000300000000000000020344be4bd9b4dac8
    589e9d36498ce79c0e91990edfa625d3feb4a9b394fcac9002
spend4.message =
    6b702de8c79573d19bae26457ce27017a2224b834e296eae4f0ce77673e443e2
    0000000000000003000000000000000203376f8d281c2741e9ebe8e172af5b26
    9ed6231737b566f572f4030abcd7d3f79202095af656b0913713805f5dda62f4
    a4e91c78bc23affe077b3c0558d5b984e8f80226a4f630ea7db3ce072ce8adb0
    23ebb49fffb821d5e4ddcf6bf5439043b734c0025660136119f3e7a30193b3bd
    cea91942af6e08bf116793255da24677e82c6c630301b2fa79e7288810c4f48a
    69e610af3febe9b5dfd68d71aaf846f0ed8bc3a933022bf3de971fba0d19a955
    4d7d9ede4e6f3883bcd505a49f7976ba211fbbb7d17a034924ab1b22c67e23f3
    a8752ba95133f9315cd28233e7a0dd3e4b884b63ab6a4a68183548e2bdb374d7
    40a4e48ee490605e8e634067782f62a4852a5205dc8ef6b54ad054fd99b5830f
    bf095ddd2227f670da4c4a4531eec1dab8197d6e5f3c7c0a4cbbf1ad10ee1e58
    e8d8fc7582a5a5821c0f695b03791b36c9115c869b601ac6a93610fb375aa09f
    2c0086e5b6e15fee782bcc1b0e399dce7a4f447e978dfaf8e0cc1f0491d66c0b
    9ef4c86b0faa6700892a338d2685d534fc4a722ccb03701095dc3ddfa3b4a452
    e9736037055499e1a70b0def55f86685a7227f883a2388e711639042c2c41f88
    e694f3b429eecf6dc86fa4211406eb7d84715b07371defff565f0405aa1cd97c
    561ee1db3bf4a2937c4e3171db862f8eb418bf7116f9b662ae59dff6c6d3f816
    59b178725bfe43470e85d6daeb3eb73a2c0e784c13b71804179f524b9ed78d0d
    56bbfce5674b85f2949c84d411a7edbdd7e1890901c06e996f988c255d74a876
    68b60e594b6d5f3a5a47edcc1bb2bf256fd83fe949f5fd95a4bd64391d6126e3
    c18a85fda5287ed937d1a1dad39a73400f3c5f87c3dd2a6df764c7e394bd3995
    4e87b91bec790466900e658fe2f76d58413c06590003e1b48f36e7c8fc570236
    9fbd660537888b21b65742777040404b45680d1d7d8a2f2923be07234dff626d
    9ae2815831a89a4e3ba2f19da409527d9ab3abf7d2d6b5aada511774db5b9acc
    5ccaba3e8cc930dc1b545e1934f9ca8178c12188a3c3dc285f5a5894815f9940
    76af4a2d7903b5fad0c182b36bc124284f93fda7e3f0a8f29772f5033eff0680
    559eba60cbfbd50fa76557956c4853ee9d30688e2ac376683193ee488bccb43b
    64c7ba87c11276aaced1deeba9682971fd52a18c76cf10ba703f3134d79ebc95
    b124483f59fd68519812f4abad7481c168cb8443de94b1
spend4.refund.t = 5
spend4.refund.rand =
    322efd511af210cc6ad1e36ae1ecb099cb69e5bff36b940636e4027b623f2471
    898b77c29145b2ceba5d1b20e87cac314ea10cfb902d280ed020163dc301219e
    a1f437f9f71a35dceb6770d090d2c30a41de21f86a485a6381a43f50167d4582
spend4.refund.message =
    02b67226fef87f1f374cb9554faece12c083ee1d92ac1e4c8d7252d05cf150e5
    0deb0ff6cd0918dfbdf5576fa52cac658a4b81b2d14f7abe7ab4d9bd981afd74
    530000000000000005a489963fa647f132a55799807190de75be9b10a58a369a
    992131ff9390337a3e46a9d2eff83f96abe347b6bcecaee752488a3440198185
    4620ef4fca3d4caa5f
spend4.credential =
    ba2cd13a8b2e9aaf59bc2334a375fd9b66c9494591053370786ef3732ba7fb93
    000000000000000c0535b57b758d30a850589bd1f682d8bc63db1a80976a7d9c
    cc95a8b900cdde7a02b67226fef87f1f374cb9554faece12c083ee1d92ac1e4c
    8d7252d05cf150e50deb0ff6cd0918dfbdf5576fa52cac658a4b81b2d14f7abe
    7ab4d9bd981afd7453
]]></artwork>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank Watson Ladd for the single range proof construction,
and Christopher Patton and Thibault Meunier for review and improvements
to the protocol description.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>draft-schlesinger-mole-ec-act-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial version.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7y96ZrcRnI2+h9XgY96njPdnOoW9gKa1thNaiEtavlEznjR
I7MSQKK7htVV7UIVyR6avpZzLefKzhsRmYkEqpqibNmyR+rCksglljeWjDw7
Owt2y91KX4QPvnpydvnk5UV4ud6s7242+z58stXtche+3LzW6/5BoOp6q9+4
Jx8Ejdrpq8327iJcrrtNELSbZq1u0Fa7Vd3urG+uV7pfrq/09uxms9JnujlT
ze4sioJ+X98s+365We/ubvHCs69efh2s9ze13l4ELZq9CJrNusdn9/1FuNvu
dYAPp8Frffd2s20vgvAsvNm0eqt2aIN+NeirXu+WamV/LXc9/blfr5br16pe
rpa7O7pwu12+Uc1d8Eav9/jOZ2F4td3sbzGuS7x/9vVW7dvwyebmZr/GG+E3
dPMBPSZdfXDs1o1arnDrdl+vlhgk2umomX94m55vtlf8iNo213jkere77S8+
/3y17Hf9udz//BL3lm90//mP3MDn03Y+fxCgl8vd9b5GE9+5gZ9turP9+jmP
D/P71brdbHt9g3noP1+ud3q71rszXoyeWlhhYvud14mbSUsr25L2WjqXD58v
N9M2P//oOp9f725WD4JA7XfXmy0tGboQht1+tRIqeaFu9noVvhhe5wcwIWq9
/Bt36yL8ZrO5Wunw+fMnfFPLTPdX3kf/4Younjebm8Nv/ONmrXbXah1+q3Z/
++Tm//q62d7d7jb/cMW3jzd9ub1RmKbwa/W3s6eYFvzQxz7xZLXZt91KbfUs
fLZuzv0Pqe1Np/52/Q+Ne4a/Faw3aHwHksC0hWC3Z08vX17wix638sXwWd/v
MfFPly0mw2Ney7X8ktpeaSy8XXdwmNptVfNab8+XetcxEYJ7P6clM6u6Um3r
lnN5rZhvqTFmzzCJkuIsjs+ihC/2eruk5eg20s0QQzW08iU1Z2XCva06KuF/
zsx/Q0gWCIAX5wdUcvDMP52Hz9H48ZtfnofPzsPvNqAE3Lj86clTTNzZl+fS
qb/e9NIn4tHlTje7/VbjuRfPvvnuUh5cbnfdWdNtr876Jcjt7Ha72W2azao/
i1I8+fWzy5dnL55efvfsp+nz3RKD7K/VzXJLzwY0R97iPr188TR58uef/vLV
RfjT10+qtKT5+BHCDPy3ruLxqn8PTuWJBX+hgRA0h4k2DeLey2u92erdsglf
6AaDCP+CdUEPwNN0BbfCF9dqi2m8hzA2S6aFODqPo2j+eXqWZ9FZVswLLPar
ylv/uKrie1b+wZOf/uXHlz88QH/pqQe/vr4vz8Mfz92g3T3hs5ebba3X4Y/b
u7b3n3n8+MV4cl7gAzsRyuGL5RUYHzNwDwcIf5/3O0Wz157rdv/5f7aq3pDs
7T+/Vbf4zOesGLDg/flt242IP8p+ffD01CcMHrT5eLPW15Nhfwmh5V+fvPXP
9NbdwWT9s3qz1NvRrcmLT8+JBBoQ5OTVp5s36o1379u/XD4ZT/Dl6krXWwXq
+u7ySc/E962+0+2ZUFnDNDjBD6KT71kFDV283p0vVbNlskuiOP08j4vRVMf3
T/WTFzLP8afM83fn4ZNr1evJsL/TUMW9Gt07FD/f6eXrlf7r5no64S/UVl0f
3p608M15+K/qjd7uMbeTBr7Z6qvRzZf/mqTjef9Jv1n2yx3JdxD9r9L24awm
6efJPB9L7/S+Wf3qzz/9wEQsc5uknzC3mKGXGrO43UynZ6c7td5M7k7efoLZ
ud5P3nxyrdd/u16aO48ff/kyLsbT8uwGUviNbsMjdPkjS8hGrf6bFGrkxGar
oHmgver+vNt+rporg9G4wc9p/n4cfp/fXt/+/bL9IknGc24I+8icv7h8Yii5
+ITZvgTvq+3r5WTGLqFi1OjO4So93u6hk6eLBN23Xo/vTV79/jz8UveYM0DE
fvL690soQtUfPjBp4x9BJFu12U458B9V8+973dubwfn5eRCcnZ2FmG1CKbsg
eHm97EMAlD0h0rC/1Q1WE6+IJTILVfial/mNv8zKLbNnHAA3AtaGb4Fp8db1
ssUNYy6EtVqpdaPPw0uAtqX50hpaRwWy2qFCc7hMFLbVjSbMjlY6sOK1R0sh
VEq4u9Z4BjBvTXxrmqY3A4XrYN+1ba253kCjhfUdv2PQ/WaL2fJ/hjI2fFBD
QkvPAhrGZr8LV1pt+TvUgv0W3iFAT5cxuN0mhJzb2zv4ucHDWzNEzLjMZbjv
eUy3akkw4Qxj0yR1zvrdHUBEb2UPzwH4b9P1IZiQP4VOYGgrnn20OF60Vnd4
okdXaD2Iq6626vYak7q5NUZIPwv1utkQkMWf9IGeUAzZbVv97/vl1hgkMjE/
PP8qdDCMum2oIVTUf281ZMkNTd1gxVcgss8IoG437b5hCzK4vL217NuHPUQx
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
QML4uIf7u223yktZHaIYwr226sniyGndCznYmUrgnZLXOJhWOjl5fRr+x3+E
06vb8VWzl/nk29PFUJ5nMa3DxR/7tfrh9/SCHj/ek1fu1rPkhxc/co3/kn4H
8rs3P81tZX8edt72AIznZ1XJ8b8DehzzYuC7tidRCc93P0JbjmGtD9k/O1e2
fXo7jT1N8eaMr3yQ4iP897m3JfOLMI/SJM3TImnzNCuzWH6ZJ93GRdIFeZYm
bRZnaZ7NizTGCx97ldWH+ftpHH7BaXhREqs0SpK0ilWrqrxJdBXpJs/ypIiq
Ls/qopknbR0leTnPolwXmU5SHXd1WupUldxI29pmE9dsW8+jppvnqiviMi5U
UlW6iOZ11NRFkbVFmWS4WiZdkag0y+O8zKo2S4osr+NUCv9myjabumZ1ncdx
nEZZ3hVlinZiVZdVXTVxnVQ6Tos2mnfpvK7ruS5VGyWqnMe11mU+j0rFjRSJ
bTazzaZ5l82zKkqKss5U1yVR1pVt1xXzpKE5SAsdtWkTxUkRz9usjNq4m2fz
aJ5musyk7loz95aIKM007q9S0s6zIp+nc/qrKPICfxXdPJnjiSItukLzfcz0
0JZpBjOWa6yqzudZ3ei2SUqVJUndNBFmIinmTV41XZGm83ncYC3jNlHzQsVl
l0VZmhVShgBUCSEckhQekSRksSFI/HVO0tx+NiqqqphjRtK2y9oczWVpVHdV
U1dRreuyTFseV1NWTZ7HbV1UbaOzBPNdd5nMOAilhWGOaQNRlDopkziPGq0q
nUd5VJT8UXKdyTcxyGQeYwSZRt/bZl6qtFQFSEdhKVTdYJUaLAKuRFU1122N
vsRdnJaYzLxLuLlb1xx4okh1Hc8TrFceV10XJzmIZt6h6byodFa3VVS2utZx
lURlnVdpEesk1qXOGtVyI/PSTeBhwV1MIBt2Zgr573NTz8GfzCpqmjzRuuoS
1bb4ThfHeVLW87zu6i5usqbt8hIjLJsoUnVexFXagCbQjzxuUmG2pgPLNrQU
mONSz3XXgWbBZ/O6VSXoIM4w1jJukqRKsppYJprruaqSeVeXeSUrAk4sikaB
8qoIi4vljHL0renKvNBJlER1ERVJl9RZOS8qdDFO86Sb66Sq6zhqJ2M0R01w
03HUNXPIlE5VXRuVcVm2qU6TLm2yWFdVWqkINBpF4CbInSiL0q7t4gxkm+eQ
AIXwKMSArqsOxAcKVHWtI9BwXOQ1lgmdjIs6S+uyxjDLGA1FOb5SluCcOKpA
GEZalE1WJHmDxS2LAhymmrzTEeYI9IgJhzBLkyaOQRb43ZZxMgc36bwDZ2kl
PZlHk7HaCOwXv+c3CvBFUhSgyLxu2iqNuxxSK2vAZSAG0HeVZRp/gmOSJqmr
MtJl2mk0nJSd0EXRJVXRZWXSRAoznuu0rFQdq6TLwahJB+5tk7ZTqdLzCsKh
Bsu2+bzq9LxJMzXnRhTYNy9Bd6UuFAQKxGYTYz3bOgWZNSWknk7rDF+BpE7j
uCySMtVKQyx2UBly/kw+d1MmsOucMsjiaHrV44wSrI7O6RakDqGeKzSLLkJ6
zUGXYNi2qdCredkkVVvWqsswx9ADrcYMZ510vp2nqohKCNU4Bl+oNFZdkyuM
smoryA/I1xjUo6MoaSA/2znkeZLjG6D/pFbCGWlREutHeVrWiUqypIvndVbN
VVbGWVOA13Q1b4gEoRJr8CyEL/4dNVmeo9FsOsgJuaQVxHPTatBNq3WiuzzJ
oypNIrA+CAccC5HXzUvIsXkRt/N5Dq6BYoZyUlnTiRipILYUprvsIAmatGnA
UpDKRdummLKKKHJeQAOWEVQkhgZizDIQZ1JB/OWySFEZjf9RuoI+rrIasAHt
zCGau6oDCSZZkYEg8EBeKlBOCwAwNxzWVphqyIe8yNMcIiSex5XWIMCo6DDx
UZRGqS6xLrqogSnaHFxalwqqC58zAq2EEIS8qMoS6q2NdGrJx3P2/Y6iZTrs
3ypqpJGJvPmt6ypsP1nc37qu3Mh0caNBUckhHfEFGWTLtXJYVSr+cC0NW/Zn
BE/podjiU/5xzi/YH/yS/eFA72+HO5AzRYP/g8bBuHJcywphQvpJr9mPeJIC
YBHLXUPRdXGrgSJ1nc0xbt1CEhdtWqVdDQGp07iBiKPPxx3kLhDAXM0rbQAJ
IM0c5A6RAC4vtcrjokjzKE5JSMbpvFNYPywkoAaJbHRapS2WBhSeJK1wEMBI
A4kc15D3cZnhdppBYmClQKQZZGpR6BSSFVitSIFKqwjdBEaB7m1yPc/d3HrK
Exq5jNEolEOVFYBHKYiuqlPdFm0JpZzRVUBc6BtdY5bBLB0mtIhq1WYgdm4E
ih7EGycQ3Bp6fV7mioRThtkpijjpWsAKaKg2L7IyBf5pIQ1VobA6UEPAIMfY
ZD75nUbTf9KubEoAw1QR1BPWVtBQGXSJwhRAvxEP1hG4I0rjDNcAvIq2S8s5
cAqeKboosZMyFpv/E4x/ZAQ6zebgeVBhDskGawVANEpTYrs4l7nFlNZllmBV
0gptR4DHqlGA2QDGsFsgRGBMlHi/bFIMrFSQsy2gWZFjeLBzpJEKP9oOFlA3
TyEeQLMgtnmDxSmLdq4gCiBRaoAGleoqRptYnXkEwZqQ4SSN1BGJUZ1nGXBi
Bvk0VwUEeIMZytNOQf4qQEwgubKrCSIXRCtRAjsH7eO2TCzUKJBGUcd5DfKI
gRJKsEwVazAP0EUEg2ReiRyKoUthZwLCzyGuSqh+AxqyFMKyVAlGnEHFxhkY
BnK1yKCNu1pB86YlGAM0HMHGId2J7swTwGvwLF6VRubE8Rok2GboORgKKr6p
s0aXLbCubsCH7RzoE0PA/2d4Oa9gAwENxxoDEuRRFmWcQxSnKsmLSAPKAito
oC0YbUCvTYu/KiwrVg1dhWqDZYJO5VhvoA2pBZ6rHLxVqHRO0LgCPigIQSSg
WaygjoCBAOIhcbFSuqvjIu5KQAkYbaCI0ggH4JQMA2rmVdYQA4IYIa0AZuoq
V1jnAmuaQ5EWREmYGdxrCK/kqsYatoZ9oFPwfDHP6D/tnLDmvKyiDFAfk4up
jhUsBACSAuucAvnUHdlYpSbybiJjOGYwtJos1VifPAVIyuoO0hCAq1EE3aDN
QYpJjo5CP0V1DfRVFFVTzMsyMqY4jDloK+jzrgH5RDDOMkwS9BWmG01VWHgY
5ZAeMACbBtCzaTE3GlI4gbZSssRzEEc3x0QS3QOZwpLD/0oS1WkLrkUnMGCY
eDFWDMoTFi9stXmrICNg0Mt5hBVkSlyhqwC1CloaNEP2v5o3gCwglLLRMHxa
MuBBtHmDZ6FTy6jD4qStUZoduAEgRXdplRQNi9kU9m1ERAVZCIQTkzRJu0gB
saRzkG9UY8hNix5irUSJJCn0GHR8DqGQkfWoee5hHsFGBuVhXWDGQlpUVQwt
D1URZYTpGjDk3MwJODKvFOzOlNAmqKaDWQahDEyg26xGP+IGEgITH5MsAPHM
wel1p2EQAOALsYEMIBk05DosQshZ2ILzAvoItjma7jC/GgZnTi1nTVyDnucg
GwgssD10pQG+qshhbUMZd3mq5rCYE1XGChI0VgUsaKhZEGsBxQJIBCpMkqYm
1UPGaAe1IViO5FATQdvXsCXBZPMExjZs/RymDEHrBsNXZIinMdqtiLEUbmNE
NWhJGBBTCQEKQlYR5GKJiYfsK3ERCgLzDdxO3hpI65zGVMcJdEMHNKGxlkWR
CNlnmaoJttUQegAADSQNbBQsO0xYGLIRlOpct23c5k2l53ECzQqLCCtWAYY1
88i4iqDWybsES6jQcQJGgyjDJwHNIIm7GOQJxJiSTyPKgIUrTBD9G9oMJojI
2LqNIMEU1qCu2yaNoLqKFkwCCw6GCkzwEmSi4qgAE0AUY/KgSWGoQbeoElJc
Jhb4DktfEzyIoBHIRdCCSzHdeQnMSVYKegmBC+VToruKDRuICxDdfD43EwtB
UwEqglRAnqCTIo0BYqD1OigF8BuYGZIDxlZXQshkUZcCI8yTNoXVOpee1CQr
yNxLIAXQb/Azxob1g1jLUnBmS6ZmB5bN2qxyCE42RdBxxPHkmg/ukgqmFPAz
TNa6AWTKOnwA8AqMV1ZQHRXgWoSZhhncgrohq1oFdaLjDgq2NKNUQMeAQ1BE
c2CiOYQlhCG6WIMbQDQg2RqjymDswNwE4NKA2A0UvyIDMjXzDc0NNQirBlZe
BUzQkGaDwQs1jQXC1EBoA8Mq6HxVlMCOoCiAUbDkXIFIJ2OcWoEw84EK0Bng
TqD5GL9gyEINQUwBsUEAQZOh/QTCDBAQhJflJYQVmQa10GbSFbBHMU4gDlBJ
HWOU2RzyIq3BO7BVS4AMTABeJxNQzVuQPKQsOA6mcC3ihxxNo39IkiSQc5Xu
OiA0/AXeQzNlTkSQz0GuWA1y61aESaQngA0AXE1BwnFedIQ1E3A2oAlIolXg
KQC3qIKk7cAp4LK4TLquLYsq042xRyFHohTsBrMHCgUAw0HBAzPwdwHJk3GX
vxU0i26dIOffurCyBpPV/a0LK7p1srplMzEDk4twXPE1+qj9l/j2X8L2X2R/
KP/H/4L9l/giAvAa1nIL5a9SmBvQRx3amAODwLxuS9BpDuxC2CvLYLiXXdu2
mPwmrYAVYkP2CXSDAolCy1WAghoyC2gO5BSDCKCeoTobwL8qhfiLMqBoQIMa
BJzrqiQPqfEUxWlSwj6fkymSz1vgTcBVBY3fwviroftBgG3VwqqESZpEUEAR
mTslFPfc2n/JyP6DvQSlBrGMpQc5RRnoGOAqJosEGEIRdOiAPuMStAxQCHIq
a8AQ4AVwViEdg7wEDgK+A/kDc9SQk0USQ7rlSQL4VZC5AjwF1gOiLMEt0JPA
o3GEC5i46Ch/HFhLB9YTOBw2OZDaHGwiVJklNZglTsCjGloFChlaI00KMCrs
xDxBT5TGK1DagNqqU9pOylhg/k9w/OE/6ADJfCBwdCRPoSGxUABO0NvEd8Lx
ZZvhozUEWA38DkoG70O6FQmdcgiLAgZoixVSULAJ0AZGDSjYgHlBi9ZB2s5L
jBmQAKAMEBc6swY7QI+qHKva4aWcDTdyeep5DkbqOlon2MsKwLo0pht6Rk7K
kuwrKGnyUJaAiCV1IKM5hXkDSxvEFEFDAyDkWdGANtEoQIE0ouMM1FIBFeVd
jJVIuqbWmQLELhWAL3gGZAgVWwA4ENauSBdDls07BUqOjU0M8QTyg90F+Qgl
gZcADmro2BZkhW9FUU5WML5GSjZLoT8qMCns0kwbUaqrBqMDE8GC0zlsEAB6
SNyM/GVZRkCmoxgf9K4ij26dw3iZ5xS3gNQFnjaBSKXJAIEpBNsEWLxuyOBK
Yf+gwxls0Rg8U1J0MlJYmqQradAUeIGhVhjPR9XBDgcwbDOYa10OQwJIt5ur
CEayyusEshoICIYrbKeugZ0C2zivYG6A8KG5ZE6KrAOmIGcBdB7B+3kJKAIj
rCNUpRKCV7CkCbN1aQSLvWoh2UtyBcI01gb0QaDBToJNAs1AY9AZOh7D0KlJ
aGKZWmC3lCKC6DCsqrgDwQCtQ9SAIIyKB1gCggdqgggCwqmhJLAKUCsdhV7x
ZJdEZPMWMGaVJlmXNBUugBlgVBneiaGA4pIiCAUJQ8AzCQxD9KYVWAFzpjrg
P2ikjNilpogd5g0mVWOcph3Md/IIVJhKgIIWAifBiit8D8INmK2LQfbVIPUH
zBhNrnkKAa+RmAa/UfwvQR8ywHPIURhckGlQJLBYU9ByXZYAgC0EJcgISJAI
uTVgqoaBAWNFk1WAxQdKzwG9YWo00Zz8IDXEDQw5MAvMkbpKyPJoybRCA5hw
aSRt6jojEAS8DxonrojypmwKDaBdzUG4FawzKMImA7oqGhZjgA3QlZC7YOvx
GKeYEa/Axswh14Ee2joFLsuJxiGlcgpZFjTMLipg9ICf5xUsVxhoscgkgRpt
Ry43kGqV5Wk2x4JgUUGFhMtgAiiKk2ty31UltBaYdq6aWAEgQ3/nUW4Iqp4K
TlggLQyOWsUpjB5AbbBBpnKS/OQVLRT4AnMGe5hsd2uKlBCwUQ7ihMGfgvAK
GOgdpGBapLrUMIxbsusTrSCGVDMnUwAmZAM+qS16basuiiGIqyaG3kqizqGS
KWb8XRTrVCf+VkVrvGVjbftbF1bg3mR1f+vCynAmq1vWE8yYXoS3VJ/HHJI7
wY3JMdyY+rgx9XFjyrgxsT/+F3Bj6osJsDzMC9LKETg8gfTuqhpWJSzIdA74
ARxJvmMINBj9KRR2AzqHZU3yWnfG56rBsehHTUoSaK+GRk4IHsAgh6WosG4F
wHmBHkHnRKrMQcnoOCB/B5u/FSqqQSea/W8wHkEYCuZQXsOygnZWTVSTAysr
YSJQNAgKYF7hJ6Q7EC7kOPSLnVsPN5JXNml12YAw5ikkU6005dLM0dg8gkma
oE1gsQxaGuJIZx05XWC1QMOSr8o4+SCLoxTkEVcx4Ae+3CUwYmCRZA2gF4zs
VJEXUZFlB3gFcKVo7KlquzrN/yu4ESAlKWoAo66ChG6M93RO0TZA8nI+jwCF
5pCluk3m4DWgmwLGFQi9ADQr2PsPKNbYSRkLzf8Jrj8yAnI9zSsFKzfOW3BU
mUMWMLxTRdcaoVkXRVRCKqDTuW4ANnWSRpCaYGmsGegJkgMoqW2gN0h9gmNB
QOgxpIDRUhVIKdWKJAEGA/2Wwa7B3JFuUmUB/A19lVQ5NFWryXlZwbzvqEWy
OFKBfGmVAoqlpYKO6Ar0pITkVeSLz8uoBmIB5IG1jjWHJQmdWquk6GD8Y3T4
iIlgpACwca0h9htYsk3V5RUMYIBIdAfjT4AFGzApjFmwdJ6DcjqKIGN0KgUY
7Qy9AZ9moDDgPki/eZ3EoEYYthHl9WgscAEzvM7zJALgKihpB01WmJS0m0cm
dyInTBhBuUClg2rLedoAzABDpVWr0BdIVkpbyMEhDbgX1NJqVTYNBWvAy5VB
9XPi+7oE+NGABvh8m0GIa1iFNQkbhSkC6oEFMidXMngcEF0BJAE8YXRG+KTQ
7qnuUlBV0jRtFQMaZTVs+nlDtgXmdk5udkoaAH/ptAF4ahSwZQ46kOGAImFo
JppgbhVrWAqQFhAh4II6BkkCmJIzG9qt1cCgHWAUCA9okMA9sIdtRNWwWjMF
8smTMm8hfoC2S3JMF4DheBemGmgMBAgcXdLkzSF4I2BslwoCC0B1JN7Sjtx/
hLqTjuLOJWV+qJgIB4htTuZJBO1c11DHFTmGIbIj49VJoyYuIf/AeHivqHSl
CF1BO2Gi9DwizxBsJfA1pXmVUZFmTZdiaJ2GspI5AYoAUKNoGnif/LGJ7jJo
tDm6H1OkFgJg3qTko09VgUFnFWW1zGusk44LEW54JdMYXQUQT5lxwBMganIQ
tgDWWNuugQFWViD7qCk44MkpMpgfcLTJ8csz0u6kcKoSCpkjnTmYmrBOkdYR
xgdwDnOUkhPBdlVczEGvpZ4r8E8juhsyoVCQu2QiQehlbICRy6wGDIIygXUM
E4zWipBPAgmBrpcgfLKMapvE2AJ7YgnIr07ZeHHX6ZyALzGkqslAaklZglFz
mCIUZCRnP2Y6ikEqpQmXRVXDWBYKBiYgh1nmRUvJXjCfyE0FCUD+97ZOqigt
2waqAW3CQCWlK+JRgySrto1I63DyTgeM3MwL3bUluezxrywqIjRXYNEAUhQs
YwqIUJBD5SY0VBVQrYqUO/RLmrZt0ijK8UnAJhpmIAQzrBZKQpnHOZYKViRW
vc5qWCVxalengSENioCtCEM9hlSAkUwpsBqGDHnGFeTWHNqwpVw3GF4FDAIN
066kZFKbF9PNgROIhxrdKBI3AK3kqE8zcsqTP4EiTiV60Gqg+JYwPDAs2Yep
cQ3FZMLDFqs62CMAfOWcAm1NAoKg6HREmg0qlBRBAUsWFAebHdAWsw5BLQwI
7V+0sDFjYgjg50o1hAQo/6vLIA4gJBPYSwWYK+8gtkFtVVPVdYJh473ENJLn
ABkxWHteATLiOUrVKSF9NAyjeTPPIZgqKBBoJggXSpGIM4hHiLcMfbZOj4gS
YXA9zYBUKG0Fq9tVFH1HLyDkEoiyCpKkSciqxZrB4oQ2AIaByStCCXaQbgBD
AGvxrzmHNAFvMvRVQzVyNDUBUAK8iyqH4AYbMJlc8xMrYyi4dA5WTHUEZAMh
VFaQOLA8QNdtFGcAD1mpOHELpnRBgj2iiGVC7kOhQRihYEYoalWkgCMd1GlO
sU5Qh6YUIUWBRtBmAdgIwR9HAJRRzE6jNgHUMtoVkBoLpUoY6ZCTxFgxOL6B
aaPbKmkBMMkchN0OIsa6arBlCv4gXwMWfzLGg2RDqBDoxAigIQLij8BeaUdr
UADCkCaGWmzaTEdKQeSQXa9JZJVZ11Q6N0ikggwsIkiq+TyuIS3TCqaGaoBd
M1BbDUTQlG0LoJFAKacVReNz4OCKALihTYCLCQqCflYabAN1D70BbiWCh+RQ
ad2SfY5fNQZfUSTQgIg8B0AuiRsrTE2WxxCSFdQl/tJ5mbYNbHRgCTLJFaHz
IoIqTsuCkp2hqER1kyQHNoUVAN2dQbg5KHhgA/4uIHkybvVbQbP0ZIKcf+vC
ijtlsrq/dWFNOH28umk3sQGzi9H5gr4lmH7UEsx8SzDzM8gy3xLM/jcswWzk
MCJ0DVmbc7ZDRhn0QMuAmfOigt6rmrbtkrkC98ew2ypon4qiKyX57mAmWjhR
g9oKSmEHB2NNKE5TQyhXQFkUd4bKBZ+D6Ys4Bfil/KkGdFQVlJLbSCMQVICB
HCwtMQyYEqC3KmsriM8c0IzyLKEjOI0FOhvQFggJzIJl7lSS525uPUsQcB1W
FJAMqAaLC2Bek6AhLEG5L5T1DbWb5VUc5VjvCMYpECvms1bzDnhEiPz/r+1c
WjMpojC891eEcR3p6roLLsSVoOBCcF1XE8wkkgsu/PM+b3dlnHwMyICT5XdL
V51z3kvVqW51c3r9cwYjH7t5sK8bnTToCalsO8NAPcRjX7G1JmqtmTEip9ZG
8UWl/FcHGSIfO30041fXS3uVKAy3WwkuzU3bzn6o0ScEg3WH+ByKEJ09Mc9c
wIe0egudX6L2PzECbQakvqv7PoocB6KbeoQkUJ0nmYJ1YbfI7YhqD9NHgIKf
KpjfyHhw+/xQ1rkZRP0Gs6HG0uYnZFm0vHlqSMc8oJgVW7JsYJErxkf9Rx5p
4kaaSc5aXU4WL6EG7san9qZTMa87yPZQDXPOmhCjWCj82Qz4P5ADb1axjO2A
dpDXBqP1TinZDQ2ILOwrh/EpWplQbwVpbyR5sWu+a0EjRlJcFYoDB5v3qR5M
LYZBi81N96pmcXvw6VQ4B24GvR8QBDDp1JkOws1IbUF6MqiK8qUkDQJNmrNk
71ddRxHJAOuOTTYmVKtaDBBNFagLw1fQt51ob/IxgmDUUgsRKz7PzBdvqxfc
G2tntkYtP0lEzXcEneRIcojMUpnbgiJHX2utoDLBkSs4r2QjPrxKuUNanhQI
ongA/jjupM10XMumZf0x5dwQth5dCfvBe9tqG0GAEPNOYuLTRTOuwXRe3VEN
+awl6YjB8dM2rC3vYgR08AefKf48YSp1tLBaRPDEXp3q2wzaibYxn6uphiEi
yishLvhcHX3ZoCSkT8GcnXlCEoASvuKmUJqDYQCapqIhsw77RLLMafE8Jspy
4ip5d6ofBp/ctrrSHj5MZPQs6mXctLOGk+h7wJ6igNRYFglG07Wh2hh7wwVg
CapGvVAXcRz0vvd4vAHugrhdy6XaoUqy/UwWsQc6E66LZFQmg7fokrmaUkcA
LLQTCTuS7gQh6DCGQSMHWBg6xWHUjQKVN8Cc42jAeibE4OljW7qaMID4Voec
9qzV/kFR8wr6hCmoDt6euoApzEUb+awDZWpRlpQ+fyTrpE7cfZ3D2aPLCV/V
y6hUZmQQwB26tRlK0eAyUOfTA1NZ6wIYrnUlxL0NdQnW5OeuRSFEtcOx6GgU
QhcVhZDYiH1A6WslBplOgSKcUlznbRIJwCWS2p2EKur0HF1BrtQbCICXkx6h
mMQivF3hWqsImz2Ms3Zw+lDFxA3veHNYjFLDX+HAcgFKto1MJVBRcd3xNtrZ
a3gF/isfyauK8fWV3MSUE7kQgPQRMHS4U5yp16FGeaYs/B2muoSJw0yQ5doB
WP4rTy6PyrMRpKnqqvIoCGQRcdSGvkMSgR0ABiTLlO0YI8DRioqRl31JowGQ
U5AwXS4698JnTaYOSc5d6y46jKaGRgw72cG4DdILPwMEl7bypLVScfsJilRj
lcy3H0YNkxk2J/zN7KjcYpmVtjN9qtOMbcA+ZrctjVuUZZ0ZQadgabWogi4O
lS+7Hf2XLdMejzW/xHhi1KkfUGvOjZEutQ0blaC9zAowgsRYQ9gwNKd1arEs
nwXKSoPF8MNqeAHFQN6mExBnnhCwStY0Y/ao9Y/BLOJhSg5qYzGza+sblg0N
wY6kQMVaddUD+7WtEFej/l2LNBHMo5uTgdfKsTUMc6K6Wk1O7prMMB8U3L9O
0F+89pG4s/uOMyUQagwGh4Ia8bD5QCLIknOrcA31RtZUphcNOdy2xwolq1vu
XLVKOvAW5dYdtN0YnkczItUYOLNjHB55a6glJAVaX2tbWBOr5j6CuTa0i8H6
R3wkNGYBs1EhgK1TiH3ng8UZtZmCW+IDLGcyxTEn/FDsDqi+GOOlE+TX4Pc5
qKdpEHBHizAkgteQDduQq+ATIIuLUstQPCySzlL5bTlBkBM4BpO4KAN01659
p6AVNYZJ0VHliXF342YsR88q2hR9xqVOYnWm1aUKAhsSKKMWdKd+EJiHNMtp
i4ahj+jF8JA9P29DPvk/592o+TyD1mgorY4FHTUif8kTHdRQa34l30crEBAg
qJJx+D0uJi3kCERoSgfajvUqfn5wGJdO8P8RyW//2ueK5rUq8lY5f25g1z7o
2+h+bmBPkLmIrrfLCV59314fuHHeZ+Xvb89Hj47+3btZ7p7Gu3XLk/LyfPNw
3Pyt3P9x9Vt5fnq4v/pJd2R9fcrVurfQx/fN/vjW++ejqH64ebx9wmnqHlK/
lOfn9UCtX29ua3m5e776ebzc66j8PB+heDv+Ou9A9P64o8J5jetWTcdR+fZw
t55B9ee6v//X/A9dwt3D758eTX8s8/n6qd3cDV3yeLx+/3A3rpfF3TY9J/TH
+9vz/p/nnfy++eofEqPMTEEoAQA=

-->

</rfc>
