<?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.6.13 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-frost-06" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="FROST">Two-Round Threshold Schnorr Signatures with FROST</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-frost-06"/>
    <author initials="D." surname="Connolly" fullname="Deirdre Connolly">
      <organization>Zcash Foundation</organization>
      <address>
        <email>durumcrustulum@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Komlo" fullname="Chelsea Komlo">
      <organization>University of Waterloo, Zcash Foundation</organization>
      <address>
        <email>ckomlo@uwaterloo.ca</email>
      </address>
    </author>
    <author initials="I." surname="Goldberg" fullname="Ian Goldberg">
      <organization>University of Waterloo</organization>
      <address>
        <email>iang@uwaterloo.ca</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2022" month="July" day="11"/>
    <area>General</area>
    <workgroup>CFRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>In this draft, we present the two-round signing variant of FROST, a Flexible Round-Optimized
Schnorr Threshold signature scheme. FROST signatures can be issued after a threshold number
of entities cooperate to issue a signature, allowing for improved distribution of trust and
redundancy with respect to a secret key. Further, this draft specifies signatures that are
compatible with <xref target="RFC8032"/>. However, unlike <xref target="RFC8032"/>, the protocol for producing
signatures in this draft is not deterministic, so as to ensure protection against a
key-recovery attack that is possible when even only one participant is malicious.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-frost"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>DISCLAIMER: This is a work-in-progress draft of FROST.</t>
      <t>RFC EDITOR: PLEASE REMOVE THE FOLLOWING PARAGRAPH The source for this draft is
maintained in GitHub. Suggested changes should be submitted as pull requests
at https://github.com/cfrg/draft-irtf-cfrg-frost. Instructions are on that page as
well.</t>
      <t>Unlike signatures in a single-party setting, threshold signatures
require cooperation among a threshold number of signers each holding a share
of a common private key. The security of threshold schemes in general assume
that an adversary can corrupt strictly fewer than a threshold number of participants.</t>
      <t>This document presents a variant of a Flexible Round-Optimized Schnorr Threshold (FROST)
signature scheme originally defined in <xref target="FROST20"/>. FROST reduces network overhead during
threshold signing operations while employing a novel technique to protect against forgery
attacks applicable to prior Schnorr-based threshold signature constructions. The variant of
FROST presented in this document requires two rounds to compute a signature. Single-round
signing with FROST is out of scope.</t>
      <t>For select ciphersuites, the signatures produced by this draft are compatible with
<xref target="RFC8032"/>. However, unlike <xref target="RFC8032"/>, signatures produced by FROST are not
deterministic, since deriving nonces deterministically allows for a complete key-recovery
attack in multi-party discrete logarithm-based signatures, such as FROST.</t>
      <t>While an optimization to FROST was shown in <xref target="Schnorr21"/> that reduces scalar multiplications
from linear in the number of signers to constant, this draft does not specify that optimization
due to the malleability that this optimization introduces, as shown in <xref target="StrongerSec22"/>.
Specifically, this optimization removes the guarantee that the set of signers that started
round one of the protocol is the same set of signers that produced the signature output by
round two.</t>
      <t>Key generation for FROST signing is out of scope for this document. However, for completeness,
