<?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.17 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-frost-09" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title abbrev="FROST">Two-Round Threshold Schnorr Signatures with FROST</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-frost-09"/>
    <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="September" day="27"/>
    <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 signer 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 signing participants each holding a share
of a common private key. The security of threshold schemes in general assumes
that an adversary can corrupt strictly fewer than a threshold number of signer 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 signing participants 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 signer participants that started
round one of the protocol is the same set of signing participants 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-09</t>
        <ul spacing="normal">
          <li>Add single-signer signature generation to complement RFC8032 functions (#293)</li>
          <li>Address Thomas Pornin review comments from https://mailarchive.ietf.org/arch/msg/crypto-panel/bPyYzwtHlCj00g8YF1tjj-iYP2c/ (#292, #291, #290, #289, #287, #286, #285, #282, #281, #280, #279, #278, #277, #276, #275, #273, #272, #267)</li>
          <li>Correct Ed448 ciphersuite (#246)</li>
          <li>Various editorial changes (#241, #240)</li>
        </ul>
        <t>draft-08</t>
        <ul spacing="normal">
          <li>Add notation for Scalar multiplication (#237)</li>
          <li>Add secp2561k1 ciphersuite (#223)</li>
          <li>Remove RandomScalar implementation details (#231)</li>
          <li>Add domain separation for message and commitment digests (#228)</li>
        </ul>
        <t>draft-07</t>
        <ul spacing="normal">
          <li>Fix bug in per-rho signer computation (#222)</li>
        </ul>
        <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_PARTICIPANTS (#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_PARTICIPANTS instead of n (#171)</li>
          <li>Specify what the dealer is trusted to do (#166)</li>
          <li>Clarify types of NUM_PARTICIPANTS 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 notation is used throughout the document.</t>
      <ul spacing="normal">
        <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>count(i, L)</tt>: Outputs the number of times the element <tt>i</tt> is represented in the list <tt>L</tt>.</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>: Outputs 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 of byte strings, i.e., <tt>x || y</tt> denotes the byte string <tt>x</tt>, immediately followed by
the byte string <tt>y</tt>, with no extra separator, yielding <tt>xy</tt>.</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>. Integers, taken modulo the group order <tt>p</tt>, are called
scalars; arithmetic operations on scalars are implicitly performed modulo <tt>p</tt>. Since <tt>p</tt> is prime,
scalars form a finite field. Scalar multiplication is equivalent to the repeated
application of the group operation on an element <tt>A</tt> with itself <tt>r-1</tt> times, denoted as
<tt>ScalarMult(A, r)</tt>. We denote the sum, difference, and product of two scalars using the <tt>+</tt>, <tt>-</tt>,
and <tt>*</tt> operators, respectively. (Note that this means <tt>+</tt> may refer to group element addition or
scalar addition, depending on types of the operands.) For any element <tt>A</tt>, <tt>ScalarMult(A, p) = 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 Scalar(x) as the conversion of integer input <tt>x</tt> to the corresponding Scalar value with
the same numeric value. For example, Scalar(1) yields a Scalar representing the value 1.
We denote equality comparison as <tt>==</tt> and assignment of values by <tt>=</tt>. Finally, it is assumed that
group element addition, negation, and equality comparisons can be efficiently computed for
arbitrary group elements.</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), i.e., a random scalar in [0, p - 1].</li>
          <li>ScalarMult(A, k): Output the scalar multiplication between Element <tt>A</tt> and Scalar <tt>k</tt>.</li>
          <li>ScalarBaseMult(k): Output the scalar multiplication between Scalar <tt>k</tt> and the group generator <tt>B</tt>.</li>
          <li>SerializeElement(A): Maps an <tt>Element</tt> <tt>A</tt> to a canonical 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 the valid canonical 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 canonical 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 separate domain-separated hashes,
H1, H2, H3, H4, and H5:</t>
        <ul spacing="normal">
          <li>H1, H2, and H3 map arbitrary byte strings to Scalar elements of the prime-order group scalar field.</li>
          <li>H4 and H5 are aliases for H with distinct domain separators.</li>
        </ul>
        <t>The details of H1, H2, H3, H4, and H5 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, nonces are
generated with the <tt>nonce_generate</tt> function by combining fresh randomness
and with the secret key as input to a domain-separated hash function built
from the ciphersuite hash function <tt>H</tt>. This domain-separated hash function
is denoted <tt>H3</tt>. This function always samples 32 bytes of fresh randomness
to ensure that the probability of nonce reuse is at most 2<sup>-128</sup>
as long as no more than 2<sup>64</sup> signatures are computed by a given
signing participant.</t>
        <artwork><![CDATA[
  nonce_generate(secret):

  Inputs:
  - secret, a Scalar

  Outputs: nonce, a Scalar

  def nonce_generate(secret):
    random_bytes = random_bytes(32)
    secret_enc = G.SerializeScalar(secret)
    return H3(random_bytes || 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+1
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 1) any x-coordinate is equal to 0, 2) if x_i
    is not in L, or if 3) any x-coordinate is represented more than once 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"
    for x_j in L:
      if count(x_i, L) > 1:
        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>
      <section anchor="dep-encoding">
        <name>List Operations</name>
        <t>This section describes helper functions that work on lists of values produced
during the FROST protocol. The following function encodes a list of participant
commitments into a bytestring for use in the FROST protocol.</t>
        <artwork><![CDATA[
  Inputs:
  - commitment_list = [(i, hiding_nonce_commitment_i, binding_nonce_commitment_i), ...],
    a list of commitments issued by each participant, where each element in the list
    indicates the participant 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 participant identifier.

  Outputs: A byte string containing the serialized representation of commitment_list

  def encode_group_commitment_list(commitment_list):
    encoded_group_commitment = nil
    for (identifier, hiding_nonce_commitment, binding_nonce_commitment) in commitment_list:
      encoded_commitment = G.SerializeScalar(identifier) ||
                           G.SerializeElement(hiding_nonce_commitment) ||
                           G.SerializeElement(binding_nonce_commitment)
      encoded_group_commitment = encoded_group_commitment || encoded_commitment
    return encoded_group_commitment
]]></artwork>
        <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 participant, where each element in the list
    indicates the participant 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 participant identifier.

  Outputs: A list of 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 participant, where each element in the list
    indicates the participant identifier i and their binding factor. This list MUST be sorted
    in ascending order by participant identifier.
  - identifier, participant identifier, a Scalar.

  Outputs: A Scalar value.

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

def binding_factor_for_participant(binding_factor_list, identifier):
  for (i, binding_factor) in binding_factor_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 participant 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 participant, where each element in the list
    indicates the participant 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 participant 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 = H4(msg)
    encoded_commitment_hash = H5(encode_group_commitment_list(commitment_list))
    rho_input_prefix = msg_hash || encoded_commitment_hash

    binding_factor_list = []
    for (identifier, hiding_nonce_commitment, binding_nonce_commitment) in commitment_list:
      rho_input = rho_input_prefix || G.SerializeScalar(identifier)
      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 participant, where each element in the list
    indicates the participant 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 participant 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 + G.ScalarMult(binding_nonce_commitment, binding_factor)
    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>This section describes the two-round variant of the FROST threshold signature
protocol for producing Schnorr signatures. The protocol is configured to
run with a selection of <tt>NUM_PARTICIPANTS</tt> signer participants and a Coordinator.
<tt>NUM_PARTICIPANTS</tt> is a positive integer at least <tt>MIN_PARTICIPANTS</tt> but no larger than
<tt>MAX_PARTICIPANTS</tt>, where <tt>MIN_PARTICIPANTS &lt; MAX_PARTICIPANTS</tt>, <tt>MIN_PARTICIPANTS</tt> is a positive
integer and <tt>MAX_PARTICIPANTS</tt> is a positive integer less than the group order.
A signer participant, or simply participant, is an entity that is trusted to hold and
use a signing key share. The Coordinator is an entity with the following responsibilities:</t>
      <ol spacing="normal" type="1"><li>Determining which participants will participate (at least MIN_PARTICIPANTS 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 that all participants, including the Coordinator and the set of participants,
are chosen externally 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>FROST produces signatures that are indistinguishable from those produced with a single
participant using a signing key <tt>s</tt> with corresponding public key <tt>PK</tt>, where <tt>s</tt> is a Scalar
value and <tt>PK = G.ScalarMultBase(s)</tt>. As a threshold signing protocol, the group signing
key <tt>s</tt> is secret-shared amongst each participant and used to produce signatures. In particular,
FROST assumes each participant is configured with the following information:</t>
      <ul spacing="normal">
        <li>An identifier, which is a Scalar value denoted <tt>i</tt> in the range <tt>[1, MAX_PARTICIPANTS]</tt>
and MUST be distinct from the identifier of every other participant.</li>
        <li>A signing key share <tt>sk_i</tt>, which is a Scalar value representing the i-th secret share
of the group signing key <tt>s</tt>. The public key corresponding to this signing key share
is <tt>PK_i = G.ScalarMultBase(sk_i)</tt>.</li>
      </ul>
      <t>Each participant, including the Coordinator, is additionally configured
with common group information, denoted "group info," which consists of the following
information:</t>
      <ul spacing="normal">
        <li>Group public key, which is an <tt>Element</tt> in <tt>G</tt> denoted <tt>PK</tt>.</li>
        <li>Public keys <tt>PK_i</tt> for each signer, which are <tt>Element</tt> values in <tt>G</tt> denoted <tt>PK_i</tt>
for each <tt>i</tt> in <tt>[1, MAX_PARTICIPANTS]</tt>.</li>
      </ul>
      <t>This document does not specify how this information, including the signing key shares,
are configured and distributed to participants. In general, two possible configuration
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>The signing variant of FROST in this document requires participants 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 participants 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) ==
            | participant commitment |                 |
            |<-----------------------+                 |
            |          ...                             |
            | participant commitment            (commit state) ==\
            |<-----------------------------------------+         |
                                                                 |
      == Round 2 (Signature Share Generation) ==                 |
            |                                                    |
            |   participant input    |                 |         |
            +------------------------>                 |         |
            |     signature share    |                 |         |
            |<-----------------------+                 |         |
            |          ...                             |         |
            |    participant 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"/>. Note that each participant persists some state between
both rounds, and this state is deleted as 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 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 participant generating nonces and their corresponding public commitments.
A nonce is a pair of Scalar values, and a commitment is a pair of Element values. Each participant's
behavior in this round is described by the <tt>commit</tt> function below. Note that this function
invokes <tt>nonce_generate</tt> twice, once for each type of nonce produced. The output of this function is
a pair of secret nonces <tt>(hiding_nonce, binding_nonce)</tt> and their corresponding public commitments
<tt>(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 outputs <tt>nonce</tt> and <tt>comm</tt> from participant <tt>P_i</tt> should both be stored locally and
kept for use in the second round. The <tt>nonce</tt> value is secret and MUST NOT be shared, whereas
the public output <tt>comm</tt> is sent to the Coordinator. The nonce values produced by this
function MUST NOT be reused in more than one invocation of FROST, and it MUST be generated
from a source of secure randomness.</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 participants will participate (of number at least MIN_PARTICIPANTS). 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 participant the message to be signed along with the
set of signing commitments for all participants in the participant list. Each participant
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 participant MUST ensure that their identifier as
well as their commitment as from the first round appears in commitment_list.
Applications which require that participants 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 participant. 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 participant and sent by the Coordinator.
    Each element in the list indicates the participant 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 participant 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 participant then sends
these shares back to the Coordinator. Each participant 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, participants
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 participants perform round two and send their signature shares to the Coordinator,
the Coordinator verifies each signature share for correctness. In particular,
for each participant, 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 participant. Note: identifier MUST never equal 0.
  - PK_i, the public key for the ith participant, 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 participant.
  - sig_share_i, a Scalar value indicating the signature share as produced in
    round two from the ith participant.
  - commitment_list =
      [(j, hiding_nonce_commitment_j, binding_nonce_commitment_j), ...], a
    list of commitments issued in Round 1 by each participant, where each element
    in the list indicates the participant 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 participant 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 + G.ScalarMult(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 + G.ScalarMult(PK_i, challenge * lambda_i)

    return l == r
]]></artwork>
        <t>If any signature share fails to verify, i.e., if verify_signature_share returns False for
any participant share, the Coordinator MUST abort the protocol for correctness reasons
(this is true regardless of the size or makeup of the signing set selected by
the Coordinator).
Excluding one participant means that their nonce will not be included in the joint response <tt>z</tt>
and consequently the output signature will not verify. This is because the
group commitment will be with respect to a different signing set than the
the aggregated response.</t>
        <t>Otherwise, if all shares from participants that participated in Rounds 1 and 2 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 participant,
    of length NUM_PARTICIPANTS, where MIN_PARTICIPANTS <= NUM_PARTICIPANTS <= MAX_PARTICIPANTS.

  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.
Each ciphersuite also includes a context string, denoted <tt>contextString</tt>,
which is an ASCII string literal (with no NULL terminating character).</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
participant.</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 "FROST-ED25519-SHA512-v8".</t>
        <ul spacing="normal">
          <li>
            <t>Group: edwards25519 <xref target="RFC8032"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 2^252 + 27742317777372353535851937790883648493 (see <xref target="RFC7748"/>)</li>
              <li>Identity(): As defined in <xref target="RFC7748"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented as specified in <xref section="5.1.2" sectionFormat="comma" target="RFC8032"/>.</li>
              <li>DeserializeElement(buf): 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(s): Implemented by outputting the little-endian 32-byte encoding of
the Scalar value with the top three bits set to zero.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a
little-endian 32-byte string. This function can fail if the input does not
represent a Scalar in the range [0, <tt>G.Order()</tt> - 1]. Note that this means the
top three bits of the input MUST be zero.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-512
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented by computing H(contextString || "rho" || m), interpreting the 64-byte digest
as a little-endian integer, and reducing the resulting integer modulo
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
2^252+27742317777372353535851937790883648493.</li>
              <li>H3(m): Implemented by computing H(contextString || "nonce" || m), interpreting the 64-byte digest
as a little-endian integer, and reducing the resulting integer modulo
2^252+27742317777372353535851937790883648493.</li>
              <li>H4(m): Implemented by computing H(contextString || "msg" || m).</li>
              <li>H5(m): Implemented by computing H(contextString || "com" || m).</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 equation [8][S]B = [8]R + [8][k]A'.
The alternative check [S]B = R + [k]A' is not safe or interoperable in practice.
Note that optimizations for this check exist; see <xref target="Pornin22"/>.</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-v8".</t>
        <ul spacing="normal">
          <li>
            <t>Group: ristretto255 <xref target="RISTRETTO"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 2^252 + 27742317777372353535851937790883648493 (see <xref target="RISTRETTO"/>)</li>
              <li>Identity(): As defined in <xref target="RISTRETTO"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented using the 'Encode' function from <xref target="RISTRETTO"/>.</li>
              <li>DeserializeElement(buf): Implemented using the 'Decode' function from <xref target="RISTRETTO"/>.
Additionally, this function validates that the resulting element is not the group
identity element.</li>
              <li>SerializeScalar(s): Implemented by outputting the little-endian 32-byte encoding of
the Scalar value with the top three bits set to zero.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a
little-endian 32-byte string. This function can fail if the input does not
represent a Scalar in the range [0, <tt>G.Order()</tt> - 1]. Note that this means the
top three bits of the input MUST be zero.</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-512
            </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 || "nonce" || m) and mapping the
output to a Scalar as described in <xref section="4.4" sectionFormat="comma" target="RISTRETTO"/>.</li>
              <li>H4(m): Implemented by computing H(contextString || "msg" || m).</li>
              <li>H5(m): Implemented by computing H(contextString || "com" || m).</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 "FROST-ED448-SHAKE256-v8".</t>
        <ul spacing="normal">
          <li>
            <t>Group: edwards448 <xref target="RFC8032"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885</li>
              <li>Identity(): As defined in <xref target="RFC7748"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented as specified in <xref section="5.2.2" sectionFormat="comma" target="RFC8032"/>.</li>
              <li>DeserializeElement(buf): 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(s): Implemented by outputting the little-endian 48-byte encoding of
the Scalar value.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a
little-endian 48-byte string. This function can fail if the input does not
represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHAKE256
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented by computing H(contextString || "rho" || m), interpreting the
114-byte digest as a little-endian integer, and reducing the resulting integer modulo
2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
              <li>H2(m): Implemented by computing H("SigEd448" || 0 || 0 || m), interpreting
the 114-byte digest as a little-endian integer, and reducing the resulting integer
modulo 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
              <li>H3(m): Implemented by computing H(contextString || "nonce" || m), interpreting the
114-byte digest as a little-endian integer, and reducing the resulting integer modulo
2^446 - 13818066809895115352007386748515426880336692474882178609894547503885.</li>
              <li>H4(m): Implemented by computing H(contextString || "msg" || m).</li>
              <li>H5(m): Implemented by computing H(contextString || "com" || m).</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 equation [4][S]B = [4]R + [4][k]A'.
The alternative check [S]B = R + [k]A' is not safe or interoperable in practice.
Note that optimizations for this check exist; see <xref target="Pornin22"/>.</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-v8".</t>
        <ul spacing="normal">
          <li>
            <t>Group: P-256 (secp256r1) <xref target="x9.62"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551</li>
              <li>Identity(): As defined in <xref target="x9.62"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SEC1"/>, yielding a 33 byte output.</li>
              <li>DeserializeElement(buf): Implemented by attempting to deserialize a 33 byte input string to
a public key using the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>,
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(s): Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SEC1"/>.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a 32-byte
string using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the
input does not represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-256
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "rho",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H2(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "chal",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H3(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "nonce",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H4(m): Implemented by computing H(contextString || "msg" || m).</li>
              <li>H5(m): Implemented by computing H(contextString || "com" || m).</li>
            </ul>
          </li>
        </ul>
        <t>Signature verification is as specified in <xref target="prime-order-verify"/>.</t>
      </section>
      <section anchor="frostsecp256k1-sha-256">
        <name>FROST(secp256k1, SHA-256)</name>
        <t>This ciphersuite uses secp256k1 for the Group and SHA-256 for the Hash function <tt>H</tt>.
The value of the contextString parameter is "FROST-secp256k1-SHA256-v8".</t>
        <ul spacing="normal">
          <li>
            <t>Group: secp256k1 <xref target="SEC2"/>
            </t>
            <ul spacing="normal">
              <li>Order(): Return 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551</li>
              <li>Identity(): As defined in <xref target="SEC2"/>.</li>
              <li>RandomScalar(): Implemented by returning a uniformly random Scalar in the range
[0, <tt>G.Order()</tt> - 1]. Refer to <xref target="random-scalar"/> for implementation guidance.</li>
              <li>SerializeElement(A): Implemented using the compressed Elliptic-Curve-Point-to-Octet-String
method according to <xref target="SEC1"/>.</li>
              <li>DeserializeElement(buf): Implemented by attempting to deserialize a public key using
the compressed Octet-String-to-Elliptic-Curve-Point method according to <xref target="SEC1"/>,
and then performs partial public-key validation as defined in section 3.2.2.1 of
<xref target="SEC1"/>. 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(s): Implemented using the Field-Element-to-Octet-String conversion
according to <xref target="SEC1"/>.</li>
              <li>DeserializeScalar(buf): Implemented by attempting to deserialize a Scalar from a 32-byte
string using Octet-String-to-Field-Element from <xref target="SEC1"/>. This function can fail if the
input does not represent a Scalar in the range [0, <tt>G.Order()</tt> - 1].</li>
            </ul>
          </li>
          <li>
            <t>Hash (<tt>H</tt>): SHA-256
            </t>
            <ul spacing="normal">
              <li>H1(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "rho",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H2(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "chal",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H3(m): Implemented as hash_to_field(m, 1) from <xref section="5.2" sectionFormat="comma" target="HASH-TO-CURVE"/>
using <tt>expand_message_xmd</tt> with SHA-256 with parameters DST = contextString || "nonce",
F set to the scalar field, p set to <tt>G.Order()</tt>, m = 1, and L = 48.</li>
              <li>H4(m): Implemented by computing H(contextString || "msg" || m).</li>
              <li>H5(m): Implemented by computing H(contextString || "com" || m).</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_PARTICIPANTS-1)</tt> corrupted participants. So long as an adversary
corrupts fewer than <tt>MIN_PARTICIPANTS</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 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><xref target="dep-nonces"/> describes the procedure that participants use to produce nonces during
the first round of singing. The randomness produced in this procedure MUST be sampled
uniformly at random. The resulting nonces produced via <tt>nonce_generate</tt> are indistinguishable
from values sampled uniformly at random. This requirement is necessary to avoid
replay attacks initiated by other participants, which allow for a complete key-recovery attack.
The Coordinator MAY further hedge against nonce reuse attacks by tracking participant 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 participants 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, participants 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 participants, each participant 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="pre-hashing">
        <name>Input Message Hashing</name>
        <t>FROST signatures do not pre-hash message inputs. This means that the entire message
must be known in advance of invoking the signing protocol. Applications can apply
pre-hashing in settings where storing the full message is prohibitively expensive.
In such cases, pre-hashing MUST use a collision-resistant hash function with a security
level commensurate with the security in inherent to the ciphersuite chosen. It is
RECOMMENDED that applications which choose to apply pre-hashing use the hash function
(<tt>H</tt>) associated with the chosen ciphersuite in a manner similar to how <tt>H4</tt> is defined.
In particular, a different prefix SHOULD be used to differentiate this pre-hash from
<tt>H4</tt>. One possible example is to construct this pre-hash over message <tt>m</tt> as
<tt>H(contextString \|\| "pre-hash" \|\| m)</tt>.</t>
      </section>
      <section anchor="message-validation">
        <name>Input Message Validation</name>
        <t>Some applications may require that participants only process messages of a certain
structure. For example, in digital currency applications wherein multiple
participants may collectively sign a transaction, it is reasonable to require that
each participant check the input message to be a syntactically valid transaction.</t>
        <t>As another example, use of threshold signatures in <xref target="TLS"/> to produce
signatures of transcript hashes might require the participants receive the source
handshake messages themselves, and recompute the transcript hash which is used
as input message to the signature generation process, so that they can verify
that they are signing a proper TLS transcript hash and not some other data.</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 participants
do not operate as signing oracles for arbitrary messages.</t>
      </section>
    </section>
    <section anchor="contributors">
      <name>Contributors</name>
    </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>ANS</organization>
            </author>
            <date year="2005" month="November"/>
          </front>
          <seriesInfo name="ANS" value="X9.62-2005"/>
        </reference>
        <reference anchor="SEC1" 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="SEC2" target="https://secg.org/sec2-v2.pdf">
          <front>
            <title>Recommended Elliptic Curve Domain Parameters, Standards for Efficient Cryptography Group, ver. 2</title>
            <author>
              <organization/>
            </author>
            <date year="2010"/>
          </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" initials="H." surname="de Valence">
         </author>
            <author fullname="Jack Grigg" initials="J." surname="Grigg">
         </author>
            <author fullname="Mike Hamburg" initials="M." surname="Hamburg">
         </author>
            <author fullname="Isis Lovecruft" initials="I." surname="Lovecruft">
         </author>
            <author fullname="George Tankersley" initials="G." surname="Tankersley">
         </author>
            <author fullname="Filippo Valsorda" initials="F." surname="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-Hernández" initials="A." surname="Faz-Hernández">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Sam Scott" initials="S." surname="Scott">
              <organization>Cornell Tech</organization>
            </author>
            <author fullname="Nick Sullivan" initials="N." surname="Sullivan">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Riad S. Wahby" initials="R. S." surname="Wahby">
              <organization>Stanford University</organization>
            </author>
            <author fullname="Christopher A. Wood" initials="C. A." surname="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="Pornin22" target="https://eprint.iacr.org/2022/1164.pdf">
          <front>
            <title>Point-Halving and Subgroup Membership in Twisted Edwards Curves</title>
            <author initials="T." surname="Pornin" fullname="Thomas Pornin">
              <organization/>
            </author>
            <date year="2022" month="September" day="06"/>
          </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.
In addition, the authors of this document would like to thank
Isis Lovecruft,
Alden Torres,
T. Wilson-Brown,
and Conrado Gouvea
for their inputs and contributions.</t>
    </section>
    <section anchor="prime-order-verify">
      <name>Schnorr Signature Generation and Verification for Prime-Order Groups</name>
      <t>This section contains descriptions of functions for generating and verifying Schnorr signatures.
It is included to complement the routines present in <xref target="RFC8032"/> for prime-order groups, including
ristretto255, P-256, and secp256k1. The functions for generating and verifying signatures are
<tt>prime_order_sign</tt> and <tt>prime_order_verify</tt>, respectively.</t>
      <t>The function <tt>prime_order_sign</tt> produces a Schnorr signature over a message given a full secret signing
key as input (as opposed to a key share.)</t>
      <artwork><![CDATA[
  prime_order_sign(msg, sk):
``

  Inputs:
  - msg, message to sign, a byte string
  - sk, secret key, a Scalar

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

  def prime_order_sign(msg, sk):
    r = G.RandomScalar()
    R = G.ScalarBaseMult(r)
    PK = G.ScalarBaseMult(sk)
    comm_enc = G.SerializeElement(R)
    pk_enc = G.SerializeElement(PK)
    challenge_input = comm_enc || pk_enc || msg
    c = H2(challenge_input)
    z = r + (c * sk) // Scalar addition and multiplication
    return (R, z)
]]></artwork>
      <t>The function <tt>prime_order_verify</tt> verifies 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 + G.ScalarMult(PK, c)
    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 s, denoted <tt>s_i</tt> for <tt>i = 0, ..., MAX_PARTICIPANTS</tt>, to be sent to all <tt>MAX_PARTICIPANTS</tt> participants.
This operation is specified in the <tt>trusted_dealer_keygen</tt> algorithm. The mathematical relation
between the secret key <tt>s</tt> and the <tt>MAX_SIGNER</tt> secret shares is formalized in the <tt>secret_share_combine(shares)</tt>
algorithm, defined in <xref target="dep-shamir"/>.</t>
      <t>The dealer that performs <tt>trusted_dealer_keygen</tt> 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:
  - secret_key, a group secret, a Scalar, that MUST be derived from at least Ns bytes of entropy
  - MAX_PARTICIPANTS, the number of shares to generate, an integer
  - MIN_PARTICIPANTS, the threshold of the secret sharing scheme, an integer

  Outputs:
  - participant_private_keys, MAX_PARTICIPANTS shares of the secret key s, each a tuple
    consisting of the participant identifier and the key share (a Scalar).
  - group_public_key, public key corresponding to the group signing key, an
    Element in G.
  - 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(secret_key, MAX_PARTICIPANTS, MIN_PARTICIPANTS):
    # Generate random coefficients for the polynomial
    coefficients = []
    for i in range(0, MIN_PARTICIPANTS - 1):
      coefficients.append(G.RandomScalar())
    participant_private_keys, coefficients = secret_share_shard(secret_key, coefficients, MAX_PARTICIPANTS, MIN_PARTICIPANTS)
    vss_commitment = vss_commit(coefficients):
    return participant_private_keys, vss_commitment[0], vss_commitment
]]></artwork>
      <t>It is assumed the dealer then sends one secret key share to each of the <tt>NUM_PARTICIPANTS</tt> 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_PARTICIPANTS</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_PARTICIPANTS, MIN_PARTICIPANTS):

  Inputs:
  - s, secret value to be shared, a Scalar
  - coefficients, an array of size MIN_PARTICIPANTS - 1 with randomly generated
    Scalars, not including the 0th coefficient of the polynomial
  - MAX_PARTICIPANTS, the number of shares to generate, an integer less than 2^16
  - MIN_PARTICIPANTS, the threshold of the secret sharing scheme, an integer greater than 0

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

  Errors:
  - "invalid parameters", if MIN_PARTICIPANTS > MAX_PARTICIPANTS or if MIN_PARTICIPANTS is less than 2

  def secret_share_shard(s, coefficients, MAX_PARTICIPANTS, MIN_PARTICIPANTS):
    if MIN_PARTICIPANTS > MAX_PARTICIPANTS:
      raise "invalid parameters"
    if MIN_PARTICIPANTS < 2:
      raise "invalid parameters"

    # Prepend the secret to the coefficients
    coefficients = [s] + coefficients

    # Evaluate the polynomial for each point x=1,...,n
    secret_key_shares = []
    for x_i in range(1, MAX_PARTICIPANTS + 1):
      y_i = polynomial_evaluate(Scalar(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_PARTICIPANTS</tt> to recover the
secret <tt>s</tt> is as follows; the algorithm <tt>polynomial_interpolation is defined in {{dep-polynomial-interpolate}}</tt>.</t>
        <artwork><![CDATA[
  secret_share_combine(shares):

  Inputs:
  - shares, a list of at minimum MIN_PARTICIPANTS secret shares, each a tuple (i, f(i))
    where i and f(i) are Scalars

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

  Errors:
  - "invalid parameters", if fewer than MIN_PARTICIPANTS input shares are provided

  def secret_share_combine(shares):
    if len(shares) < MIN_PARTICIPANTS:
      raise "invalid parameters"
    s = polynomial_interpolation(shares)
    return s
]]></artwork>
        <section anchor="dep-polynomial-interpolate">
          <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 distinct 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):
    x_coords = []
    for point in points:
      x_coords.append(point.x)

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

    return f_zero
]]></artwork>
        </section>
      </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 ensures 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 at most <tt>MIN_PARTICIPANTS-1</tt> is as follows.</t>
        <artwork><![CDATA[
  vss_commit(coeffs):

  Inputs:
  - coeffs, a vector of the MIN_PARTICIPANTS 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, vss_commitment)
    (i, sk_i) = share_i
    S_i = ScalarBaseMult(sk_i)
    S_i' = G.Identity()
    for j in range(0, MIN_PARTICIPANTS):
      S_i' += G.ScalarMult(vss_commitment[j], pow(i, j))
    if S_i == S_i':
      return 1
    return 0
]]></artwork>
        <t>We now define how the Coordinator and participants can derive group info,
which is an input into the FROST signing protocol.</t>
        <artwork><![CDATA[
    derive_group_info(MAX_PARTICIPANTS, MIN_PARTICIPANTS, vss_commitment):

    Inputs:
    - MAX_PARTICIPANTS, the number of shares to generate, an integer
    - MIN_PARTICIPANTS, 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.
    - participant_public_keys, a list of MAX_PARTICIPANTS public keys PK_i for i=1,...,MAX_PARTICIPANTS,
      where each PK_i is the public key, an Element, for participant i.

    derive_group_info(MAX_PARTICIPANTS, MIN_PARTICIPANTS, vss_commitment)
      PK = vss_commitment[0]
      participant_public_keys = []
      for i in range(1, MAX_PARTICIPANTS+1):
        PK_i = G.Identity()
        for j in range(0, MIN_PARTICIPANTS):
          PK_i += G.ScalarMult(vss_commitment[j], pow(i, j))
        participant_public_keys.append(PK_i)
      return PK, participant_public_keys
]]></artwork>
      </section>
    </section>
    <section anchor="random-scalar">
      <name>Random Scalar Generation</name>
      <t>Two popular algorithms for generating a random integer uniformly distributed in
the range [0, G.Order() -1] are as follows:</t>
      <section anchor="rejection-sampling">
        <name>Rejection Sampling</name>
        <t>Generate a random byte array with <tt>Ns</tt> bytes, and attempt to map to a Scalar
by calling <tt>DeserializeScalar</tt> in constant time. If it succeeds, return the
result. If it fails, try again with another random byte array, until the
procedure succeeds. Failure to implement this in constant time can leak information
about the underlying corresponding Scalar.</t>
        <t>Note the that the Scalar size might be some bits smaller than the array size,
which can result in the loop iterating more times than required. In that case
it's acceptable to set the high-order bits to 0 before calling <tt>DeserializeScalar</tt>,
but care must be taken to not set to zero more bits than required. For example,
in the <tt>FROST(Ed25519, SHA-512)</tt> ciphersuite, the order has 253 bits while
the array has 256; thus the top 3 bits of the last byte can be set to zero.</t>
      </section>
      <section anchor="wide-reduction">
        <name>Wide Reduction</name>
        <t>Generate a random byte array with <tt>l = ceil(((3 * ceil(log2(G.Order()))) / 2) / 8)</tt>
bytes, and interpret it as an integer; reduce the integer modulo <tt>G.Order()</tt> and return the
result. See <xref section="5" sectionFormat="of" target="HASH-TO-CURVE"/> for the underlying derivation of <tt>l</tt>.</t>
      </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_PARTICIPANTS, MIN_PARTICIPANTS, and NUM_PARTICIPANTS.</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. The randomly generated coefficients produced by the
trusted dealer to share the group signing secret are also listed. Each coefficient
is identified by its index, e.g., <tt>share_polynomial_coefficients[1]</tt> is the coefficient
of the first term in the polynomial. Note that the 0-th coefficient is omitted as this
is equal to the group secret key. All values are encoded as hexadecimal strings.</li>
        <li>Signer input parameters. This lists the signing key share for each of the
NUM_PARTICIPANTS participants.</li>
        <li>Round one parameters and outputs. This lists the NUM_PARTICIPANTS participants engaged
in the protocol, identified by their integer identifier, and for each participant:
the hiding and binding commitment values produced in <xref target="frost-round-one"/>; the randomness
values used to derive the commitment nonces in <tt>nonce_generate</tt>; 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_PARTICIPANTS 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_PARTICIPANTS: 3
MIN_PARTICIPANTS: 2
NUM_PARTICIPANTS: 2

// Group input parameters
group_secret_key: 7b1c33d3f5291d85de664833beb1ad469f7fb6025a0ec78b3a7
90c6e13a98304
group_public_key: 15d21ccd7ee42959562fc8aa63224c8851fb3ec85a3faf66040
d380fb9738673
message: 74657374
share_polynomial_coefficients[1]: 178199860edd8c62f5212ee91eff1295d0d
670ab4ed4506866bae57e7030b204

// Signer input parameters
P1 participant_share: 929dcc590407aae7d388761cddb0c0db6f5627aea8e217f
4a033f2ec83d93509
P2 participant_share: a91e66e012e4364ac9aaa405fcafd370402d9859f7b6685
c07eed76bf409e80d
P3 participant_share: d3cb090a075eb154e82fdb4b3cb507f110040905468bb9c
46da8bdea643a9a02

// Round one parameters
participant_list: 1,3

// Signer round one outputs
P1 hiding_nonce_randomness: 5c8f4d74076647069566b460154525c0d80bf278a
49ef0da7e5b56ab1cceac08
P1 binding_nonce_randomness: 90cda7316703b5f5e0c890ac456a1f64c0db1e9b
025493b50f795a38ec373b69
P1 hiding_nonce: 8fa57cf7b4f6476d1f0ee1ee972ea9acc79633fc6a46a1ab7223
4e8f4cc65b00
P1 binding_nonce: 305458d8109e95c71d5e61fb985a8e00126276dcd02ba9814fa
2a5674f36f70d
P1 hiding_nonce_commitment: 9edff055e77f1b7addf4bf48a58beea392a0032ac
f2744196c61f3b3c3b1cb47
P1 binding_nonce_commitment: 4a03fb80acea2712f2ff1548e990457cdd58fb17
1a69f70fcdf53d1b0ea83008
P1 binding_factor_input: 25120720c3a416e292edfb0510780bc84eb734347a5f
d84dd46d0dcbf3a21d21a23a776628859678a968acc8c8564c4641a1fd4b29a12d536
7ca12ab10b6b497c2385b35930a34d98238021b25ab0641e39f8cf4277f90e3c03161
b1755e7b08b7c5e5334a57e89c5e841186e9cca95214851ed99dcbd07f104fc399194
fd8dc0100000000000000000000000000000000000000000000000000000000000000
P1 binding_factor: febb7ae5b20ffe3c1d2bcf08f7e6104a78b3136ad3b7df35d5
f84878ce7bb50d
P3 hiding_nonce_randomness: a85d5ce57b709e59b07b1fefc80a50a928b409881
7e482fa38f831ab453da14d
P3 binding_nonce_randomness: b74a04b3a7e7311c974204c1e142952d1e93cb1e
e0791c90126d2c4eb375e0e1
P3 hiding_nonce: 59b0da2f402a69956b4c904737afefe29ef0aaa4401330f56dec
ebe450204a08
P3 binding_nonce: 1a54642c6b975f1b39a1b391bebc4f72b6dc6ca551cbebedee6
ce5a60069fd0d
P3 hiding_nonce_commitment: 5e11b65802153b03332533a3018d22fe760098508
a250832a457e6004848411b
P3 binding_nonce_commitment: 9ef535b69175da3833d330c1a43823b4b08dc1fb
38fdc3af99f6804d8b250a09
P3 binding_factor_input: 25120720c3a416e292edfb0510780bc84eb734347a5f
d84dd46d0dcbf3a21d21a23a776628859678a968acc8c8564c4641a1fd4b29a12d536
7ca12ab10b6b497c2385b35930a34d98238021b25ab0641e39f8cf4277f90e3c03161
b1755e7b08b7c5e5334a57e89c5e841186e9cca95214851ed99dcbd07f104fc399194
fd8dc0300000000000000000000000000000000000000000000000000000000000000
P3 binding_factor: 6662bfe16e045aba72954ef54b6dabfc61db322698b57d5a40
94b39d4ce01f05

// Round two parameters
participant_list: 1,3

// Signer round two outputs
P1 sig_share: d21fd9d6f793c8efef622ae139ec94071dc1b1f47624f638f4f8615
e1934bc09
P3 sig_share: 7b599a881fc39829b2f69b194fd64bd6ee0df8b34e3d067be5612fa
c4da8ac0b

sig: 7c64be7528effeab65503e813ee28f94c53a4d8e45a0a71e936c840c78e42233
60a57d02fdf34ec1cbbcce57aac801c90bcfa9a8c561fcb3d95a910a67dc6805
]]></artwork>
      </section>
      <section anchor="frosted448-shake256-1">
        <name>FROST(Ed448, SHAKE256)</name>
        <artwork><![CDATA[
// Configuration information
MAX_PARTICIPANTS: 3
MIN_PARTICIPANTS: 2
NUM_PARTICIPANTS: 2

// Group input parameters
group_secret_key: 6298e1eef3c379392caaed061ed8a31033c9e9e3420726f23b4
04158a401cd9df24632adfe6b418dc942d8a091817dd8bd70e1c72ba52f3c00
group_public_key: 3832f82fda00ff5365b0376df705675b63d2a93c24c6e81d408
01ba265632be10f443f95968fadb70d10786827f30dc001c8d0f9b7c1d1b000
message: 74657374
share_polynomial_coefficients[1]: dbd7a514f7a731976620f0436bd135fe8dd
dc3fadd6e0d13dbd58a1981e587d377d48e0b7ce4e0092967c5e85884d0275a7a740b
6abdcd0500

// Signer input parameters
P1 participant_share: 4a2b2f5858a932ad3d3b18bd16e76ced3070d72fd79ae44
02df201f525e754716a1bc1b87a502297f2a99d89ea054e0018eb55d39562fd0100
P2 participant_share: 2503d56c4f516444a45b080182b8a2ebbe4d9b2ab509f25
308c88c0ea7ccdc44e2ef4fc4f63403a11b116372438a1e287265cadeff1fcb0700
P3 participant_share: 00db7a8146f995db0a7cf844ed89d8e94c2b5f259378ff6
6e39d172828b264185ac4decf7219e4aa4478285b9c0eef4fccdf3eea69dd980d00

// Round one parameters
participant_list: 1,3

// Signer round one outputs
P1 hiding_nonce_randomness: b5eb1b4e369491e7d09427b01285803215bbc4c44
0edebf8a337bfa3bc75a931
P1 binding_nonce_randomness: c73b102813418576607ed61e726233f5df303f96
38af479b05fbc8dda6739eeb
P1 hiding_nonce: aa4606f9b2e5cf331e473833087769579685c4582a80ae45b01e
3ffe83c0455b6f0eb05b320db0de0223509e8f8d30f356173b1ff2383a0100
P1 binding_nonce: 90c118161d17804126d474af8cc1e2358319b704b8adb4088a8
a36a3f48e8ec1c6b5106d394a36bd9e62d7dd7ee2a9978c866931d8da792300
P1 hiding_nonce_commitment: 55d2fe1b9b91d8bd8511417ff9b315c752944acdf
a483f134d2004c441bf6da055219dd0632ccaf8f35970fac9bea116f7269855833453
9800
P1 binding_nonce_commitment: 8ac0e4cf4d9fb584d5372d963341d6144d5d0310
b6029c34c7c7a2bba4b259a3bb803da16e024764de4612aafc8d63d48f4e2a97df3f4
0e800
P1 binding_factor_input: 766a004ac6e87a2fa70f2095b19596ac33b94e2f6803
e1a5b8fa8ea5adaf3e7989b2c167a38a42a1693ad69cfd674e089a498672753563d53
54654ba106d5fdffb134a8917fae91d412164436f734b95572af6208605744400c6ff
9a60fa2ce8fb7f3213414c32e347ee2e29e3d17654ef0277d99dbfcd70bf9162c46ca
7f45754d1eabb8ab239f4fb88cc8af91e5f1af5d81f1f2f8dfb564c6ddb0a75bdf681
b2f403d7d903000c647602978b2e714360a3847ca469b932d4dcdff6ea421c27a382c
c230625e7c9b45e662056ef73687412f705f77fc4bc20e3d902888c02c2fd2ff07801
000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000
P1 binding_factor: 4d58a6a888309da8b8d2d2068a44ad3c597591b1b806cc8ac1
2d2c1202c66ae9c4e68b6bfd2ef3b3a5968a288fa5a2aed86161ebeb2aa60e00
P3 hiding_nonce_randomness: 516a0e41f6b2f1f9a6661b5549db7486c6073249b
6dcc5bbdca69e7fd6bcbd12
P3 binding_nonce_randomness: 28f89d1c037cf61ccd08f7e06fa2289bb5a31a60
5455bad6bec61923d60fe811
P3 hiding_nonce: 4fd3566260ecc3f57f1cfb7c84724d2fc80f90dab5ee3613eb9b
278e71fd9d88c8dae06ec1bbf2fd535ec3fca393dd011d63ee5c3db7383000
P3 binding_nonce: c0a583112b13e238f249bac41a01ccb1ad679c4feaab14fc7ab
0df3511066cd117fadfc1ec3a0fd31820e8857943675262ebc5d16194cd2300
P3 hiding_nonce_commitment: 148325fe0941216938cd6bcbe45a68c3184b1f087
1f2b17f3bbdc4e2aef9c03d27845bd6f45c05a810b0dd2582af3e11518015405a4ffb
d480
P3 binding_nonce_commitment: 2a34a68cfb05f20f0e2437daf4480cbafdab3243
9a6798c1f7b36e0e47714c570242ef8972914ec65b8ed49784dc62fbdc8f7838faa75
63700
P3 binding_factor_input: 766a004ac6e87a2fa70f2095b19596ac33b94e2f6803
e1a5b8fa8ea5adaf3e7989b2c167a38a42a1693ad69cfd674e089a498672753563d53
54654ba106d5fdffb134a8917fae91d412164436f734b95572af6208605744400c6ff
9a60fa2ce8fb7f3213414c32e347ee2e29e3d17654ef0277d99dbfcd70bf9162c46ca
7f45754d1eabb8ab239f4fb88cc8af91e5f1af5d81f1f2f8dfb564c6ddb0a75bdf681
b2f403d7d903000c647602978b2e714360a3847ca469b932d4dcdff6ea421c27a382c
c230625e7c9b45e662056ef73687412f705f77fc4bc20e3d902888c02c2fd2ff07803
000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000
P3 binding_factor: 7bfb1317cd530ba478544ee911687d0d0fa5e4c49e40a79347
2601f9c587440478eebb90bbec84c98055783a32e442a3b40503b2a9389d3d00

// Round two parameters
participant_list: 1,3

// Signer round two outputs
P1 sig_share: d982cdbb5d14fb53c8cb28cfb690ec38fc4f8f44c666de910703ee7
ba2183989286c614c9bb5319a3a70bf22ee68ca54b3a6b90f33a33a1a00
P3 sig_share: adc2d8301b5f5597af72c51cce53ab6d265e8e788ce4738b1e2fbdc
e24eaa283b0bfbd7b587a407844c20e958c21a5ba9895b51fdfbb3e3700

sig: 22943fef7107155064b0baa1d6ad78ee6c5d909ca88ac8bd1002bde99e124a34
514f826d24d83fbdecf7752be1fd166fd31752fd4eb3a3280093004e41e6b0d7c722a
f285e12222b859277470e097003593c0ee1cdc702dc0cd92b1fc8f32f72127f32ceb7
7a8a6f0f4c3c6f2f125f791100
]]></artwork>
      </section>
      <section anchor="frostristretto255-sha-512">
        <name>FROST(ristretto255, SHA-512)</name>
        <artwork><![CDATA[
// Configuration information
MAX_PARTICIPANTS: 3
MIN_PARTICIPANTS: 2
NUM_PARTICIPANTS: 2

// Group input parameters
group_secret_key: 1b25a55e463cfd15cf14a5d3acc3d15053f08da49c8afcf3ab2
65f2ebc4f970b
group_public_key: e2a62f39eede11269e3bd5a7d97554f5ca384f9f6d3dd9c3c0d
05083c7254f57
message: 74657374
share_polynomial_coefficients[1]: 410f8b744b19325891d73736923525a4f59
6c805d060dfb9c98009d34e3fec02

// Signer input parameters
P1 participant_share: 5c3430d391552f6e60ecdc093ff9f6f4488756aa6cebdba
d75a768010b8f830e
P2 participant_share: b06fc5eac20b4f6e1b271d9df2343d843e1e1fb03c4cbb6
73f2872d459ce6f01
P3 participant_share: f17e505f0e2581c6acfe54d3846a622834b5e7b50cad9a2
109a97ba7a80d5c04

// Round one parameters
participant_list: 1,3

// Signer round one outputs
P1 hiding_nonce_randomness: b8f4ed5c201cb19151d091945eb0011db6bf4b816
debfc21fc6833a99dca87b8
P1 binding_nonce_randomness: 2588621bdf623b8a687f4def4f4f720b8da24f6b
15c64a2a11dc74ffa04c9c02
P1 hiding_nonce: 05a9f136274e02107502f5073e91b72bd42165f277d524b2eb3f
9c6fa7a38a08
P1 binding_nonce: 8fe91bee76721535b6ac5b84ea5474892cb476404217a9b6129
d1974cd211703
P1 hiding_nonce_commitment: 4ce0c9d3de33b7876122a3490cef6a5b8cc22acc2
9e96195629b5b8cfb1b784f
P1 binding_nonce_commitment: 26d80e82877fd0fd78a803996bf4847ee9d1ffd8
0072c9f16d34c5dde4138115
P1 binding_factor_input: fe9082dcc1ae1ae11380ac4cf0b6e2770af565ff5af9
016254dc7c9d4869cbae0f6e4d94b23e5781b91bc74a25e0c773446b2640290d07c83
f0b067ff870a801f846633bc5505172ee8dc7bb109916b61ea54ddc715684bb50f612
8cec164ab16da6bcebddb83b78493ef85fca52ca460199609523f3eb877d46c399d28
a00900100000000000000000000000000000000000000000000000000000000000000
P1 binding_factor: 38915e5ab3b90122785515aa89d20c8e592de9f04cb0f42c6a
e7cf99d3990d0b
P3 hiding_nonce_randomness: 7f417eadf8651b6043eece2965411bfb237b0a468
9c88a8469a2a66b79a6d7f9
P3 binding_nonce_randomness: 53dd06d89cdeb574fc32e83fa138f73f668a99aa
ccfa03f82e68ff6b845b7a8a
P3 hiding_nonce: 2efc0a895c5788cb3b65f1032f8d64cf59ed71637353a7103fce
ea669a169f04
P3 binding_nonce: 6e60f3eac7359a4c19a22b618aa4531bd49a1ec83d2c3f503d7
5474ddb15b406
P3 hiding_nonce_commitment: 064f733cb26f728ef185d40e75c50b717cd543abe
8057e38a96831a7de47b17f
P3 binding_nonce_commitment: 6a47acc247a4cbf5b753a1d1f2dcb43241f2df71
3468bf9a7a00e6257442bc46
P3 binding_factor_input: fe9082dcc1ae1ae11380ac4cf0b6e2770af565ff5af9
016254dc7c9d4869cbae0f6e4d94b23e5781b91bc74a25e0c773446b2640290d07c83
f0b067ff870a801f846633bc5505172ee8dc7bb109916b61ea54ddc715684bb50f612
8cec164ab16da6bcebddb83b78493ef85fca52ca460199609523f3eb877d46c399d28
a00900300000000000000000000000000000000000000000000000000000000000000
P3 binding_factor: 3f83b7811980bb032a3f85d857af755a00f4b16a10cdf88f32
d13ea908d3b107

// Round two parameters
participant_list: 1,3

// Signer round two outputs
P1 sig_share: 86879530bc8d700ec20e6211d0c8d27d1b518f5aed00b9eef1b04ed
625c1ab05
P3 sig_share: 66f01933240c000ab4abb203f49bf8bb7138ffe17d5cd6c943ea30c
f9f32410c

sig: 8adca3c885d6ffa07429de8df9ba9bc72a3b0dfa0f6139035deadc72e13c645e
ffa3b906c6365ec09f1d1d72e56aec248d898e3c6b5d8fb8359b7fa5c5f3ec01
]]></artwork>
      </section>
      <section anchor="frostp-256-sha-256-1">
        <name>FROST(P-256, SHA-256)</name>
        <artwork><![CDATA[
// Configuration information
MAX_PARTICIPANTS: 3
MIN_PARTICIPANTS: 2
NUM_PARTICIPANTS: 2

// Group input parameters
group_secret_key: 8ba9bba2e0fd8c4767154d35a0b7562244a4aaf6f36c8fb8735
fa48b301bd8de
group_public_key: 023a309ad94e9fe8a7ba45dfc58f38bf091959d3c99cfbd02b4
dc00585ec45ab70
message: 74657374
share_polynomial_coefficients[1]: 80f25e6c0709353e46bfbe882a11bdbb1f8
097e46340eb8673b7e14556e6c3a4

// Signer input parameters
P1 participant_share: 0c9c1a0fe806c184add50bbdcac913dda73e482daf95dcb
9f35dbb0d8a9f7731
P2 participant_share: 8d8e787bef0ff6c2f494ca45f4dad198c6bee01212d6c84
067159c52e1863ad5
P3 participant_share: 0e80d6e8f6192c003b5488ce1eec8f5429587d48cf00154
1e713b2d53c09d928

// Round one parameters
participant_list: 1,3

// Signer round one outputs
P1 hiding_nonce_randomness: 3c3cce19a46e2539a2a3f0fc1302c04d643c80b61
beff7545f09bf3379ce763f
P1 binding_nonce_randomness: 7550f8224653dec3179586846a156e08911cad54
e785e7a8db13539ad1fd7ac6
P1 hiding_nonce: f07d7e697f7db6b0eaa29e8303e718440197ff47e1918cd4e630
c202ab323223
P1 binding_nonce: 248eb6983093337c1dae193643e8e4618cdafd189fb8289239b
1b54a1778e0cf
P1 hiding_nonce_commitment: 02cc0ef1b65d7284c0be9c555e9877fac2dad008d
f7df6133928f900ca34d82bbe
P1 binding_nonce_commitment: 0281413660fa8a78ae1ca4a65fdad3259246e19e
74f81687b9812246c8b174b1f2
P1 binding_factor_input: 3617acb73b44df565fbcbbbd1824142c473ad1d6c800
7c4b72a298d1eaae57664a317d123a18b12922413ebd80944a0816821b2694b4aea22
16ebbe38eb2daf3000000000000000000000000000000000000000000000000000000
0000000001
P1 binding_factor: 0f2c1ea6da0fceb9cbb63bfe81d80bd22c434a5d9810b1cc97
7f7eab7f0e9da4
P3 hiding_nonce_randomness: 89c096201f0aeb36b0b8a33763ac92df1169ead49
fcf2dec8209f858852a345f
P3 binding_nonce_randomness: 8785c0b2a5817cf40c978e28f7804eff570c3c1c
f9df11b37496c318fa38d107
P3 hiding_nonce: dc34074d1f8f427ee8eabc546cb9931cc44371be94ad66f7a27f
dc4a665db373
P3 binding_nonce: 0a3e836f36b4011be4f6ef111596838fdfccf89c431d66da2ca
75ea55dcf3b44
P3 hiding_nonce_commitment: 02261bf8649d9943d5f664694219742e9abc501c6
7be6b112e833b144462a662e3
P3 binding_nonce_commitment: 03603f38cefae47af6be8dbeeef53e7b27b5af8d
4159b968d489a1f7295581b0e5
P3 binding_factor_input: 3617acb73b44df565fbcbbbd1824142c473ad1d6c800
7c4b72a298d1eaae57664a317d123a18b12922413ebd80944a0816821b2694b4aea22
16ebbe38eb2daf3000000000000000000000000000000000000000000000000000000
0000000003
P3 binding_factor: 7598b94e95da5f81f9b3ad0c40499526429ec80de9cc0a8240
0bbbd2725ea947

// Round two parameters
participant_list: 1,3

// Signer round two outputs
P1 sig_share: 35e4cfe05008a064ad66f2ab62005632b5c44d4daea5cf1ffd193c5
56ec4ddad
P3 sig_share: 79aa1cc540bacfc5a96d4eb1940aa85ec56ec880885748c3de11ff3
55d4e77cf

sig: 03fe31f09eb37b31956749b77eb3d5cf88ac6c2192481e2eaa6e729d4ed8ba0f
28af8eeca590c3702a56d4415cf60afe917b3315ce36fd17e3db2b3b8acc13557c
]]></artwork>
      </section>
      <section anchor="frostsecp256k1-sha-256-1">
        <name>FROST(secp256k1, SHA-256)</name>
        <artwork><![CDATA[
// Configuration information
MAX_PARTICIPANTS: 3
MIN_PARTICIPANTS: 2
NUM_PARTICIPANTS: 2

// Group input parameters
group_secret_key: 0d004150d27c3bf2a42f312683d35fac7394b1e9e318249c1bf
e7f0795a83114
group_public_key: 02f37c34b66ced1fb51c34a90bdae006901f10625cc06c4f646
63b0eae87d87b4f
message: 74657374
share_polynomial_coefficients[1]: fbf85eadae3058ea14f19148bb72b45e439
9c0b16028acaf0395c9b03c823579

// Signer input parameters
P1 participant_share: 08f89ffe80ac94dcb920c26f3f46140bfc7f95b493f8310
f5fc1ea2b01f4254c
P2 participant_share: 04f0feac2edcedc6ce1253b7fab8c86b856a797f44d83d8
2a385554e6e401984
P3 participant_share: 00e95d59dd0d46b0e303e500b62b7ccb0e555d49f5b849f
5e748c071da8c0dbc

// Round one parameters
participant_list: 1,3

// Signer round one outputs
P1 hiding_nonce_randomness: cfeb82944dbbddde7863519b623acdaf0962217ae
fa5a4ad08b07f176600c070
P1 binding_nonce_randomness: 11b45cbcc8eec8877741fc2622ff0c7fbf68a6bd
9b3f8ee313150d6e0bcb5d83
P1 hiding_nonce: b97f0b3fa40a05cbbda2d0acce6170f046520bbf884748e1949b
007c6f11b410
P1 binding_nonce: 6f0c660fb917a39a8b61893ebf8d5e6000da5e766efe717bf40
20c444327a4a0
P1 hiding_nonce_commitment: 03e030abe3c24a6258fe5b15abcdfbb539f146998
d86396e2d3f3cf6d5198f60de
P1 binding_nonce_commitment: 0264617bf0828fa5eadc831b2fa4b4038d7e39c7
01708282d707d5f58e6e41d28e
P1 binding_factor_input: d759fa818c284537bbb2efa2d7247eac9232b7b992cd
49237106acab251dd954b5398f26122974fbb2a00ebfa06caafe44bc289dc964b83dd
4f46411ebd2bce9000000000000000000000000000000000000000000000000000000
0000000001
P1 binding_factor: d80f1df14cfd6803b8501866ca1667297f7867c21886bc04a4
0b56964efa6af6
P3 hiding_nonce_randomness: c8e243917b9d06df6a92c6beca63d6be08325e7b9
29114ec4670f54c07529b47
P3 binding_nonce_randomness: 920d7850ac0d04049eae8e107ee0d86d416d9887
23c505fde8e68ef3e6c36153
P3 hiding_nonce: 9e73856e36f0ac77165af15ced03c71c4b0b3df9e63e1fc550d1
38effb4cf827
P3 binding_nonce: d1620add724f71f28248822ce5fad517428c6b7247dee8d6a46
56b795d058173
P3 hiding_nonce_commitment: 02ba01e4f0a2ead5da318536893cd20f658a51e78
0dfc96b7604fe8ab73b34a00f
P3 binding_nonce_commitment: 0317ec2be255f4647a98b3573582c48ac5c5f087
fdaa057a92ed363f1a1a642056
P3 binding_factor_input: d759fa818c284537bbb2efa2d7247eac9232b7b992cd
49237106acab251dd954b5398f26122974fbb2a00ebfa06caafe44bc289dc964b83dd
4f46411ebd2bce9000000000000000000000000000000000000000000000000000000
0000000003
P3 binding_factor: edd9bb6d85b3610a73e9eaeb2941924b25497d97cfdec17e47
9ef5e9b2a7dcd7

// Round two parameters
participant_list: 1,3

// Signer round two outputs
P1 sig_share: 8a89a17b72e7235d6fbbd0c25db85a1ede389f84d290258c1a42397
dff111626
P3 sig_share: 100275a38484954d345e238f92d4161bf8064a2c4767e916f406ada
b0a734d26

sig: 02652105e8b9d3b30e6868c8cb4cb86d858201fc0f7cef211b6c8f0426d8ac63
f69a8c171ef76bb8aaa419f451f08c703ad63ee9b119f80ea30e48e7290984634c
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9+34bR5Im+n89Ra38R5M2QNcdBbk1u7QkW/q1bOuIdvfO
ur1CXbLIskCAgwIl0Zd5ln2W82Tni4jMqqwLKMpte7vnWDNNk0BVXuPyRWRk
xHw+d/b1fq3uu/e+frOdv9heb0r364udai6269I9Ky42293OPavPN9n+Gh+7
b+r9hfvZi6/Ovr7nZHm+U6/xrv673Bab7BKNlbus2s/r3b6aF9XufF7tts1+
7i2dItur8+3u5r5bb6qt49RXu/vufnfd7APPW3qBk+1Udt/9XG3ULls7b7a7
V+e77fXVfffhZy8+d16pG3xU3nefbvZqt1H7+SPqyXGafbYpX2br7Qa936jG
aS6z3f7lf1xv96q57262zlV93/12vy1mbrPd7XeqavDbzSX98p3jZNf7i+3u
vuPOXYwMbzw6cR9uN5vten3juPgn83qk6l25U/2vtrvzbFP/kO3r7ea++7+K
rMEC0ULyJ/yIuszqNZblend9WdBsr9fXl//jnD49KbaXXbcPT9y/bC/XW6vP
hxdq3ajM+rzf4Teb+rXaNfX+xt1W7t+wwLv1dju7dSDFK2rsf1y/0U+fFFk3
hqcn7ufY/Fztzq1hPM02/Y/vMgq7zzrbnB/oEbM+PXH/tt2WvXnv6ma/vbpQ
u963/X4frrfXZbUG2fTml735Hxcqu6o353m9b05AKY4DSr7EW68Vttl9uzxJ
gvv8jmGA59f5ui7cv6gb9+Hu5mq/Pd9lVxc3brXdufsL5X5Wb7JNUWdr90zt
XtcFmOHppsRmEjnTA4/X6/pqjyYeXu9eK/dRfV7v6WnDPO7pGrQP/rl0jx4/
fHR2enyPB4D9Qf9fbl/PXHBBzJ81alerhphEBum6906/PLt33/2fNPB5+1xL
uPxvrv/Lq3TfxRv44OzxQ78/08FA7dnO3DNipWxXNjzxx1VVF7Xa7Ptr8jkx
5czFlp+4gcxin+3O1f6+e7HfXzX3P/64UcX5CYZBv/jz18HJVVlZ0yV+l8EN
tuGFAkdcqk2pytGKbrG9G/d5tgOFgI6a32a0wdRofc+h3bBIiIVe4N2fbE9d
7erN/qTOih03G3iB93Ead+3eKnanxe3Efh+UEd13I8Y1Mwq8uQ9KCmgXRM4H
/p0n43/sh4u4N5Mn2zfufus+322xVUZznDbN9SXY0Hxw2ywer8HWucKEH4JL
IMTvPskvst0NfqzXatefoz/3MU2f5rjfbTfnaneGDQ7uPM/g4zQMe9M07UAK
FNc7EnhEeV9uN3NWSllB9DG5mffdT5+duaDXd2/oF/VFvXM/VetWsnXfne1V
lW227teqabLdcCWwSpsfLmr3f11c91cimHvJ3KOV+BRa8uLsgtTqaBmwClCS
JwWzT77dvjq5bj7m/w4J9xRslZXXaB7q8HrXKMhy9/Tqal2DcW32u22ej0Cc
PJzB53+tiz1WlQc5JFqew/PtblNv3msjfT+JRrN4vsWD8yfZ+jURKe3N2XXO
kMP9Ql2CZ5qL+opm9vUbaCMSSeUbFjcskZrb5vb1BcRVo0c62osltsNx5vO5
m+VQISAbx3m6gR6pG4FPM/eNcq9ANiTOSL3sISl2LCkakBQN93W2g1bdk8Zl
ipq5mfvZWr2t87VyWajMv4L4vKx/UKVjOLKjzKZVTE1xoS7VibTSfd5AkW7c
HDsLLsbcMSrQfYbRmCY217RGDgaAUdb7ml7Zbq/ABiALCAN+EW+0TWKI6/X2
DY2e2Ka+vCJxUbolVndX59ek1Wk+jAlpP5ydKgnCbIobEYbo+koVe2od7api
p/YucCEGf73DMu1m1hq69Ghd0bCsSe0vMjQNvoKiuYI4p9Xipn/88b+9+Oxh
6oXBzz+fuJBn6jW1d71Z169U79sZ7wjGDmbZrnkq+KO8LjAxx+qqtncUqwEk
undL0l0QiphyzXjUBZlgOmrT0GZQq5ggLUR2Dn1H60DId76DZsSAbtxsv8+K
VzIPtHm1bRqZBHjfxZixgps1gNhG8bSxZ1dAw9CMV0QteOMyA9Kpt9fNiZDg
ZV2Wa+U4HxCw5nkwYnQePT17+Oz06RePXxA540X8f+YSKp/XmzkGeo5JmtkZ
KkSbWCf38aOnX3+F954/e3x69th98fiLr/762P36yWP3s6+ePfvqb0+//Nx9
fvri9PMXp8+foHWMFWKkUBpvWYvmkNbf43+gEyzo5/X+yXV+AkY9P1fMk8UF
sCXtMcQFiBIE21znl/WevsPSXl2v1yCb/7jG042DNTNiAvjsAi2BDD4mM+Xj
SbPlBGsC2pQlaYhusLCy9lfZOYi7cd5ATmPW3wid9LefaH9zvlZz2oIbEOx+
j79nFg91zzs0yBodGB5iGrjckmQaMR2ttxEE1vY2rsqKC5ceZImGRSFSx8OZ
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
bMM1rVl2r0Wq91qZYMmb9lo337p1svEoOEzDGggxMj4uFd+8We3n/ooSUDAz
6ak4g0YKGIBNF70m5sl+pUWQvq1ribjeEnau4AlEbfOHtGZV49y7cu+j2Jue
+KjB1oYDxqCX3mwtmGsctu0ymc16y+xyY6djGPHKaCkrU1uXpGN76HSIdGTM
mljfvuSeBhpZp2fY6PkZgjUPG5XI35681QdE1UtKxo6GtCL2jt/VXqnW+4yp
nNq5cT+8tT6y7m3WDsNo7LZj/ctH0nCvXrF8ZTjEOq6ZtrnpLMZxPoMJd5lt
/tTc8vzRX8/Ojt38ul6X2tkxbaM7dL7L6qR3LYTrhfKZ1aVksWwrePeu52a2
Wv9TI4dChvK1i7gfJj9QiMRdtBPCoBYihG5ytP7s0ZWOktUJKSkM1BwBj8Ky
2Y+VyS5SbWX2lNEAj01kFDu4utHMpEE7/4gEf60z7XUzkZCOjEsSjViW+4S6
vtR2M8dRHJQr7RXk8Q3k1QHreuj2nFCh8nnfMKKR/zLjyHGnzKNWBGT2Tg9d
+l2d0Anfft9D6gxgf71p5yGqm5814FPPaNyoxM31Dxu0CJpauUnPsiV6+MFu
LEZUnDJYHx0O8ENGDvSbNULqdADUp3zOY4LqMemYATX6HRDM08p2wa7M/bKh
4X2gXLn4ssxdMn1vTe5HK6gbKau9FVMhx6M9AjVe3wOu3mnQ97K+755aKopv
BUOlEI5rXrEdZUAc3XUsdLKd3mwE8lil69kNjJeHD/6psdyus6Edse0SxEyp
Nx0kT83WTQsMp061aEaUuaBP9m1vfSU9wSQ8hFuOvH4hm8gyNbdHlOjpHQ4m
ucNOc0ftBpKpJA8K+GAuGgVMGQ7B139iLutykbV8+f2tB1ytec5NfPSgHwky
OPn5/juyEt/QIL/XtgJmz2N7wA20AFk41rfZ19M1rOm68BtzJYXv8g3uJI6c
/6RgBF+YNFCbatuvrCzon20Kaq5/J9C6ZSd85xq4Iqe21NzRu11F07xpc+ev
co7+q56kS3O/LqONtdFvqo96LlcT68UiqjtgH6Hxc6kK3rV3ol/unXK2p/U9
I3rkxeo6atA5qJ3PjbWjbLTfmgWsmfM7xtUxGaQ2E7Bt+3j13H8VQtVD4rDL
0WGu/vLAwnQ6fnRcPuHw+6hz97ky7Qmh9J6CqW3q/YXTLfMyIINaPu5LLY4l
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
lJj+xOk/AKiokElTawEA

-->

</rfc>