key generation with a trusted dealer is specified in <xref target="dep-dealer"/>.</t>
      <section anchor="change-log">
        <name>Change Log</name>
        <t>draft-06</t>
        <ul spacing="normal">
          <li>Make verification a per-ciphersuite functionality (#219)</li>
          <li>Use per-signer values of rho to mitigate protocol malleability (#217)</li>
          <li>Correct prime-order subgroup checks (#215, #211)</li>
          <li>Fix bug in ed25519 ciphersuite description (#205)</li>
          <li>Various editorial improvements (#208, #209, #210, #218)</li>
        </ul>
        <t>draft-05</t>
        <ul spacing="normal">
          <li>Update test vectors to include version string (#202, #203)</li>
          <li>Rename THRESHOLD_LIMIT to MIN_SIGNERS (#192)</li>
          <li>Use non-contiguous signers for the test vectors (#187)</li>
          <li>Add more reasoning why the coordinator MUST abort (#183)</li>
          <li>Add a function to generate nonces (#182)</li>
          <li>Add MUST that all participants have the same view of VSS commitment (#174)</li>
          <li>Use THRESHOLD_LIMIT instead of t and MAX_SIGNERS instead of n (#171)</li>
          <li>Specify what the dealer is trusted to do (#166)</li>
          <li>Clarify types of NUM_SIGNERS and THRESHOLD_LIMIT (#165)</li>
          <li>Assert that the network channel used for signing should be authenticated (#163)</li>
          <li>Remove wire format section (#156)</li>
          <li>Update group commitment derivation to have a single scalarmul (#150)</li>
          <li>Use RandomNonzeroScalar for single-party Schnorr example (#148)</li>
          <li>Fix group notation and clarify member functions (#145)</li>
          <li>Update existing implementations table (#136)</li>
          <li>Various editorial improvements (#135, #143, #147, #149, #153, #158, #162, #167, #168, #169, #170, #175, #176, #177, #178, #184, #186, #193, #198, #199)</li>
        </ul>
        <t>draft-04</t>
        <ul spacing="normal">
          <li>Added methods to verify VSS commitments and derive group info (#126, #132).</li>
          <li>Changed check for participants to consider only nonnegative numbers (#133).</li>
          <li>Changed sampling for secrets and coefficients to allow the zero element (#130).</li>
          <li>Split test vectors into separate files (#129)</li>
          <li>Update wire structs to remove commitment shares where not necessary (#128)</li>
          <li>Add failure checks (#127)</li>
          <li>Update group info to include each participant's key and clarify how public key material is obtained (#120, #121).</li>
          <li>Define cofactor checks for verification (#118)</li>
          <li>Various editorial improvements and add contributors (#124, #123, #119, #116, #113, #109)</li>
        </ul>
        <t>draft-03</t>
        <ul spacing="normal">
          <li>Refactor the second round to use state from the first round (#94).</li>
          <li>Ensure that verification of signature shares from the second round uses commitments from the first round (#94).</li>
          <li>Clarify RFC8032 interoperability based on PureEdDSA (#86).</li>
          <li>Specify signature serialization based on element and scalar serialization (#85).</li>
          <li>Fix hash function domain separation formatting (#83).</li>
          <li>Make trusted dealer key generation deterministic (#104).</li>
          <li>Add additional constraints on participant indexes and nonce usage (#105, #103, #98, #97).</li>
          <li>Apply various editorial improvements.</li>
        </ul>
        <t>draft-02</t>
        <ul spacing="normal">
          <li>Fully specify both rounds of FROST, as well as trusted dealer key generation.</li>
          <li>Add ciphersuites and corresponding test vectors, including suites for RFC8032 compatibility.</li>
          <li>Refactor document for editorial clarity.</li>
        </ul>
        <t>draft-01</t>
        <ul spacing="normal">
          <li>Specify operations, notation and cryptographic dependencies.</li>
        </ul>
        <t>draft-00</t>
        <ul spacing="normal">
          <li>Outline CFRG draft based on draft-komlo-frost.</li>
        </ul>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <t>The following terminology is used throughout this document.</t>
      <ul spacing="normal">
        <li>A participant is an entity that is trusted to hold and use a signing key share.</li>
        <li>
          <tt>MAX_SIGNERS</tt> denotes the number of participants, and the number of shares that <tt>s</tt> is split into. This value MUST NOT exceed 2^16-1.</li>
        <li>
          <tt>MIN_SIGNERS</tt> denotes the threshold number of participants required to issue a signature, where MIN_SIGNERS &lt;= MAX_SIGNERS.</li>
        <li>
          <tt>NUM_SIGNERS</tt> denotes the number of signers that participate in an invocation of FROST signing, where
MIN_SIGNERS &lt;= NUM_SIGNERS &lt;= MAX_SIGNERS.</li>
        <li>An identifier is an integer value associated with a participant, or signer,
and is a value in the range [1, MAX_SIGNERS].</li>
      </ul>
      <t>Additionally, the following notation is used throughout the document.</t>
      <ul spacing="normal">
        <li>
          <tt>encode_uint16(x)</tt>: Convert two byte unsigned integer (uint16) <tt>x</tt> to a 2-byte,
big-endian byte string. For example, <tt>encode_uint16(310) = [0x01, 0x36]</tt>.</li>
        <li>
          <tt>random_bytes(n)</tt>: Outputs <tt>n</tt> bytes, sampled uniformly at random
using a cryptographically secure pseudorandom number generator (CSPRNG).</li>
        <li>
          <tt>len(l)</tt>: Outputs the length of input list <tt>l</tt>, e.g., <tt>len([1,2,3]) = 3)</tt>.</li>
        <li>
          <tt>reverse(l)</tt>: Outputs the list <tt>l</tt> in reverse order, e.g., <tt>reverse([1,2,3]) = [3,2,1]</tt>.</li>
        <li>
          <tt>range(a, b)</tt>: Outputs a list of integers from <tt>a</tt> to <tt>b-1</tt> in ascending order, e.g., <tt>range(1, 4) = [1,2,3]</tt>.</li>
        <li>
          <tt>pow(a, b)</tt>: Output the integer result of <tt>a</tt> to the power of <tt>b</tt>, e.g., <tt>pow(2, 3) = 8</tt>.</li>
        <li>|| denotes concatenation, i.e., x || y = xy.</li>
        <li>nil denotes an empty byte string.</li>
      </ul>
      <t>Unless otherwise stated, we assume that secrets are sampled uniformly at random
using a cryptographically secure pseudorandom number generator (CSPRNG); see
<xref target="RFC4086"/> for additional guidance on the generation of random numbers.</t>
    </section>
    <section anchor="cryptographic-dependencies">
      <name>Cryptographic Dependencies</name>
      <t>FROST signing depends on the following cryptographic constructs:</t>
      <ul spacing="normal">
        <li>Prime-order Group, <xref target="dep-pog"/>;</li>
        <li>Cryptographic hash function, <xref target="dep-hash"/>;</li>
      </ul>
      <t>These are described in the following sections.</t>
      <section anchor="dep-pog">
        <name>Prime-Order Group</name>
        <t>FROST depends on an abelian group of prime order <tt>p</tt>. We represent this
group as the object <tt>G</tt> that additionally defines helper functions described below. The group operation
for <tt>G</tt> is addition <tt>+</tt> with identity element <tt>I</tt>. For any elements <tt>A</tt> and <tt>B</tt> of the group <tt>G</tt>,
<tt>A + B = B + A</tt> is also a member of <tt>G</tt>. Also, for any <tt>A</tt> in <tt>G</tt>, there exists an element
<tt>-A</tt> such that <tt>A + (-A) = (-A) + A = I</tt>. For convenience, we use <tt>-</tt> to denote
subtraction, e.g., <tt>A - B = A + (-B)</tt>. Scalar multiplication is equivalent to the repeated
application of the group operation on an element A with itself <tt>r-1</tt> times, this is denoted
as <tt>r*A = A + ... + A</tt>. For any element <tt>A</tt>, <tt>p * A = I</tt>. We denote <tt>B</tt> as a fixed generator
of the group. Scalar base multiplication is equivalent to the repeated application of the group
operation <tt>B</tt> with itself <tt>r-1</tt> times, this is denoted as <tt>ScalarBaseMult(r)</tt>. The set of
scalars corresponds to <tt>GF(p)</tt>, which we refer to as the scalar field. This document uses types
<tt>Element</tt> and <tt>Scalar</tt> to denote elements of the group <tt>G</tt> and its set of scalars, respectively.
We denote equality comparison as <tt>==</tt> and assignment of values by <tt>=</tt>.</t>
        <t>We now detail a number of member functions that can be invoked on <tt>G</tt>.</t>
        <ul spacing="normal">
          <li>Order(): Outputs the order of <tt>G</tt> (i.e. <tt>p</tt>).</li>
          <li>Identity(): Outputs the identity <tt>Element</tt> of the group (i.e. <tt>I</tt>).</li>
          <li>RandomScalar(): Outputs a random <tt>Scalar</tt> element in GF(p).</li>
          <li>SerializeElement(A): Maps an <tt>Element</tt> <tt>A</tt> to a unique byte array <tt>buf</tt> of fixed length <tt>Ne</tt>.</li>
          <li>DeserializeElement(buf): Attempts to map a byte array <tt>buf</tt> to an <tt>Element</tt> <tt>A</tt>,
and fails if the input is not a valid byte representation of an element of
the group. This function can raise a DeserializeError if deserialization fails
or <tt>A</tt> is the identity element of the group; see <xref target="ciphersuites"/> for group-specific
input validation steps.</li>
          <li>SerializeScalar(s): Maps a Scalar <tt>s</tt> to a unique byte array <tt>buf</tt> of fixed length <tt>Ns</tt>.</li>
          <li>DeserializeScalar(buf): Attempts to map a byte array <tt>buf</tt> to a <tt>Scalar</tt> <tt>s</tt>.
This function can raise a DeserializeError if deserialization fails; see
<xref target="ciphersuites"/> for group-specific input validation steps.</li>
        </ul>
      </section>
      <section anchor="dep-hash">
        <name>Cryptographic Hash Function</name>
        <t>FROST requires the use of a cryptographically secure hash function, generically
written as H, which functions effectively as a random oracle. For concrete
recommendations on hash functions which SHOULD be used in practice, see
<xref target="ciphersuites"/>. Using H, we introduce four separate domain-separated hashes,
H1, H2, H3, and H4, where H1, H2, and H4 map arbitrary byte strings to Scalar elements of
the prime-order group scalar field, and H3 is an alias for H with a domain separator.
The details of H1, H2, H3, and H4 vary based on ciphersuite. See <xref target="ciphersuites"/>
for more details about each.</t>
      </section>
    </section>
    <section anchor="helpers">
      <name>Helper functions</name>
      <t>Beyond the core dependencies, the protocol in this document depends on the
following helper operations:</t>
      <ul spacing="normal">
        <li>Nonce generation, <xref target="dep-nonces"/></li>
        <li>Polynomial operations, <xref target="dep-polynomial"/>;</li>
        <li>Encoding operations, <xref target="dep-encoding"/>;</li>
        <li>Signature binding <xref target="dep-binding-factor"/>, group commitment <xref target="dep-group-commit"/>, and challenge computation <xref target="dep-sig-challenge"/></li>
      </ul>
      <t>These sections describes these operations in more detail.</t>
      <section anchor="dep-nonces">
        <name>Nonce generation</name>
        <t>To hedge against a bad RNG that outputs predictable values, we generate
nonces by sourcing fresh randomness and combine with the secret key,
to create a domain-separated hash function from the ciphersuite hash
function <tt>H</tt>, <tt>H4</tt>:</t>
        <artwork><![CDATA[
  nonce_generate(secret):

  Inputs:
  - secret, a Scalar

  Outputs: nonce, a Scalar

  def nonce_generate(secret):
    k_enc = random_bytes(32)
    secret_enc = G.SerializeScalar(secret)
    return H4(k_enc || secret_enc)
]]></artwork>
      </section>
      <section anchor="dep-polynomial">
        <name>Polynomial Operations</name>
        <t>This section describes operations on and associated with polynomials over Scalars
that are used in the main signing protocol. A polynomial of maximum degree t
is represented as a list of t coefficients, where the constant term of the polynomial
is in the first position and the highest-degree coefficient is in the last position.
A point on the polynomial is a tuple (x, y), where <tt>y = f(x)</tt>. For notational
convenience, we refer to the x-coordinate and y-coordinate of a
point p as <tt>p.x</tt> and <tt>p.y</tt>, respectively.</t>
        <section anchor="evaluation-of-a-polynomial">
          <name>Evaluation of a polynomial</name>
          <t>This section describes a method for evaluating a polynomial <tt>f</tt> at a
particular input <tt>x</tt>, i.e., <tt>y = f(x)</tt> using Horner's method.</t>
          <artwork><![CDATA[
  polynomial_evaluate(x, coeffs):

  Inputs:
  - x, input at which to evaluate the polynomial, a Scalar
  - coeffs, the polynomial coefficients, a list of Scalars

  Outputs: Scalar result of the polynomial evaluated at input x

  def polynomial_evaluate(x, coeffs):
    value = 0
    for coeff in reverse(coeffs):
      value *= x
      value += coeff
    return value
]]></artwork>
        </section>
        <section anchor="lagrange-coefficients">
          <name>Lagrange coefficients</name>
          <t>The function <tt>derive_lagrange_coefficient</tt> derives a Lagrange coefficient
to later perform polynomial interpolation, and is provided a list of x-coordinates
as input. Note that <tt>derive_lagrange_coefficient</tt> does not permit any x-coordinate
to equal 0. Lagrange coefficients are used in FROST to evaluate a polynomial <tt>f</tt>
at x-coordinate 0, i.e., <tt>f(0)</tt>, given a list of <tt>t</tt> other x-coordinates.</t>
          <artwork><![CDATA[
  derive_lagrange_coefficient(x_i, L):

  Inputs:
  - x_i, an x-coordinate contained in L, a Scalar
  - L, the set of x-coordinates, each a Scalar

  Outputs: L_i, the i-th Lagrange coefficient

  Errors:
  - "invalid parameters", if any x-coordinate is equal to 0 or if x_i
    is not in L

  def derive_lagrange_coefficient(x_i, L):
    if x_i == 0:
      raise "invalid parameters"
    for x_j in L:
      if x_j == 0:
        raise "invalid parameters"
    if x_i not in L:
      raise "invalid parameters"

    numerator = Scalar(1)
    denominator = Scalar(1)
    for x_j in L:
      if x_j == x_i: continue
      numerator *= x_j
      denominator *= x_j - x_i

    L_i = numerator / denominator
    return L_i
]]></artwork>
        </section>
        <section anchor="deriving-the-constant-term-of-a-polynomial">
          <name>Deriving the constant term of a polynomial</name>
          <t>Secret sharing requires "splitting" a secret, which is represented as
a constant term of some polynomial <tt>f</tt> of degree <tt>t-1</tt>. Recovering the
constant term occurs with a set of <tt>t</tt> points using polynomial
interpolation, defined as follows.</t>
          <artwork><![CDATA[
  Inputs:
  - points, a set of t points on a polynomial f, each a tuple of two
    Scalar values representing the x and y coordinates

  Outputs: The constant term of f, i.e., f(0)

  def polynomial_interpolation(points):
    L = []
    for point in points:
      L.append(point.x)

    f_zero = Scalar(0)
    for point in points:
      delta = point.y * derive_lagrange_coefficient(point.x, L)
      f_zero = f_zero + delta

    return f_zero
]]></artwork>
        </section>
      </section>
      <section anchor="dep-encoding">
        <name>List Operations</name>
        <t>This section describes a helper function for extracting signer participant
identifiers from a commitment list. It also describes a helper function
for extracting a given participant's binding factor from a list.</t>
        <t>The following function is used to extract participant identifiers from a commitment
list.</t>
        <artwork><![CDATA[
  Inputs:
  - commitment_list = [(i, hiding_nonce_commitment_i, binding_nonce_commitment_i), ...],
    a list of commitments issued by each signer, where each element in the list
    indicates the signer identifier i and their two commitment Element values
    (hiding_nonce_commitment_i, binding_nonce_commitment_i). This list MUST be sorted
    in ascending order by signer identifier.

  Outputs: A list of signer participant identifiers

def participants_from_commitment_list(commitment_list):
  identifiers = []
  for (identifier, _, _) in commitment_list:
    identifiers.append(identifier)
  return identifiers
]]></artwork>
        <t>The following function is used to extract a binding factor from a list of binding factors.</t>
        <artwork><![CDATA[
  Inputs:
  - binding_factor_list = [(i, binding_factor), ...],
    a list of binding factors for each signer, where each element in the list
    indicates the signer identifier i and their binding factor. This list MUST be sorted
    in ascending order by signer identifier.
  - identifier, Identifier i of the signer.

  Outputs: A Scalar value.

  Errors: "invalid participant", when the designated participant is not known

def binding_factor_for_participant(binding_factor_list, identifier):
  binding_factors = []
  for (i, binding_factor) in commitment_list:
    if identifier == i:
      return binding_factor
  raise "invalid participant"
]]></artwork>
      </section>
      <section anchor="dep-binding-factor">
        <name>Binding Factors Computation</name>
        <t>This section describes the subroutine for computing binding factors based
on the signer commitment list and message to be signed.</t>
        <artwork><![CDATA[
  Inputs:
  - commitment_list = [(i, hiding_nonce_commitment_i, binding_nonce_commitment_i), ...],
    a list of commitments issued by each signer, where each element in the list
    indicates the signer identifier i and their two commitment Element values
    (hiding_nonce_commitment_i, binding_nonce_commitment_i). This list MUST be sorted
    in ascending order by signer identifier.
  - msg, the message to be signed.

  Outputs: A list of (identifier, Scalar) tuples representing the binding factors.

  def compute_binding_factors(commitment_list, msg):
    msg_hash = H3(msg)
    binding_factor_list = []
    for (identifier, hiding_nonce_commitment, binding_nonce_commitment) in commitment_list:
      encoded_commitment = encode_uint16(identifier) ||
                           G.SerializeElement(hiding_nonce_commitment) ||
                           G.SerializeElement(binding_nonce_commitment)
      rho_input = encoded_commitment + msg_hash
      binding_factor = H1(rho_input)
      binding_factor_list.append((identifier, binding_factor))
    return binding_factor_list
]]></artwork>
      </section>
      <section anchor="dep-group-commit">
        <name>Group Commitment Computation</name>
        <t>This section describes the subroutine for creating the group commitment
from a commitment list.</t>
        <artwork><![CDATA[
  Inputs:
  - commitment_list =
     [(i, hiding_nonce_commitment_i, binding_nonce_commitment_i), ...], a list
    of commitments issued by each signer, where each element in the list
    indicates the signer identifier i and their two commitment Element values
    (hiding_nonce_commitment_i, binding_nonce_commitment_i). This list MUST be
    sorted in ascending order by signer identifier.
  - binding_factor_list = [(i, binding_factor), ...],
    a list of (identifier, Scalar) tuples representing the binding factor Scalar
    for the given identifier. This list MUST be sorted in ascending order by identifier.

  Outputs: An Element in G representing the group commitment

  def compute_group_commitment(commitment_list, binding_factor_list):
    group_commitment = G.Identity()
    for (identifier, hiding_nonce_commitment, binding_nonce_commitment) in commitment_list:
      binding_factor = binding_factor_for_participant(binding_factors, identifier)
      group_commitment = group_commitment +
        (hiding_nonce_commitment + (binding_factor * binding_nonce_commitment))
    return group_commitment
]]></artwork>
      </section>
      <section anchor="dep-sig-challenge">
        <name>Signature Challenge Computation</name>
        <t>This section describes the subroutine for creating the per-message challenge.</t>
        <artwork><![CDATA[
  Inputs:
  - group_commitment, an Element in G representing the group commitment
  - group_public_key, public key corresponding to the group signing key, an
    Element in G.
  - msg, the message to be signed.

  Outputs: A Scalar representing the challenge

  def compute_challenge(group_commitment, group_public_key, msg):
    group_comm_enc = G.SerializeElement(group_commitment)
    group_public_key_enc = G.SerializeElement(group_public_key)
    challenge_input = group_comm_enc || group_public_key_enc || msg
    challenge = H2(challenge_input)
    return challenge
]]></artwork>
      </section>
    </section>
    <section anchor="frost-spec">
      <name>Two-Round FROST Signing Protocol</name>
      <t>We now present the two-round variant of the FROST threshold signature protocol for producing Schnorr signatures.
It involves signer participants and a Coordinator. Signer participants are
entities with signing key shares that participate in the threshold signing
protocol. The Coordinator is an entity with the following responsibilities:</t>
      <ol spacing="normal" type="1"><li>Determining which signers will participate (at least MIN_SIGNERS in number);</li>
        <li>Coordinating rounds (receiving and forwarding inputs among participants); and</li>
        <li>Aggregating signature shares output by each participant, and publishing the resulting signature.</li>
      </ol>
      <t>FROST assumes the selection of all participants, including Coordinator and set of
signers, are all chosen external to the protocol. Note that it is possible to
deploy the protocol without a distinguished Coordinator; see <xref target="no-coordinator"/>
for more information.</t>
      <t>Because key generation is not specified, all signers are assumed to have the (public) group state that we refer to as "group info"
below, and their corresponding signing key shares.</t>
      <t>In particular, it is assumed that the Coordinator and each signer participant <tt>P_i</tt> knows the following
group info:</t>
      <ul spacing="normal">
        <li>Group public key, an <tt>Element</tt> in <tt>G</tt>, denoted <tt>PK</tt>, corresponding
to the group secret key <tt>s</tt>, which is a <tt>Scalar</tt>. <tt>PK</tt> is an output from the group's key generation protocol, such as <tt>trusted_dealer_keygen</tt> or a DKG.</li>
        <li>Public keys for each signer, denoted <tt>PK_i</tt>, which are similarly outputs
from the group's key generation protocol, <tt>Element</tt> values in <tt>G</tt>.</li>
      </ul>
      <t>And that each participant with identifier <tt>i</tt> additionally knows the following:</t>
      <ul spacing="normal">
        <li>Participant <tt>i</tt>s signing key share <tt>sk_i</tt>, which is the i-th secret share of <tt>s</tt>, a <tt>Scalar</tt>.</li>
      </ul>
      <t>By construction, <tt>PK = G.ScalarBaseMult(s)</tt> and <tt>PK_i = G.ScalarMultBase(sk_i)</tt> for each participant <tt>i</tt>.</t>
      <t>The exact key generation mechanism is out of scope for this specification. In general,
key generation is a protocol that outputs (1) a shared, group public key PK owned
by each Signer, and (2) individual shares of the signing key owned by each Signer.
In general, two possible key generation mechanisms are possible, one that requires
a single, trusted dealer, and the other which requires performing a distributed
key generation protocol. We highlight key generation mechanism by a trusted dealer
in <xref target="dep-dealer"/>, for reference.</t>
      <t>This signing variant of FROST requires signers to perform two network rounds:
1) generating and publishing commitments, and 2) signature share generation and
publication. The first round serves for each participant to issue a commitment to
a nonce. The second round receives commitments for all signers as well as the message,
and issues a signature share with respect to that message. The Coordinator performs
the coordination of each of these rounds. At the end of the second round, the
Coordinator then performs an aggregation step and outputs the final signature.
This complete interaction is shown in <xref target="fig-frost"/>.</t>
      <figure anchor="fig-frost">
        <name>FROST signature overview</name>
        <artwork><![CDATA[
        (group info)            (group info,     (group info,
            |               signing key share)   signing key share)
            |                         |                |
            v                         v                v
        Coordinator               Signer-1   ...   Signer-n
    ------------------------------------------------------------
   message
------------>
            |
      == Round 1 (Commitment) ==
            |    signer commitment   |                 |
            |<-----------------------+                 |
            |          ...                             |
            |    signer commitment                     |
            |<-----------------------------------------+

      == Round 2 (Signature Share Generation) ==
            |
            |     signer input       |                 |
            +------------------------>                 |
            |     signature share    |                 |
            |<-----------------------+                 |
            |          ...                             |
            |     signer input                         |
            +------------------------------------------>
            |     signature share                      |
            <------------------------------------------+
            |
      == Aggregation ==
            |
  signature |
<-----------+
]]></artwork>
      </figure>
      <t>Details for round one are described in <xref target="frost-round-one"/>, and details for round two
are described in <xref target="frost-round-two"/>. The final Aggregation step is described in
<xref target="frost-aggregation"/>.</t>
      <t>FROST assumes that all inputs to each round, especially those of which are received
over the network, are validated before use. In particular, this means that any value
of type Element or Scalar is deserialized using DeserializeElement and DeserializeScalar,
respectively, as these functions perform the necessary input validation steps.</t>
      <t>FROST assumes reliable message delivery between the Coordinator and signer participants in
order for the protocol to complete. An attacker masquerading as another participant
will result only in an invalid signature; see <xref target="sec-considerations"/>. However, in order
to identify any participant which has misbehaved (resulting in the protocol aborting)
to take actions such as excluding them from future signing operations, we assume that
the network channel is additionally authenticated; confidentiality is not required.</t>
      <section anchor="frost-round-one">
        <name>Round One - Commitment</name>
        <t>Round one involves each signer generating nonces and their corresponding public commitments.
A nonce is a pair of Scalar values, and a commitment is a pair of Element values.</t>
        <t>Each signer in round one generates a nonce <tt>nonce = (hiding_nonce, binding_nonce)</tt> and commitment
<tt>comm = (hiding_nonce_commitment, binding_nonce_commitment)</tt>.</t>
        <artwork><![CDATA[
  Inputs: sk_i, the secret key share, a Scalar

  Outputs: (nonce, comm), a tuple of nonce and nonce commitment pairs,
    where each value in the nonce pair is a Scalar and each value in
    the nonce commitment pair is an Element

  def commit(sk_i):
    hiding_nonce = nonce_generate(sk_i)
    binding_nonce = nonce_generate(sk_i)
    hiding_nonce_commitment = G.ScalarBaseMult(hiding_nonce)
    binding_nonce_commitment = G.ScalarBaseMult(binding_nonce)
    nonce = (hiding_nonce, binding_nonce)
    comm = (hiding_nonce_commitment, binding_nonce_commitment)
    return (nonce, comm)
]]></artwork>
        <t>The private output <tt>nonce</tt> from Participant <tt>P_i</tt> is stored locally and kept private
for use in the second round. This nonce MUST NOT be reused in more than one invocation
of FROST, and it MUST be generated from a source of secure randomness. The public output
<tt>comm</tt> from Participant <tt>P_i</tt> is sent to the Coordinator.</t>
        <!-- The Coordinator must not get confused about which commitments come from which signers, do we need to say more about how this is done? -->

</section>
      <section anchor="frost-round-two">
        <name>Round Two - Signature Share Generation</name>
        <t>In round two, the Coordinator is responsible for sending the message to be signed, and
for choosing which signers will participate (of number at least MIN_SIGNERS). Signers
additionally require locally held data; specifically, their private key and the
nonces corresponding to their commitment issued in round one.</t>
        <t>The Coordinator begins by sending each signer the message to be signed along with the
set of signing commitments for all signers in the participant list. Each signer
MUST validate the inputs before processing the Coordinator's request. In particular,
the Signer MUST validate commitment_list, deserializing each group Element in the
list using DeserializeElement from <xref target="dep-pog"/>. If deserialization fails, the Signer
MUST abort the protocol. Moreover, each signer MUST ensure that their identifier as well as their commitment as from the first round appears in commitment_list.
Applications which require that signers not process arbitrary
input messages are also required to also perform relevant application-layer input
validation checks; see <xref target="message-validation"/> for more details.</t>
        <t>Upon receipt and successful input validation, each Signer then runs the following
procedure to produce its own signature share.</t>
        <artwork><![CDATA[
  Inputs:
  - identifier, Identifier i of the signer. Note identifier will never equal 0.
  - sk_i, Signer secret key share, a Scalar.
  - group_public_key, public key corresponding to the group signing key,
    an Element in G.
  - nonce_i, pair of Scalar values (hiding_nonce, binding_nonce) generated in
    round one.
  - msg, the message to be signed (sent by the Coordinator).
  - commitment_list =
      [(j, hiding_nonce_commitment_j, binding_nonce_commitment_j), ...], a
    list of commitments issued in Round 1 by each signer and sent by the Coordinator.
    Each element in the list indicates the signer identifier j and their two commitment
    Element values (hiding_nonce_commitment_j, binding_nonce_commitment_j).
    This list MUST be sorted in ascending order by signer identifier.

  Outputs: a Scalar value representing the signature share

  def sign(identifier, sk_i, group_public_key, nonce_i, msg, commitment_list):
    # Compute the binding factor(s)
    binding_factor_list = compute_binding_factors(commitment_list, msg)
    binding_factor = binding_factor_for_participant(binding_factor_list, identifier)

    # Compute the group commitment
    group_commitment = compute_group_commitment(commitment_list, binding_factor_list)

    # Compute Lagrange coefficient
    participant_list = participants_from_commitment_list(commitment_list)
    lambda_i = derive_lagrange_coefficient(identifier, participant_list)

    # Compute the per-message challenge
    challenge = compute_challenge(group_commitment, group_public_key, msg)

    # Compute the signature share
    (hiding_nonce, binding_nonce) = nonce_i
    sig_share = hiding_nonce + (binding_nonce * binding_factor) + (lambda_i * sk_i * challenge)

    return sig_share
]]></artwork>
        <t>The output of this procedure is a signature share. Each signer then sends
these shares back to the Coordinator. Each signer MUST delete the nonce and
corresponding commitment after this round completes, and MUST use the nonce to generate at most one
signature share.</t>
        <t>Note that the <tt>lambda_i</tt> value derived during this procedure does not change
across FROST signing operations for the same signing group. As such, signers
can compute it once and store it for reuse across signing sessions.</t>
        <t>Upon receipt from each Signer, the Coordinator MUST validate the input
signature share using DeserializeElement. If validation fails, the Coordinator MUST abort
the protocol. If validation succeeds, the Coordinator then verifies the set of
signature shares using the following procedure.</t>
      </section>
      <section anchor="frost-aggregation">
        <name>Signature Share Verification and Aggregation</name>
        <t>After signers perform round two and send their signature shares to the Coordinator,
the Coordinator verifies each signature share for correctness. In particular,
for each signer, the Coordinator uses commitment pairs generated during round
one and the signature share generated during round two, along with other group
parameters, to check that the signature share is valid using the following procedure.</t>
        <artwork><![CDATA[
  Inputs:
  - identifier, Identifier i of the signer. Note identifier will never equal 0.
  - PK_i, the public key for the ith signer, where PK_i = G.ScalarBaseMult(sk_i),
    an Element in G
  - comm_i, pair of Element values in G (hiding_nonce_commitment, binding_nonce_commitment)
    generated in round one from the ith signer.
  - sig_share_i, a Scalar value indicating the signature share as produced in
    round two from the ith signer.
  - commitment_list =
      [(j, hiding_nonce_commitment_j, binding_nonce_commitment_j), ...], a
    list of commitments issued in Round 1 by each signer, where each element
    in the list indicates the signer identifier j and their two commitment
    Element values (hiding_nonce_commitment_j, binding_nonce_commitment_j).
    This list MUST be sorted in ascending order by signer identifier.
  - group_public_key, public key corresponding to the group signing key,
    an Element in G.
  - msg, the message to be signed.

  Outputs: True if the signature share is valid, and False otherwise.

  def verify_signature_share(identifier, PK_i, comm_i, sig_share_i, commitment_list,
                             group_public_key, msg):
    # Compute the binding factors
    binding_factor_list = compute_binding_factors(commitment_list, msg)
    binding_factor = binding_factor_for_participant(binding_factor_list, identifier)

    # Compute the group commitment
    group_commitment = compute_group_commitment(commitment_list, binding_factor_list)

    # Compute the commitment share
    (hiding_nonce_commitment, binding_nonce_commitment) = comm_i
    comm_share = hiding_nonce_commitment + (binding_nonce_commitment * binding_factor)

    # Compute the challenge
    challenge = compute_challenge(group_commitment, group_public_key, msg)

    # Compute Lagrange coefficient
    participant_list = participants_from_commitment_list(commitment_list)
    lambda_i = derive_lagrange_coefficient(identifier, participant_list)

    # Compute relation values
    l = G.ScalarBaseMult(sig_share_i)
    r = comm_share + ((challenge * lambda_i) * PK_i)

    return l == r
]]></artwork>
        <t>If any signature share fails to verify, i.e., if verify_signature_share returns False for
any signer share, the Coordinator MUST abort the protocol for correctness reasons.
Excluding one signer means that their nonce will not be included in the joint response <tt>z</tt>
and consequently the output signature will not verify.</t>
        <t>Otherwise, if all signer shares are valid, the Coordinator performs the <tt>aggregate</tt> operation
and publishes the resulting signature.</t>
        <artwork><![CDATA[
  Inputs:
  - group_commitment, the group commitment returned by compute_group_commitment,
    an Element in G.
  - sig_shares, a set of signature shares z_i, Scalar values, for each signer,
    of length NUM_SIGNERS, where MIN_SIGNERS <= NUM_SIGNERS <= MAX_SIGNERS.

  Outputs: (R, z), a Schnorr signature consisting of an Element R and Scalar z.

  def aggregate(group_commitment, sig_shares):
    z = 0
    for z_i in sig_shares:
      z = z + z_i
    return (group_commitment, z)
]]></artwork>
        <t>The output signature (R, z) from the aggregation step MUST be encoded as follows
(using notation from <xref section="3" sectionFormat="of" target="TLS"/>):</t>
        <artwork><![CDATA[
  struct {
    opaque R_encoded[Ne];
    opaque z_encoded[Ns];
  } Signature;
]]></artwork>
        <t>Where Signature.R_encoded is <tt>G.SerializeElement(R)</tt> and Signature.z_encoded is
<tt>G.SerializeScalar(z)</tt>.</t>
      </section>
    </section>
    <section anchor="ciphersuites">
      <name>Ciphersuites</name>
      <t>A FROST ciphersuite must specify the underlying prime-order group details
and cryptographic hash function. Each ciphersuite is denoted as (Group, Hash),
e.g., (ristretto255, SHA-512). This section contains some ciphersuites.</t>
      <t>The RECOMMENDED ciphersuite is (ristretto255, SHA-512) <xref target="recommended-suite"/>.
The (Ed25519, SHA-512) ciphersuite is included for backwards compatibility
with <xref target="RFC8032"/>.</t>
      <t>The DeserializeElement and DeserializeScalar functions instantiated for a
particular prime-order group corresponding to a ciphersuite MUST adhere
to the description in <xref target="dep-pog"/>. Validation steps for these functions
are described for each the ciphersuites below. Future ciphersuites MUST
describe how input validation is done for DeserializeElement and DeserializeScalar.</t>
      <t>Each ciphersuite includes explicit instructions for verifying signatures produced
by FROST. Note that these instructions are equivalent to those produced by a single
signer.</t>
      <section anchor="frosted25519-sha-512">
        <name>FROST(Ed25519, SHA-512)</name>
        <t>This ciphersuite uses edwards25519 for the Group and SHA-512 for the Hash function <tt>H</tt>
meant to produce signatures indistinguishable from Ed25519 as specified in <xref target="RFC8032"/>.
The value of the contextString parameter is empty.</t>
        <ul spacing="normal">
          <li>
            <t>Group: edwards25519 <xref target="RFC8032"/>
            </t>
            <ul spacing="normal">
              <li>Order: 2^252 + 27742317777372353535851937790883648493 (see <xref target="RFC7748"/>)</li>
              <li>Identity: As defined in <xref target="RFC7748"/>.</li>
              <li>RandomScalar: Implemented by repeatedly generating a random 32-byte string
and invoking DeserializeScalar on the result until success.</li>
              <li>SerializeElement: Implemented as specified in <xref section="5.1.2" sectionFormat="comma" target="RFC8032"/>.</li>
              <li>DeserializeElement: Implemented as specified in <xref section="5.1.3" sectionFormat="comma" target="RFC8032"/>.
Additionally, this function validates that the resulting element is not the group
identity element and is in the prime-order subgroup. The latter check can
be implemented by multiplying the resulting point by the order of the group and
checking that the result is the identity element.</li>
              <li>SerializeScalar: Implemented by outputting the little-endian 32-byte encoding of
the Scalar value.</li>
              <li>DeserializeScalar: Implemented by attempting to deserialize a Scalar from a 32-byte
string. This function can fail if the input does not represent a Scalar between
the value 0 and <tt>G.Order() - 1</tt>.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-512, and Nh = 64.
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented by computing H("rho" || m), interpreting the 64-byte digest
as a little-endian integer, and reducing the resulting integer modulo
L = 2^252+27742317777372353535851937790883648493.</li>
              <li>H2(m): Implemented by computing H(m), interpreting the 64-byte digest
as a little-endian integer, and reducing the resulting integer modulo
L = 2^252+27742317777372353535851937790883648493.</li>
              <li>H3(m): Implemented as an alias for H, i.e., H(m).</li>
              <li>H4(m): Implemented by computing H("nonce" || m), interpreting the 64-byte digest
as a little-endian integer, and reducing the resulting integer modulo
L = 2^252+27742317777372353535851937790883648493.</li>
            </ul>
          </li>
        </ul>
        <t>Normally H2 would also include a domain separator, but for backwards compatibility
with <xref target="RFC8032"/>, it is omitted.</t>
        <t>Signature verification is as specified in <xref section="5.1.7" sectionFormat="of" target="RFC8032"/> with the
constraint that implementations MUST check the group group equation [8][S]B = [8]R + [8][k]A'.
The alternative check [S]B = R + [k]A' is not safe or interoperable in practice.</t>
      </section>
      <section anchor="recommended-suite">
        <name>FROST(ristretto255, SHA-512)</name>
        <t>This ciphersuite uses ristretto255 for the Group and SHA-512 for the Hash function <tt>H</tt>.
The value of the contextString parameter is "FROST-RISTRETTO255-SHA512-v5".</t>
        <ul spacing="normal">
          <li>
            <t>Group: ristretto255 <xref target="RISTRETTO"/>
            </t>
            <ul spacing="normal">
              <li>Order: 2^252 + 27742317777372353535851937790883648493 (see <xref target="RISTRETTO"/>)</li>
              <li>Identity: As defined in <xref target="RISTRETTO"/>.</li>
              <li>RandomScalar: Implemented by repeatedly generating a random 32-byte string and
invoking DeserializeScalar on the result until success.</li>
              <li>SerializeElement: Implemented using the 'Encode' function from <xref target="RISTRETTO"/>.</li>
              <li>DeserializeElement: Implemented using the 'Decode' function from <xref target="RISTRETTO"/>.</li>
              <li>SerializeScalar: Implemented by outputting the little-endian 32-byte encoding of
the Scalar value.</li>
              <li>DeserializeScalar: Implemented by attempting to deserialize a Scalar from a 32-byte
string. This function can fail if the input does not represent a Scalar between
the value 0 and <tt>G.Order() - 1</tt>.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-512, and Nh = 64.
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented by computing H(contextString || "rho" || m) and mapping the
output to a Scalar as described in <xref section="4.4" sectionFormat="comma" target="RISTRETTO"/>.</li>
              <li>H2(m): Implemented by computing H(contextString || "chal" || m) and mapping the
output to a Scalar as described in <xref section="4.4" sectionFormat="comma" target="RISTRETTO"/>.</li>
              <li>H3(m): Implemented by computing H(contextString || "digest" || m).</li>
              <li>H4(m): Implemented by computing H(contextString || "nonce" || m) and mapping the
output to a Scalar as described in <xref section="4.4" sectionFormat="comma" target="RISTRETTO"/>.</li>
            </ul>
          </li>
        </ul>
        <t>Signature verification is as specified in <xref target="prime-order-verify"/>.</t>
      </section>
      <section anchor="frosted448-shake256">
        <name>FROST(Ed448, SHAKE256)</name>
        <t>This ciphersuite uses edwards448 for the Group and SHAKE256 for the Hash function <tt>H</tt>
meant to produce signatures indistinguishable from Ed448 as specified in <xref target="RFC8032"/>.
The value of the contextString parameter is empty.</t>
        <ul spacing="normal">
          <li>
            <t>Group: edwards448 <xref target="RFC8032"/>
            </t>
            <ul spacing="normal">
              <li>Order: 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885</li>
              <li>Identity: As defined in <xref target="RFC7748"/>.</li>
              <li>RandomScalar: Implemented by repeatedly generating a random 48-byte string and
invoking DeserializeScalar on the result until success.</li>
              <li>SerializeElement: Implemented as specified in <xref section="5.2.2" sectionFormat="comma" target="RFC8032"/>.</li>
              <li>DeserializeElement: Implemented as specified in <xref section="5.2.3" sectionFormat="comma" target="RFC8032"/>.
Additionally, this function validates that the resulting element is not the group
identity element.</li>
              <li>SerializeScalar: Implemented by outputting the little-endian 48-byte encoding of
the Scalar value.</li>
              <li>DeserializeScalar: Implemented by attempting to deserialize a Scalar from a 48-byte
string. This function can fail if the input does not represent a Scalar between
the value 0 and <tt>G.Order() - 1</tt>.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHAKE256, and Nh = 114.
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented by computing H("rho" || m), interpreting the lower
57 bytes as a little-endian integer, and reducing the resulting integer modulo
L = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
              <li>H2(m): Implemented by computing H(m), interpreting the lower 57 bytes
as a little-endian integer, and reducing the resulting integer modulo
L = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
              <li>H3(m): Implemented as an alias for H, i.e., H(m).</li>
              <li>H4(m): Implemented by computing H("nonce" || m), interpreting the lower
57 bytes as a little-endian integer, and reducing the resulting integer modulo
L = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
            </ul>
          </li>
        </ul>
        <t>Normally H2 would also include a domain separator, but for backwards compatibility
with <xref target="RFC8032"/>, it is omitted.</t>
        <t>Signature verification is as specified in <xref section="5.2.7" sectionFormat="of" target="RFC8032"/> with the
constraint that implementations MUST check the group group equation [4][S]B = [4]R + [4][k]A'.
The alternative check [S]B = R + [k]A' is not safe or interoperable in practice.</t>
      </section>
      <section anchor="frostp-256-sha-256">
        <name>FROST(P-256, SHA-256)</name>
        <t>This ciphersuite uses P-256 for the Group and SHA-256 for the Hash function <tt>H</tt>.
The value of the contextString parameter is "FROST-P256-SHA256-v5".</t>
        <ul spacing="normal">
          <li>
            <t>Group: P-256 (secp256r1) <xref target="x9.62"/>
            </t>
            <ul spacing="normal">
              <li>Order: 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551</li>
              <li>Identity: As defined in <xref target="x9.62"/>.</li>
              <li>RandomScalar: Implemented by repeatedly generating a random 32-byte string
and invoking DeserializeScalar on the result until success.</li>
              <li>SerializeElement: Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SECG"/>.</li>
              <li>DeserializeElement: Implemented by attempting to deserialize a public key using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SECG"/>,
and then performs partial public-key validation as defined in section 5.6.2.3.4 of
<xref target="KEYAGREEMENT"/>. This includes checking that the
coordinates of the resulting point are in the correct range, that the point is on
the curve, and that the point is not the point at infinity. Additionally, this function
validates that the resulting element is not the group identity element.
If these checks fail, deserialization returns an error.</li>
              <li>SerializeScalar: Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SECG"/>.</li>
              <li>DeserializeScalar: Implemented by attempting to deserialize a Scalar from a 32-byte
string using Octet-String-to-Field-Element from <xref target="SECG"/>. This function can fail if the
input does not represent a Scalar between the value 0 and <tt>G.Order() - 1</tt>.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-256, and Nh = 32.
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented using hash_to_field from <xref section="5.3" sectionFormat="comma" target="HASH-TO-CURVE"/>
using L = 48, <tt>expand_message_xmd</tt> with SHA-256, DST = contextString || "rho", and
prime modulus equal to <tt>Order()</tt>.</li>
              <li>H2(m): Implemented using hash_to_field from <xref section="5.3" sectionFormat="comma" target="HASH-TO-CURVE"/>
using L = 48, <tt>expand_message_xmd</tt> with SHA-256, DST = contextString || "chal", and
prime modulus equal to <tt>Order()</tt>.</li>
              <li>H3(m): Implemented by computing H(contextString || "digest" || m).</li>
              <li>H4(m): Implemented using hash_to_field from <xref section="5.3" sectionFormat="comma" target="HASH-TO-CURVE"/>
using L = 48, <tt>expand_message_xmd</tt> with SHA-256, DST = contextString || "nonce", and
prime modulus equal to <tt>Order()</tt>.</li>
            </ul>
          </li>
        </ul>
        <t>Signature verification is as specified in <xref target="prime-order-verify"/>.</t>
      </section>
    </section>
    <section anchor="sec-considerations">
      <name>Security Considerations</name>
      <t>A security analysis of FROST exists in <xref target="FROST20"/> and <xref target="Schnorr21"/>. The protocol as specified
in this document assumes the following threat model.</t>
      <ul spacing="normal">
        <li>Trusted dealer. The dealer that performs key generation is trusted to follow
the protocol, although participants still are able to verify the consistency of their
shares via a VSS (verifiable secret sharing) step; see <xref target="dep-vss"/>.</li>
        <li>Unforgeability assuming at most <tt>(MIN_SIGNERS-1)</tt> corrupted signers. So long as an adversary
corrupts fewer than <tt>MIN_SIGNERS</tt> participants, the scheme remains secure against Existential
Unforgeability Under Chosen Message Attack (EUF-CMA) attacks, as defined in <xref target="BonehShoup"/>,
Definition 13.2.</li>
        <li>Coordinator. We assume the Coordinator at the time of signing does not perform a
denial of service attack. A denial of service would include any action which either
prevents the protocol from completing or causing the resulting signature to be invalid.
Such actions for the latter include sending inconsistent values to signer participants,
such as messages or the set of individual commitments. Note that the Coordinator
is <em>not</em> trusted with any private information and communication at the time of signing
can be performed over a public but reliable channel.</li>
      </ul>
      <t>The protocol as specified in this document does not target the following goals:</t>
      <ul spacing="normal">
        <li>Post quantum security. FROST, like plain Schnorr signatures, requires the hardness of the Discrete Logarithm Problem.</li>
        <li>Robustness. In the case of failure, FROST requires aborting the protocol.</li>
        <li>Downgrade prevention. All participants in the protocol are assumed to agree on what algorithms to use.</li>
        <li>Metadata protection. If protection for metadata is desired, a higher-level communication
channel can be used to facilitate key generation and signing.</li>
      </ul>
      <t>The rest of this section documents issues particular to implementations or deployments.</t>
      <section anchor="nonce-reuse-attacks">
        <name>Nonce Reuse Attacks</name>
        <t>Nonces generated by each participant in the first round of signing must be sampled
uniformly at random and cannot be derived from some deterministic function. This
is to avoid replay attacks initiated by other signers, which allows for a complete
key-recovery attack. The Coordinator MAY further hedge against nonce reuse attacks by
tracking signer nonce commitments used for a given group key, at the cost of additional
state.</t>
      </section>
      <section anchor="protocol-failures">
        <name>Protocol Failures</name>
        <t>We do not specify what implementations should do when the protocol fails, other than requiring that
the protocol abort. Examples of viable failure include when a verification check returns invalid or
if the underlying transport failed to deliver the required messages.</t>
      </section>
      <section anchor="no-coordinator">
        <name>Removing the Coordinator Role</name>
        <t>In some settings, it may be desirable to omit the role of the Coordinator entirely.
Doing so does not change the security implications of FROST, but instead simply
requires each participant to communicate with all other participants. We loosely
describe how to perform FROST signing among signers without this coordinator role.
We assume that every participant receives as input from an external source the
message to be signed prior to performing the protocol.</t>
        <t>Every participant begins by performing <tt>commit()</tt> as is done in the setting
where a Coordinator is used. However, instead of sending the commitment
to the Coordinator, every participant instead will publish
this commitment to every other participant. Then, in the second round, signers will already have
sufficient information to perform signing. They will directly perform <tt>sign</tt>.
All participants will then publish their signature shares to one another. After having
received all signature shares from all other signers, each signer will then perform
<tt>verify_signature_share</tt> and then <tt>aggregate</tt> directly.</t>
        <t>The requirements for the underlying network channel remain the same in the setting
where all participants play the role of the Coordinator, in that all messages that
are exchanged are public and so the channel simply must be reliable. However, in
the setting that a player attempts to split the view of all other players by
sending disjoint values to a subset of players, the signing operation will output
an invalid signature. To avoid this denial of service, implementations may wish
to define a mechanism where messages are authenticated, so that cheating players
can be identified and excluded.</t>
      </section>
      <section anchor="message-validation">
        <name>Input Message Validation</name>
        <t>Some applications may require that signers only process messages of a certain
structure. For example, in digital currency applications wherein multiple
signers may collectively sign a transaction, it is reasonable to require that
each signer check the input message to be a syntactically valid transaction.
As another example, use of threshold signatures in TLS <xref target="TLS"/> to produce
signatures of transcript hashes might require that signers check that the input
message is a valid TLS transcript from which the corresponding transcript hash
can be derived.</t>
        <t>In general, input message validation is an application-specific consideration
that varies based on the use case and threat model. However, it is RECOMMENDED
that applications take additional precautions and validate inputs so that signers
do not operate as signing oracles for arbitrary messages.</t>
      </section>
    </section>
    <section anchor="contributors">
      <name>Contributors</name>
      <ul spacing="normal">
        <li>Isis Lovecruft</li>
        <li>T. Wilson-Brown</li>
        <li>Alden Torres</li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="x9.62">
          <front>
            <title>Public Key Cryptography for the Financial Services Industry: the Elliptic Curve Digital Signature Algorithm (ECDSA)</title>
            <author>
              <organization>ANSI</organization>
            </author>
            <date year="1998" month="September"/>
          </front>
          <seriesInfo name="ANSI" value="X9.62-1998"/>
        </reference>
        <reference anchor="SECG" target="https://secg.org/sec1-v2.pdf">
          <front>
            <title>Elliptic Curve Cryptography, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2009"/>
          </front>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson">
              <organization/>
            </author>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara">
              <organization/>
            </author>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA).  The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves.  An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RISTRETTO">
          <front>
            <title>The ristretto255 and decaf448 Groups</title>
            <author fullname="Henry de Valence">
	 </author>
            <author fullname="Jack Grigg">
	 </author>
            <author fullname="Mike Hamburg">
	 </author>
            <author fullname="Isis Lovecruft">
	 </author>
            <author fullname="George Tankersley">
	 </author>
            <author fullname="Filippo Valsorda">
	 </author>
            <date day="25" month="February" year="2022"/>
            <abstract>
              <t>   This memo specifies two prime-order groups, ristretto255 and
   decaf448, suitable for safely implementing higher-level and complex
   cryptographic protocols.  The ristretto255 group can be implemented
   using Curve25519, allowing existing Curve25519 implementations to be
   reused and extended to provide a prime-order group.  Likewise, the
   decaf448 group can be implemented using edwards448.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-ristretto255-decaf448-03"/>
        </reference>
        <reference anchor="KEYAGREEMENT">
          <front>
            <title>Recommendation for pair-wise key-establishment schemes using discrete logarithm cryptography</title>
            <author fullname="Elaine Barker" initials="E." surname="Barker">
              <organization/>
            </author>
            <author fullname="Lily Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="Allen Roginsky" initials="A." surname="Roginsky">
              <organization/>
            </author>
            <author fullname="Apostol Vassilev" initials="A." surname="Vassilev">
              <organization/>
            </author>
            <author fullname="Richard Davis" initials="R." surname="Davis">
              <organization/>
            </author>
            <date month="April" year="2018"/>
          </front>
          <seriesInfo name="National Institute of Standards and Technology" value="report"/>
          <seriesInfo name="DOI" value="10.6028/nist.sp.800-56ar3"/>
        </reference>
        <reference anchor="HASH-TO-CURVE">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="Armando Faz-Hernandez">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="15" month="June" year="2022"/>
            <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="Internet-Draft" value="draft-irtf-cfrg-hash-to-curve-16"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="FROST20" target="https://eprint.iacr.org/2020/852.pdf">
          <front>
            <title>Two-Round Threshold Signatures with FROST</title>
            <author initials="C." surname="Komlo" fullname="Chelsea Komlo">
              <organization/>
            </author>
            <author initials="I." surname="Goldberg" fullname="Ian Goldberg">
              <organization/>
            </author>
            <date year="2020" month="December" day="22"/>
          </front>
        </reference>
        <reference anchor="Schnorr21" target="https://eprint.iacr.org/2021/1375">
          <front>
            <title>How to Prove Schnorr Assuming Schnorr</title>
            <author initials="E." surname="Crites" fullname="Elizabeth Crites">
              <organization/>
            </author>
            <author initials="C." surname="Komlo" fullname="Chelsea Komlo">
              <organization/>
            </author>
            <author initials="M." surname="Maller" fullname="Mary Maller">
              <organization/>
            </author>
            <date year="2021" month="October" day="11"/>
          </front>
        </reference>
        <reference anchor="StrongerSec22" target="https://eprint.iacr.org/2022/833">
          <front>
            <title>Stronger Security for Non-Interactive Threshold Signatures: BLS and FROST</title>
            <author initials="M." surname="Bellare" fullname="Mihir Bellare">
              <organization/>
            </author>
            <author initials="S." surname="Tessaro" fullname="Stefano Tessaro">
              <organization/>
            </author>
            <author initials="C." surname="Zhu" fullname="Chenzhi Zhu">
              <organization/>
            </author>
            <date year="2022" month="June" day="01"/>
          </front>
        </reference>
        <reference anchor="BonehShoup" target="http://toc.cryptobook.us/book.pdf">
          <front>
            <title>A Graduate Course in Applied Cryptography</title>
            <author initials="D." surname="Boneh" fullname="Dan Boneh">
              <organization/>
            </author>
            <author initials="V." surname="Shoup" fullname="Victor Shoup">
              <organization/>
            </author>
            <date year="2020" month="January"/>
          </front>
        </reference>
        <reference anchor="RFC4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley">
              <organization/>
            </author>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS).  These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document was improved based on input and contributions by the Zcash Foundation engineering team.</t>
    </section>
    <section anchor="prime-order-verify">
      <name>Schnorr Signature Verification for Prime-Order Groups</name>
      <t>This section contains a routine for verifying Schnorr signatures with validated inputs.
Specifically, it assumes that signature R component and public key belong to the
prime-order group.</t>
      <artwork><![CDATA[
  prime_order_verify(msg, sig, PK):

  Inputs:
  - msg, signed message, a byte string
  - sig, a tuple (R, z) output from signature generation
  - PK, public key, an Element

  Outputs: 1 if signature is valid, and 0 otherwise

  def prime_order_verify(msg, sig = (R, z), PK):
    comm_enc = G.SerializeElement(R)
    pk_enc = G.SerializeElement(PK)
    challenge_input = comm_enc || pk_enc || msg
    c = H2(challenge_input)

    l = G.ScalarBaseMult(z)
    r = R + (c * PK)
    return l == r
]]></artwork>
    </section>
    <section anchor="dep-dealer">
      <name>Trusted Dealer Key Generation</name>
      <t>One possible key generation mechanism is to depend on a trusted dealer, wherein the
dealer generates a group secret <tt>s</tt> uniformly at random and uses Shamir and Verifiable
Secret Sharing as described in <xref target="dep-shamir"/> and <xref target="dep-vss"/> to create secret
shares of <tt>s</tt> to be sent to all other participants. We highlight at a high level how this
operation can be performed.</t>
      <t>The dealer is trusted to 1) generate good randomness, and 2) delete secret values after distributing shares to each participant,
and 3) keep secret values confidential.</t>
      <artwork><![CDATA[
  Inputs:
  - s, a group secret, Scalar, that MUST be derived from at least Ns bytes of entropy
  - MAX_SIGNERS, the number of shares to generate, an integer
  - MIN_SIGNERS, the threshold of the secret sharing scheme, an integer

  Outputs:
  - signer_private_keys, MAX_SIGNERS shares of the secret key s, each a Scalar value.
  - vss_commitment, a vector commitment of Elements in G, to each of the coefficients
    in the polynomial defined by secret_key_shares and whose first element is
    G.ScalarBaseMult(s).

  def trusted_dealer_keygen(s, MAX_SIGNERS, MIN_SIGNERS):
    signer_private_keys, coefficients = secret_share_shard(secret_key, MAX_SIGNERS, MIN_SIGNERS)
    vss_commitment = vss_commit(coefficients):
    PK = G.ScalarBaseMult(secret_key)
    return signer_private_keys, vss_commitment
]]></artwork>
      <t>It is assumed the dealer then sends one secret key share to each of the NUM_SIGNERS participants, along with <tt>vss_commitment</tt>.
After receiving their secret key share and <tt>vss_commitment</tt>, participants MUST abort if they do not have the same view of <tt>vss_commitment</tt>.
Otherwise, each participant MUST perform <tt>vss_verify(secret_key_share_i, vss_commitment)</tt>, and abort if the check fails.
The trusted dealer MUST delete the secret_key and secret_key_shares upon completion.</t>
      <t>Use of this method for key generation requires a mutually authenticated secure channel
between the dealer and participants to send secret key shares, wherein the channel provides confidentiality
and integrity. Mutually authenticated TLS is one possible deployment option.</t>
      <section anchor="dep-shamir">
        <name>Shamir Secret Sharing</name>
        <t>In Shamir secret sharing, a dealer distributes a secret <tt>Scalar</tt> <tt>s</tt> to <tt>n</tt> participants
in such a way that any cooperating subset of <tt>MIN_SIGNERS</tt> participants can recover the
secret. There are two basic steps in this scheme: (1) splitting a secret into
multiple shares, and (2) combining shares to reveal the resulting secret.</t>
        <t>This secret sharing scheme works over any field <tt>F</tt>. In this specification, <tt>F</tt> is
the scalar field of the prime-order group <tt>G</tt>.</t>
        <t>The procedure for splitting a secret into shares is as follows.</t>
        <artwork><![CDATA[
  secret_share_shard(s, MAX_SIGNERS, MIN_SIGNERS):

  Inputs:
  - s, secret value to be shared, a Scalar
  - MAX_SIGNERS, the number of shares to generate, an integer
  - MIN_SIGNERS, the threshold of the secret sharing scheme, an integer

  Outputs:
  - secret_key_shares, A list of MAX_SIGNERS number of secret shares, which is a tuple
    consisting of the participant identifier and the key share, each of which is a Scalar
  - coefficients, a vector of the t coefficients which uniquely determine
    a polynomial f.

  Errors:
  - "invalid parameters", if MIN_SIGNERS > MAX_SIGNERS or if MIN_SIGNERS is less than 2

  def secret_share_shard(s, MAX_SIGNERS, MIN_SIGNERS):
    if MIN_SIGNERS > MAX_SIGNERS:
      raise "invalid parameters"
    if MIN_SIGNERS < 2:
      raise "invalid parameters"

    # Generate random coefficients for the polynomial, yielding
    # a polynomial of degree (MIN_SIGNERS - 1)
    coefficients = [s]
    for i in range(1, MIN_SIGNERS):
      coefficients.append(G.RandomScalar())

    # Evaluate the polynomial for each point x=1,...,n
    secret_key_shares = []
    for x_i in range(1, MAX_SIGNERS + 1):
      y_i = polynomial_evaluate(x_i, coefficients)
      secret_key_share_i = (x_i, y_i)
      secret_key_share.append(secret_key_share_i)
    return secret_key_shares, coefficients
]]></artwork>
        <t>Let <tt>points</tt> be the output of this function. The i-th element in <tt>points</tt> is
the share for the i-th participant, which is the randomly generated polynomial
evaluated at coordinate <tt>i</tt>. We denote a secret share as the tuple <tt>(i, points[i])</tt>,
and the list of these shares as <tt>shares</tt>.
<tt>i</tt> MUST never equal <tt>0</tt>; recall that <tt>f(0) = s</tt>, where <tt>f</tt> is the polynomial defined in a Shamir secret sharing operation.</t>
        <t>The procedure for combining a <tt>shares</tt> list of length <tt>MIN_SIGNERS</tt> to recover the
secret <tt>s</tt> is as follows.</t>
        <artwork><![CDATA[
  secret_share_combine(shares):

  Inputs:
  - shares, a list of at minimum MIN_SIGNERS secret shares, each a tuple (i, f(i))

  Outputs: The resulting secret s, a Scalar, that was previously split into shares

  Errors:
  - "invalid parameters", if less than MIN_SIGNERS input shares are provided

  def secret_share_combine(shares):
    if len(shares) < MIN_SIGNERS:
      raise "invalid parameters"
    s = polynomial_interpolation(shares)
    return s
]]></artwork>
      </section>
      <section anchor="dep-vss">
        <name>Verifiable Secret Sharing</name>
        <t>Feldman's Verifiable Secret Sharing (VSS) builds upon Shamir secret sharing,
adding a verification step to demonstrate the consistency of a participant's
share with a public commitment to the polynomial <tt>f</tt> for which the secret <tt>s</tt>
is the constant term. This check ensure that all participants have a point
(their share) on the same polynomial, ensuring that they can later reconstruct
the correct secret.</t>
        <t>The procedure for committing to a polynomial <tt>f</tt> of degree <tt>MIN_SIGNERS-1</tt> is as follows.</t>
        <artwork><![CDATA[
  vss_commit(coeffs):

  Inputs:
  - coeffs, a vector of the MIN_SIGNERS coefficients which uniquely determine
  a polynomial f.

  Outputs: a commitment vss_commitment, which is a vector commitment to each of the
  coefficients in coeffs, where each element of the vector commitment is an `Element` in `G`.

  def vss_commit(coeffs):
    vss_commitment = []
    for coeff in coeffs:
      A_i = G.ScalarBaseMult(coeff)
      vss_commitment.append(A_i)
    return vss_commitment
]]></artwork>
        <t>The procedure for verification of a participant's share is as follows.
If <tt>vss_verify</tt> fails, the participant MUST abort the protocol, and failure should be investigated out of band.</t>
        <artwork><![CDATA[
  vss_verify(share_i, vss_commitment):

  Inputs:
  - share_i: A tuple of the form (i, sk_i), where i indicates the participant
    identifier, and sk_i the participant's secret key, a secret share of the
    constant term of f, where sk_i is a Scalar.
  - vss_commitment: A VSS commitment to a secret polynomial f, a vector commitment
    to each of the coefficients in coeffs, where each element of the vector commitment
    is an Element

  Outputs: 1 if sk_i is valid, and 0 otherwise

  vss_verify(share_i, commitment)
    (i, sk_i) = share_i
    S_i = ScalarBaseMult(sk_i)
    S_i' = G.Identity()
    for j in range(0, MIN_SIGNERS):
      S_i' += pow(i, j) * vss_commitment[j]
    if S_i == S_i':
      return 1
    return 0
]]></artwork>
        <t>We now define how the Coordinator and signer participants can derive group info,
which is an input into the FROST signing protocol.</t>
        <artwork><![CDATA[
    derive_group_info(MAX_SIGNERS, MIN_SIGNERS, vss_commitment):

    Inputs:
    - MAX_SIGNERS, the number of shares to generate, an integer
    - MIN_SIGNERS, the threshold of the secret sharing scheme, an integer
    - vss_commitment: A VSS commitment to a secret polynomial f, a vector commitment to each of the
    coefficients in coeffs, where each element of the vector commitment is an Element in G.

    Outputs:
    - PK, the public key representing the group, an Element.
    - signer_public_keys, a list of MAX_SIGNERS public keys PK_i for i=1,...,MAX_SIGNERS,
      where each PK_i is the public key, an Element, for participant i.

    derive_group_info(MAX_SIGNERS, MIN_SIGNERS, vss_commitment)
      PK = vss_commitment[0]
      signer_public_keys = []
      for i in range(1, MAX_SIGNERS+1):
        PK_i = G.Identity()
        for j in range(0, MIN_SIGNERS):
          PK_i += pow(i, j) * vss_commitment[j]
        signer_public_keys.append(PK_i)
      return PK, signer_public_keys
]]></artwork>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section contains test vectors for all ciphersuites listed in <xref target="ciphersuites"/>.
All <tt>Element</tt> and <tt>Scalar</tt> values are represented in serialized form and encoded in
hexadecimal strings. Signatures are represented as the concatenation of their
constituent parts. The input message to be signed is also encoded as a hexadecimal
string.</t>
      <t>Each test vector consists of the following information.</t>
      <ul spacing="normal">
        <li>Configuration: This lists the fixed parameters for the particular instantiation
of FROST, including MAX_SIGNERS, MIN_SIGNERS, and NUM_SIGNERS.</li>
        <li>Group input parameters: This lists the group secret key and shared public key,
generated by a trusted dealer as described in <xref target="dep-dealer"/>, as well as the
input message to be signed. All values are encoded as hexadecimal strings.</li>
        <li>Signer input parameters: This lists the signing key share for each of the
NUM_SIGNERS signers.</li>
        <li>Round one parameters and outputs: This lists the NUM_SIGNERS participants engaged
in the protocol, identified by their integer identifier, the hiding and binding commitment
values produced in <xref target="frost-round-one"/>, as well as the resulting group binding factor input,
computed in part from the group commitment list encoded as described in <xref target="dep-encoding"/>,
and group binding factor as computed in <xref target="frost-round-two"/>).</li>
        <li>Round two parameters and outputs: This lists the NUM_SIGNERS participants engaged
in the protocol, identified by their integer identifier, along with their corresponding
output signature share as produced in <xref target="frost-round-two"/>.</li>
        <li>Final output: This lists the aggregate signature as produced in <xref target="frost-aggregation"/>.</li>
      </ul>
      <section anchor="frosted25519-sha-512-1">
        <name>FROST(Ed25519, SHA-512)</name>
        <artwork><![CDATA[
// Configuration information
MAX_SIGNERS: 3
MIN_SIGNERS: 2
NUM_SIGNERS: 2

// Group input parameters
group_secret_key: 7b1c33d3f5291d85de664833beb1ad469f7fb6025a0ec78b3a7
90c6e13a98304
group_public_key: 15d21ccd7ee42959562fc8aa63224c8851fb3ec85a3faf66040
d380fb9738673
message: 74657374

// Signer input parameters
S1 signer_share: 929dcc590407aae7d388761cddb0c0db6f5627aea8e217f4a033
f2ec83d93509
S2 signer_share: a91e66e012e4364ac9aaa405fcafd370402d9859f7b6685c07ee
d76bf409e80d
S3 signer_share: d3cb090a075eb154e82fdb4b3cb507f110040905468bb9c46da8
bdea643a9a02

// Round one parameters
participants: 1,3

// Signer round one outputs
S1 hiding_nonce: 424fb678c3cd26ae86813ed1e22f9074b2dec6b0fb39d748101a
9434d6c4c60a
S1 binding_nonce: 49c957d98fec37b81a491fcbc3b16af925d393d734acc765446
574bc7b453109
S1 hiding_nonce_commitment: 6ca4bc3e03fa91bd15ec29993bc0582779c1d0c60
2c3141b22ea76abf9384290
S1 binding_nonce_commitment: 03dc2bc626fc5fa41168dee456ec17bac8673691
e27547c534a559c3d4d7fc6b
S1 binding_factor_input: 00016ca4bc3e03fa91bd15ec29993bc0582779c1d0c6
02c3141b22ea76abf938429003dc2bc626fc5fa41168dee456ec17bac8673691e2754
7c534a559c3d4d7fc6bee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f88
19a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f
50028a8ff
S1 binding_factor: 1af00d46730628637df21dd56023489d6691468b2515c28c22
052abc63e4d405
S3 hiding_nonce: bcca3084a26538abd5326825f7a1203907c09ae7d12160810c4c
8254aac02e03
S3 binding_nonce: 9063464ee91ee0981f0073783c7ca1590ed6b1cb7382bad842f
6a5a4dc7ba607
S3 hiding_nonce_commitment: 7786dc3db9823b1b2c81d71957d2464302ffc5b31
e586f9e754385e7d216a2d1
S3 binding_nonce_commitment: 21b0c507a779f3288c74506838e8f084cd378eab
4b66ce185fe842a2262ac899
S3 binding_factor_input: 00037786dc3db9823b1b2c81d71957d2464302ffc5b3
1e586f9e754385e7d216a2d121b0c507a779f3288c74506838e8f084cd378eab4b66c
e185fe842a2262ac899ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f88
19a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f
50028a8ff
S3 binding_factor: 7702669b34a9534bce0e73ed97c3d002433d969f4ee70c4a30
c6f56e661efb0e

// Round two parameters
participants: 1,3

// Signer round two outputs
S1 sig_share: 95bac1faca14c3f85d9f3b5d515009a2db7715cdafaa414bb5d271a
2f1300c0c
S3 sig_share: 636280b4886b8120e2aeffd6637f82e64a4616c1b65682bb4a68863
5c4bd3107

sig: ad05ed58d78f26dba585d4e452b099126f733bc35c698210ce8590691582e387
0b494c52391d32c169b14391d6d5ac7326be2b8e6601c406003bf8d7b5ee3d03
]]></artwork>
      </section>
      <section anchor="frosted448-shake256-1">
        <name>FROST(Ed448, SHAKE256)</name>
        <artwork><![CDATA[
// Configuration information
MAX_SIGNERS: 3
MIN_SIGNERS: 2
NUM_SIGNERS: 2

// Group input parameters
group_secret_key: 6298e1eef3c379392caaed061ed8a31033c9e9e3420726f23b4
04158a401cd9df24632adfe6b418dc942d8a091817dd8bd70e1c72ba52f3c00
group_public_key: 1588564c56a8edb53b55399df5b65fd2abe777717baa2ef440b
13fe13b7ce077347f5e4346ab4475f9258fb947978b0123884832a46c6be800
message: 74657374

// Signer input parameters
S1 signer_share: 4a2b2f5858a932ad3d3b18bd16e76ced3070d72fd79ae4402df2
01f525e754716a1bc1b87a502297f2a99d89ea054e0018eb55d39562fd0100
S2 signer_share: 2503d56c4f516444a45b080182b8a2ebbe4d9b2ab509f25308c8
8c0ea7ccdc44e2ef4fc4f63403a11b116372438a1e287265cadeff1fcb0700
S3 signer_share: 00db7a8146f995db0a7cf844ed89d8e94c2b5f259378ff66e39d
172828b264185ac4decf7219e4aa4478285b9c0eef4fccdf3eea69dd980d00

// Round one parameters
participants: 1,3

// Signer round one outputs
S1 hiding_nonce: d1c4212b1b0987135b686fc1e0c26d464609e3b2cb0363f4ce81
676d9798c10161775894edae39f91731083a8751b754ce7faa9b51bd3c1800
S1 binding_nonce: c1f429e6b853dfefac16acebba0691916b5e41ea62122a7d565
b16c98069202f6e18cba21790f26a351253ce03ff41556435ac7a1ce6960d00
S1 hiding_nonce_commitment: cc1cb80545250515c06b5b5c2ae124973a232d7bf
74fd2b3d4f9ba0505b67ee3eee3f10b1c8a739b5eedd49158e0b4a1789ec3b4aef2f6
4280
S1 binding_nonce_commitment: 5d0766016f294cc27af4a94a1f6f0c1e4074377d
7850133fa6e56ee6073e47fe0e3e0b9af5a8a4c24d179f2711702d9232557e72e7f04
9ec00
S1 binding_factor_input: 0001cc1cb80545250515c06b5b5c2ae124973a232d7b
f74fd2b3d4f9ba0505b67ee3eee3f10b1c8a739b5eedd49158e0b4a1789ec3b4aef2f
642805d0766016f294cc27af4a94a1f6f0c1e4074377d7850133fa6e56ee6073e47fe
0e3e0b9af5a8a4c24d179f2711702d9232557e72e7f049ec00b54ff7255705a71ee29
25e4a3e30e41aed489a579d5595e0df13e32e1e4dd202a7c7f68b31d6418d9845eb4d
757adda6ab189e1bb340db818e5b3bc725d992faf63e9b0500db10517fe09d3f566fb
a3a80e46a403e0c7d41548fbf75cf2662b00225b502961f98d8c9ff937de0b24c2318
45
S1 binding_factor: 2648c00456a49c45068225a53daf4141c49d94f24c91baa0c4
709b929652b678533533da023bc86546d2bf27103401069e82e7d76e45d80700
S3 hiding_nonce: 27c798a453fdc42aee7302b02140622fe17a99aa57f61dc5f9ce
0e55cf64034cfe41954d8e4d4bc46bad25b67058e9d8de87cee9dcea340f00
S3 binding_nonce: 2fdf07df954ce0378e47551841db9826e8ceec79c083f4e1e70
5d1f14824784dc82dade69b01065e9483d8c6cc577afa15c60484fe670e0500
S3 hiding_nonce_commitment: 7f4e108990f82c411317c5e1f945b46e3c115a52c
60e57a360fbc69c3101ca4b3151b855f7c28574ce2e6a4150fcb351d50bb81fec3d03
f500
S3 binding_nonce_commitment: ac79cf898abd0896a1468944f40b38cfb82cb191
c737681d0b8b2d1a6bebb559ae0221cda231238caf603e2ee85658bc28782083ecd3a
ab900
S3 binding_factor_input: 00037f4e108990f82c411317c5e1f945b46e3c115a52
c60e57a360fbc69c3101ca4b3151b855f7c28574ce2e6a4150fcb351d50bb81fec3d0
3f500ac79cf898abd0896a1468944f40b38cfb82cb191c737681d0b8b2d1a6bebb559
ae0221cda231238caf603e2ee85658bc28782083ecd3aab900b54ff7255705a71ee29
25e4a3e30e41aed489a579d5595e0df13e32e1e4dd202a7c7f68b31d6418d9845eb4d
757adda6ab189e1bb340db818e5b3bc725d992faf63e9b0500db10517fe09d3f566fb
a3a80e46a403e0c7d41548fbf75cf2662b00225b502961f98d8c9ff937de0b24c2318
45
S3 binding_factor: b165cef8a42b605d192930206ffcdf48cf242e968340c9e13f
58962be27bccb2af4d674e67c3e97ff719ba87216565544edb1f862c18433e00

// Round two parameters
participants: 1,3

// Signer round two outputs
S1 sig_share: c0c5055e6429cf24c60fd19cb7e887caed243db821f81fc899a30f2
dae833bf6c373acb0a0dbd9d7d3bd3de36e1b33b21ea9c19dce74d23b00
S3 sig_share: 495e6971b5ab6bf800860296eeb8e0caa4a8b2137f390b53366bb97
432dbf0fc07b315fa9df67eda1417720fc98f9325340d7fb8fe708a2f00

sig: 6d244abe9f23024c58b1962baec45a0cce035d7a73034ca39642ed58df8dd444
f8f2a3e08b187645fecdd93fbd151af076e608b976206bbe8016df16248712c2f9710
60ea533dffb730297191d5756dc56e6eafe24e15e2cf3cb26c2aa3ed258b2e8d4aff2
37abc6d752b64056cde55c2b00
]]></artwork>
      </section>
      <section anchor="frostristretto255-sha-512">
        <name>FROST(ristretto255, SHA-512)</name>
        <artwork><![CDATA[
// Configuration information
MAX_SIGNERS: 3
MIN_SIGNERS: 2
NUM_SIGNERS: 2

// Group input parameters
group_secret_key: 1b25a55e463cfd15cf14a5d3acc3d15053f08da49c8afcf3ab2
65f2ebc4f970b
group_public_key: e2a62f39eede11269e3bd5a7d97554f5ca384f9f6d3dd9c3c0d
05083c7254f57
message: 74657374

// Signer input parameters
S1 signer_share: 5c3430d391552f6e60ecdc093ff9f6f4488756aa6cebdbad75a7
68010b8f830e
S2 signer_share: b06fc5eac20b4f6e1b271d9df2343d843e1e1fb03c4cbb673f28
72d459ce6f01
S3 signer_share: f17e505f0e2581c6acfe54d3846a622834b5e7b50cad9a2109a9
7ba7a80d5c04

// Round one parameters
participants: 1,3

// Signer round one outputs
S1 hiding_nonce: 82fd8f26f0b5f86d93d3da8162c23641aa1b16ab803be1a4d850
0f143b592605
S1 binding_nonce: c9ee2f764434e263808722a3cb9886b7ce25ade80ce00bac4ac
4d9548ac2450a
S1 hiding_nonce_commitment: c4f0ea06e07ee8e41bd3de3a63dc77f40d65a7ede
329263db410eb0e455c9a7a
S1 binding_nonce_commitment: c2ab142e4c2572aea1dcd0044e864544c49874b2
e39ed5f969b6133372a23643
S1 binding_factor_input: 0001c4f0ea06e07ee8e41bd3de3a63dc77f40d65a7ed
e329263db410eb0e455c9a7ac2ab142e4c2572aea1dcd0044e864544c49874b2e39ed
5f969b6133372a23643678630bf982c566949d7f22d2aefb94f252c664216d332f34e
2c8fdcd7045f207f854504d0daa534a5b31dbdf4183be30eb4fdba4f962d8a6b69cf2
0c2734043
S1 binding_factor: 1bed7e23dbe3066085a132da86ccf1e58291cec6571249cd4f
16a053c8409b04
S3 hiding_nonce: d2478a9a47594005cb6de147f4c98b92b5e27e157fddb37ef122
a75dfd7b8e06
S3 binding_nonce: 5f2193dc5f3e5537fba742786fec22e18e40b059e50d6ef2e31
60a3faf11dd0e
S3 hiding_nonce_commitment: 9a543be2b522d20a9d7e920388bb32f954bcfc695
d145736de09f09646c6ae4c
S3 binding_nonce_commitment: debe73bc386b4dba161d72fa46ecc86765d6ff36
27cfe07d56891d21399f1e4c
S3 binding_factor_input: 00039a543be2b522d20a9d7e920388bb32f954bcfc69
5d145736de09f09646c6ae4cdebe73bc386b4dba161d72fa46ecc86765d6ff3627cfe
07d56891d21399f1e4c678630bf982c566949d7f22d2aefb94f252c664216d332f34e
2c8fdcd7045f207f854504d0daa534a5b31dbdf4183be30eb4fdba4f962d8a6b69cf2
0c2734043
S3 binding_factor: f611130beed6aa69de48fc1c05e7a005c7d5232b2852fe721a
1d711c35a28600

// Round two parameters
participants: 1,3

// Signer round two outputs
S1 sig_share: 2aeac152cff93a82233c1ac6bece654af750f75c47cd5c87fcf6109
a562c8903
S3 sig_share: a9487edfb9349f792693278fa9f8abd57c2caaac4f901fb03da8534
c56574303

sig: a6fa7f7553307cfa36e55a705a2e59f808a1bcda888efcf4f26ba0c4080cc400
d3324032892edafb49cf415568c71120747da109975d7c373a9f64e6ac83cc06
]]></artwork>
      </section>
      <section anchor="frostp-256-sha-256-1">
        <name>FROST(P-256, SHA-256)</name>
        <artwork><![CDATA[
// Configuration information
MAX_SIGNERS: 3
MIN_SIGNERS: 2
NUM_SIGNERS: 2

// Group input parameters
group_secret_key: 8ba9bba2e0fd8c4767154d35a0b7562244a4aaf6f36c8fb8735
fa48b301bd8de
group_public_key: 023a309ad94e9fe8a7ba45dfc58f38bf091959d3c99cfbd02b4
dc00585ec45ab70
message: 74657374

// Signer input parameters
S1 signer_share: 0c9c1a0fe806c184add50bbdcac913dda73e482daf95dcb9f35d
bb0d8a9f7731
S2 signer_share: 8d8e787bef0ff6c2f494ca45f4dad198c6bee01212d6c8406715
9c52e1863ad5
S3 signer_share: 0e80d6e8f6192c003b5488ce1eec8f5429587d48cf001541e713
b2d53c09d928

// Round one parameters
participants: 1,3

// Signer round one outputs
S1 hiding_nonce: e1bec1511c502e6b6866ef35469dac6df913efa8042a70b39aa6
494307d6ee41
S1 binding_nonce: 55682738caade073b207abdec93014bc111bc5d6a8977f3a24d
f58bebf650894
S1 hiding_nonce_commitment: 0257ea635b11b63eb125ed1c983082a406e0185e5
df6bd4c2a708f7d4b1ffe72d2
S1 binding_nonce_commitment: 03aec5dfcd35c5ad7a7242552efe9c45878a0b2f
3f576b8f60fa172d380881f040
S1 binding_factor_input: 00010257ea635b11b63eb125ed1c983082a406e0185e
5df6bd4c2a708f7d4b1ffe72d203aec5dfcd35c5ad7a7242552efe9c45878a0b2f3f5
76b8f60fa172d380881f0407a753fed12531fbcd151e1d84702927c39063e780e91c0
1f02bd11b60d7632bf
S1 binding_factor: 846723bf0898010ebb3d0a0c193c682a22946bb99c9551f5e3
a0c29008aa8891
S3 hiding_nonce: a284c689cd1d8ec33dcfe840d18ba0ddcbb69571744116912d7a
5c20631ea003
S3 binding_nonce: 9f3ca4297e01ce82a5c7301a8fc39e6ec0588087483c912e269
92f0d00009f0b
S3 hiding_nonce_commitment: 02fc8fe2f5d1bfa6b027ff1184c57cc7b880e050f
bf370a4e23d17eb3b249f45d9
S3 binding_nonce_commitment: 02288d41169a97462b323dd61658eb134f8dd802
af7d1932f602f2532afd9d1903
S3 binding_factor_input: 000302fc8fe2f5d1bfa6b027ff1184c57cc7b880e050
fbf370a4e23d17eb3b249f45d902288d41169a97462b323dd61658eb134f8dd802af7
d1932f602f2532afd9d19037a753fed12531fbcd151e1d84702927c39063e780e91c0
1f02bd11b60d7632bf
S3 binding_factor: 739b96f69c0ec5fbe05c2f5191ec349f835d9a38f8cf1a5632
87b3547540c4b0

// Round two parameters
participants: 1,3

// Signer round two outputs
S1 sig_share: 38f57b8c861a9eb03eeeb381bae58f0f7fce6f0d0da431a0ae58a00
a760aadf4
S3 sig_share: e4f1da04a879bd5b23c51662c22cbd71a80129db5e387895c769727
a15176556

sig: 02b72e3a186d719efb18f4341d7b5d983f782d31c57f884a5fe79040d30ddd39
381de755922e945c0a62b3c9e47d124c816ae89e3ac4c50bb1820847c18ebeedf9
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+29+X4bR7Im+n89RY38R5M2Ade+qI/ODC3Jln4tL1e03XOO
xyPUkkXCBgEeFCCJXs6zzLPcJ7tfRGRWZRUKFL31Mveo2xIJVOUSGcsXkZGR
s9nM2S13K/XQffDlm83s5Wa/rt0vr7aqvdqsaveiulpvtlv3Ynm5LnZ7fOy+
We6u3I9ffn7x5QOnKMuteo139e/1ploX12is3hbNbrbc7ppZ1WwvZ8120+5m
XuJUxU5dbra3D93lutk4zvJm+9DdbfftLvC83AucYquKh+4naq22xcp5s9l+
f7nd7G8euo8/fvmJ8726xUf1Q/f5eqe2a7WbPaGeHKfdFev6VbHarNH7rWqd
9rrY7l79x36zU+1Dd71xbpYP3W92m+rMbTfb3VY1LX66vaYfvnWcYr+72mwf
Ou7MxcjwxpO5+3izXm9Wq1vHxR+Z1xO13NZbNfxqs70s1ssfit1ys37o/ntV
tCAQEZI/4UfUdbFcgSz77f66otnuV/vr/3FJn86rzXXf7eO5+5fN9Wpj9fn4
Sq1aVVifDzv8ar18rbbtcnfrbhr3ryDwdrXZnN05kOp7aux/7N/op+dV0Y/h
+dz9BItfqu2lNYznxXr48X1GYfe5LNaXR3rErM/n7l83m3ow7+2y3W1urtR2
8O2w38erzb5uVmCbwfyKN//jShU3y/Vludy1c3CK44CTr/HWa4Vldt/m8yR4
yO8YAfhiX66WlfsXdes+3t7e7DaX2+Lm6tZtNlt3d6Xcj5frYl0ti5V7obav
lxWE4fm6xmISO9MDT1er5c0OTTzeb18r98nycrmjp43wuOcr8D7k59o9efr4
ycX56QMeANYH/V+omzPXz/OMP2vVdqlaEhIZpOs+OP/s4vmDh+7/pJHPugc7
zuU/M/0vk+mhS6/gk4unjz8ZznU0VHu+Z+4FCVOxrVue+tOmWVZLtd4NqfIJ
ieWZi0Wfu4HMY1dsL9XuoXu12920Dz/8sFXV5RzjoB/82etgflM31oRJ4h2a
obUsrEgC7+Fke+pmu1zv5sui2nKzgRd4H2Zx3+6dqmxahU2Q8Kjc9d8dCIOZ
UeDN/GAWBER00Z2Bf+/J+B/6YRoPZvJs88bdbdwvthusktHG5227vwZrmw/u
msXTFUSlVJjwY3AeFOP9J/lpsb3FX6uV2g7n6M98TNOnOe62m/Wl2l6oKgju
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
dKvu4oOF2A8xN2Bm44Asni9Erxbr7kNoxvMFm5PFRwsTvJZu0PCZszh3P3A/
grB8hH/PpacVbUObmAuJ5Cdo9xyfSkyZWqdGsRLUBLW41REYkTDp2VnM8BDv
XQjWoJ5OZuckzPwP+sOPZswVA9clmFGx3BEKWsxYP4j0Ou2+5OQI5hStIc7d
GY9e2v4IytS9mNrWoHkR8IA55UUUpYNVVSTojt5t6zIODpdCM4sh9blegl2r
ViDQlpTlDmzT6n0HgoI8arSNJdi+f64HOZ/PmdAHC0UkJZXnvt+R5a9KN8Jr
V5DObpZvwTGdqnDswXZTJxfhF83fPTZ/p58/DeG+c6axLmQwH2Esn2IoJ1ta
my+7bRZHPOXWctY4jLP45OOTm9MFgbAlOOcNDbKh7eSNETftYgNmrWoNVzvf
geMDHHx1Fk+Frpr5ZTQWO/UCMhYKAV/4wmznyEjPTLrJ8rVawbL0qwPCymYG
+4/bZUu8Ago8eiRtwYRAqfIA0Zze2SghRI8WtJtHwak35MAXsFSFhWEPop4s
RyYPBwj2e/EEST7ZWySVdXI6xA+ix0SK3ROykaTU2H9/rhXI+JVOsfQ0HNBI
t/JcWpHAr9DXbqkw9qejveF0yt+gVeYoi46UKN3Vyfkppb7dsCbp+yd9w8By
LzvobL+L7bbAIMt9wwMU2dAAbPGZWkhArR33gOfRx/luR1CAme66gDI/bJM6
HA3CYHOKGYLjGw1sCOLojB6G7MtaWuvMRidalg7ZUPKZJb3Myl1kiJZ5WyzZ
F7Qnsd1SrlRD9mMQZOIROZR4Ksp5tJR9p32XjC9gc+0AisYY/P1M7wNWjqvn
yFOT/uC23rSDFdQs0HYLaPQReZm/cPHa8eLpxn/R2vWct6D23N+DwoLJ3PtQ
7SjNeAd1AIOeca64GZggFkZBBrL0mRlXYholsecYvhzBKrYX8oTzZks5Uayg
nhkt22sY1TRGw4nB0TIMrFqtVGepOWfBodyGa3BVrfdaMPRBx61uXseJSiX+
55JSkciOk6UXhDuk5dz9igH0MwYCXQIASLzf9tsCEjqdmd9r7hvGyHkGp+QZ
3IZnoYQ/nkUmrGC+kU+FdbblEqhiO3AJmLE081pmwpGN/x7hijq0DZJuO9QB
ACx9ISHGZ8bnH0Z8N9s5R5lE+7MtOhw+hVitWLVFLJj8CQlm2MhbtqbZoiRv
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
7tHqYLxHaH6c4seF2nUlD7K2nkbPw+RIS5+4P/3U+Z4Tf6y4s9n7PjLYX9HS
0dkZNXS1eSUxsEdTs/qgI75+fkh0WhH/pGvjdPIhppwx6IM1GWnRQaB9oo1O
/0nG2ON+mIcKcLDz84vUH+2BGCYebys5R1D7vZSbEOe3azit3bi5/+s1nGzT
sJb7ZRrut6K036Ds+oid2x3aFQ/NGuRRZX5kmkeh/bpbAErYORzbAQ+PFDF/
b63DoSaeIKXWzON3eRetz1f6G2jiA330i7BfO8B9usmJSR189EGnho+xOmU6
jgb3/vEZDlTfuLdO7/X74Y+7TexD1TfcxP7Vuo9O+Rt00DU3qenG4+Wg9i9k
yr4dOYv5ivak7XOZo9NiG6sZ6wwOdc2ktLv/FZCn20MajbsjxFiKui9ODqlx
OK8e2/RPH+5CGxs+bvHUerNv9V3v90/K+92IO/s/GstPP033gc8x/mEbBASC
k1GTA6buKSfc7PblB2W/5kKv4hcmbeXH96QgKu2Z/twlYE7XV7NqEHERStkB
mii9M10ArDvx3tdzmTvPd5y9uXqt2omwiT60C/nriivMeQ4Hj22Vo0ypNY5B
H5wZmz7/NDynpV9y+j18inpYvQ9PrnUpHn1cRMSnlXOTGMxDx/Hn7hNzIpUL
Riw71EBjtcs7YEwnGONK0ea7feQKI5Vc2NM/O8G8HxF3KYdGT7aqUrKTwFmZ
m+2bYstyzHzS6sJZNtlO/8yl5MK5e355ueWD7jqmOjh/3NVnOTjpLfuVzLrt
lRFf2RMetDQ3uXtygkTrRa5/ZDblR1Uu7NOpNv35YLHOmhYSnvG2JJ9evNq0
VOntLRXklc0yO0XL3ipdDivE7TYOlPpqczvM6aL1pWSxguvwYSh7TJPKH/YD
Mnmj683MqgBi5511ZUUpjcL5SFUF5SyOjiwv7UpBSzpuQxMyTMITZMrVXQ0K
GuiJKI1To6J3hZnfKFf8QX9w/4HDZyzOLKg51PqHgjPnEox9jsOZJl83JFOo
Y7xQFj4eBJMWX7xaLjiW1A7Fx+nHyUlx4oP0BupsmIRsTl2YVPvFF39ZnA2n
A+04NGNdMhYlwlp7ZH2G7Jzb0ZKueb9LxuJWdIEDa/0My/QFqhb6OOsrOa9N
ih3PL1wui/XkL59QTu8X3cQmApTWpEAtM1I+brW8XmKgVMpQjCnFzO49wJ58
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
R3dR2Befs/K2arJzIIdukxo9+KfWCpycjZHIpj89NdA7nNJrhsHNWl7RVCSX
ZkQnEIas3/Vmi9Zk0FfO8R0P8/5KUREyjW+bHm2w6ekd31ubWunxhSzd4hHQ
kof48wuWoKmLY8zXf2IJM2d0T047mfyux/TetOPBb39A5vcN9f8dlcUfrss3
331r7DyP5BG/01l2kU3fFlRP162mO7nemKwY2dYZHXJYm+MfhwEl2fwwhyHX
zebM6dWk2eVmIEStDvMQrfQ+ETTXXEwgpcOpuZNjruu0CNpC+FujIr9XXERa
+n2l6NDc/J4GZ1gmnxu3IjtmX5v1T79Hf3Cr5KUU/+7bm+uXzS5DdyXGALrb
Lm3ffCt3M7Gbrh1me201m1tT5ceN6zO5Ay8l/AfBIz3Z38CFeiC86zISUO9b
40MfzL830ZORiL7zD3oX3+1vqxqplPurla6Ve6mW6bEbHCC3dAzUDXHJ4Qvd
zj2difhayU06R7JPdvSMsGl/NfaggjixjdkSHxTC/1nSVnvwxLtBJthudpO3
1nWo5py8Tn6oxVhzOp8py792rtTbolbV8prymjlDpJ33+TeHLRYd2Cfzvu4A
DwN3KcSx3NGNHcyJ+iL7qSQ4naVCEkoVR6xbEArXGpSjywjpCugWAY2T0/ZY
xJw4slKE+Uj0Y9pRudxLBOBhfzuVPku5fKts77CP0fXnV/ry9ZIK0+fByzkC
6vW4UPHp635rcG7qaWjC9F0fjG2QetHte3HA3FYDjjs8HjNO8TiSb6ETSX4+
G10S7rh3LJkcdrIYzlq6KW7CZPXF0++crXVxlxXsGhoGe4vVHOJEFy+7q+Ss
hSRibfrQx6CvY1u1lJmGKddOvzvfAW4rK1by2pbbrk6PjWnpLbm+iYdgrtka
wDtNQOuGOiyK3PXI2fAzzOVwZazgjbDG8AovIfEZu2t8dwy3S9PrLyI5uHKG
LZW1iBOMYiqJSekOmtNk70U76Hc4n92bzc8/n/ZrRbtz/wBrZW3My0ODNFXH
PbzZZep2wam50lQ/XlIuqDRxMK0ucd9q/Eiz9vWfdPj5zgsWyCB9+OFQ69k6
0bH3Q9zQsUNnbuBY1KZfqalpbeUIouiD4Q/dtPSrMKzDJg5yv87iWiVJlIVh
qUq/qKMkb9KmTLwgLjxVpVkZFqmTe1Wi/LDIs9CLnPH9YnB24jrwq6pOlYqC
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
oWxgR9r7B/RtcsZN/x+qSEPBxh8BAA==

-->

</rfc>
