<?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.35 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hoffman-random-candidate-selection-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="Candidate Selection">Simple Random Candidate Selection</title>
    <seriesInfo name="Internet-Draft" value="draft-hoffman-random-candidate-selection-00"/>
    <author initials="P." surname="Hoffman" fullname="Paul Hoffman">
      <organization>ICANN</organization>
      <address>
        <email>paul.hoffman@icann.org</email>
      </address>
    </author>
    <date year="2023" month="June" day="23"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 33?>

<t>This document describes a process to randomly select a subset of named candidates from a larger set of candidates.
The process uses an unpredictable value that can be trusted by all candidates.</t>
      <t>This draft has a <eref target="https://github.com/paulehoffman/draft-hoffman-random-candidate-selection">GitHub repository</eref>.
Issues and pull requests can be made there.</t>
      <!-- TO DO

-->



    </abstract>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>It is common to need to pick a subset of people from a larger group using a random selection method.
This is often done on an ad hoc basis, but for some selections, a more formal process is needed,
particularly if the people in the larger group don't all trust the administrator of the selection process to be unbiased.</t>
      <t>This document gives a simple, understandable process that can be done for groups and subsets of arbitrary size.
The process is purposely transparent and reproducible.
It works with any group of entities that nave names: people, companies, locations, and so on.</t>
      <t>As a simple example, a future leadership committee will have a fixed size.
The members of the committee will be selected from a large pool of volunteers. 
Someone is in charge of collecting the names of the volunteers and making a randomized selection among them for the leadership committee.
They can use the process in this document to make that selection in a way that is both provably random and understandable.</t>
      <t>Due to the formatting used in this document, the reader is encouraged to read the HTML version, although the text version is still usable.</t>
      <t>See <xref target="I-D.thomson-elegy-vrs"/> for a similar method as described here.</t>
    </section>
    <section anchor="overview-of-the-process">
      <name>Overview of the Process</name>
      <t>A few terms are used throughout this document:</t>
      <dl>
        <dt>ceremony:</dt>
        <dd>
          <t>The act of collecting names into a pool, making a random selection from the pool, and publishing the entire process in a clear and transparent method.</t>
        </dd>
        <dt>ceremony administrator (CA):</dt>
        <dd>
          <t>The person who performs the steps of the ceremony.</t>
        </dd>
        <dt>candidate:</dt>
        <dd>
          <t>A person, organization, or other namable entity that is possibly being selected during the ceremony.</t>
        </dd>
        <dt>candidate name:</dt>
        <dd>
          <t>The name used by each candidate in the pool.
The candidate name is expressed as a string of Unicode characters in UTF-8 format <xref target="Unicode"/> <xref target="UTF-8"/>.</t>
        </dd>
        <dt>difficult-to-predict string (<em>D</em>):</dt>
        <dd>
          <t>A publicly-visible string that is only known after the pool of candidates has been closed. 
(Note that this is different from what is normally called a "random number" or a "random string".
True random numbers or strings are designed to be nearly impossible to predict, whereas <em>D</em> in this process has weak but sufficient randomness.)</t>
        </dd>
        <dt>selection size (<em>S</em>):</dt>
        <dd>
          <t>The number of candidates that will be selected from the pool.</t>
        </dd>
      </dl>
      <section anchor="basic-steps">
        <name>Basic Steps</name>
        <t>The steps in a ceremony that follows this process is given here.
See <xref target="specifics"/> for more detail on the steps.</t>
        <ol spacing="normal" type="1"><li>
            <t>The CA starts the ceremony by performing the following steps at the same time:  </t>
            <ul spacing="normal">
              <li>Announces an end date for when the pool will be complete.</li>
              <li>Announces a later date on which <em>D</em>, the difficult-to-predict string, will be selected.</li>
              <li>Announces the source where <em>D</em> will be found on that later date.</li>
              <li>Announces <em>S</em>, the number of candidates that will be selected.</li>
              <li>Opens up the pool of candidates for submission.</li>
            </ul>
          </li>
          <li>Candidates submit their names to the pool until the closing date, and the CA puts the allowed names in the pool.</li>
          <li>On the closing date, the CA publishes the candidate names from the pool with the hexadecimal value of the UTF-8 encoding for each candidate name.</li>
          <li>On the date for selecting <em>D</em>, the CA gets <em>D</em> from the announced source.</li>
          <li>The CA calculates the hashes used to make the selection.
The CA concatenates each candidate name with <em>D</em> (name first, then <em>D</em>), uses the SHA-256 hash function <xref target="SHA-2"/> on the resulting string, and records the value of the hash as a UTF-8 string.</li>
          <li>The CA arranges the set of hash values in alphabetic order from highest to lowest.
They then select the <em>S</em> candidates from the top of the list (that is, the names whose hash values are largest).</li>
        </ol>
      </section>
    </section>
    <section anchor="specifics">
      <name>Specifics for the Process</name>
      <section anchor="start-of-ceremony">
        <name>Start of Ceremony</name>
        <t>Much of the trust in the selection process is based on the CA not being able to influence the selection.
If the CA can choose, or even influence, the value of <em>D</em>, they can help establish the outcome of the selection.
Similarly, if one or more of the candidates can influence the value of <em>D</em>, they can increase their chance of being selected.</t>
        <t>To make the process trustworthy, the value of <em>D</em> must be unrelated to the CA or the candidates, and it must be selected only after the list of candidates is completed.
The most important things for a ceremony is that the source is announced before the ceremony starts, that all participants and viewers of a ceremony can find the source on the date specified by the CA, that all candidates believe that no candidate can influence <em>D</em> on that date, and that everyone gets the same value when they go to the source for that date.</t>
        <section anchor="use-of-the-ftse-100-index">
          <name>Use of the FTSE 100 Index</name>
          <t>The process described in this document uses the closing value for the FTSE 100 Index on the particular day selected by the CA.
The FTSE 100 Index is a long-established index based on 100 stocks; it is sometimes known by its stock ticker as "UKX".
A common open source of those values is the Wall Street Journal.
The daily closing for the FTSE 100 Index at the Wall Street Journal can currently be found <eref target="https://www.wsj.com/market-data/quotes/index/UK/UKX/historical-prices">here</eref>.</t>
          <t>Note that the location for sources of daily closing values can change over time.
The CA must check that the source they intende to use is still active, and still available when the ceremony starts.</t>
        </section>
        <section anchor="other-public-sources-of-randomness">
          <name>Other Public Sources of Randomness</name>
          <t>Although the procedure in this document uses the FTSE 100 Index as a public source of randomness, there are many other sources that can be used by a CA, as long as the source chosen is trusted by the candidates.
There are many other stock indexes with enough stocks in them to make prediction of the exact value have less than a 0.1% chance.
Having said that, using a future price of a single stock is probably not a good public source of randomness because candidates are likely to trust the variability of that less than the variability of a basket of stocks.</t>
          <t>Some systems that use public sources of randomness use the results of an unrelated lottery, such as the type of lotteries that many countries hold.
These are probably trusted by candidates not be able to be manipulated.
However, lotteries normally are a set of numbers between 1 and 100, often five or more such numbers.
If the CA uses such a lottery for this procedure, they need to specify how the numbers from the lottery of the chosen date will be combined, including whether or not the numbers from 1 to 9 need to be preceded by a "0" character.</t>
          <t>There are other public sources of randomness, such as cameras pointed at lava lamps and so on.
These are probably not good choices for the type of ceremony described in this document because the operators of such sources are not publicly trusted entities.</t>
        </section>
      </section>
      <section anchor="name-submission">
        <name>Name Submission</name>
        <t>The CA is the sole arbitrator for whether a candidate is allowed to enter the pool.
The CA is also the sole arbitrator of what name string (in UTF-8) the candidate can use in the pool.</t>
        <t>The order that the candidates join the pool does not affect the outcome of the selection process.
Said another way, the pool is kept as an unordered set of candidates, not an ordered list of candidates.</t>
        <t>It is a good practice for the CA to have consistent rules for the names, such as only using ASCII space characters (U+0020), only one space between each name part, no trailing spaces, and so on.
These rules can be more difficult when the candidates are company names (such as whether the legal standing of the company such as "Inc." is included), but making consistent rules is not that difficult.</t>
      </section>
      <section anchor="closing-submissions">
        <name>Closing Submissions</name>
        <t>At the closing of submissions, the CA verifies that the length of the set of candidates in the pool is larger than <em>S</em>. 
If the length is the same as <em>S</em>, the rest of the steps are unneeded (and could be confusing), because all candidates will automatically be selected.
If the length is shorter than <em>S</em>, the ceremony stops because there are too few candidates.</t>
        <t>The method for publishing the set of candidates is determined by the CA.
<xref target="namedisplay"/> gives an example of how a CA might publish this information.</t>
      </section>
      <section anchor="selecting-d">
        <name>Selecting <em>D</em></name>
        <t>On the day that the CA announced for the selection of <em>D</em>, the CA goes the the source they announced and gets <em>D</em>.
After the CA retrieves <em>D</em> from the announced source, they encode <em>D</em> as a UTF-8 string.
In the example of the FTSE 100 Index, a closing value for the day announced at the beginning of the ceremony might be "7623.10".
This would be encoded in UTF-8 as the string of characters whose value is U+373632372e3130.</t>
      </section>
      <section anchor="calculating-hashes">
        <name>Calculating Hashes</name>
        <t>Different programming libraries have different requirements for the input to hash functions.
<xref target="sample-code"/> uses the built-in <tt>hashlib</tt> library in Python, which requires that text strings have a specified encoding.</t>
      </section>
      <section anchor="selecting-s-candidates">
        <name>Selecting <em>S</em> Candidates</name>
        <t>The process of selecting is simply taking the <em>S</em> candidates whose hash value is highest.
This can easily be determined by sorting the text representation of the hash values because in UTF-8 and ASCII, digits have lower codepoints than letters.</t>
        <t>To complete the process in a transparent manner, the CA should publish all known data for the ceremony.
This includes <em>S</em>, <em>D</em>, the hexadecimal value of <em>D</em>, all of the information for each candidate, and the full list of selected candidates.
<xref target="namelist-out"/> shows an example of what this publication might look like.</t>
      </section>
    </section>
    <section anchor="handling-ceremony-process-issues">
      <name>Handling Ceremony Process Issues</name>
      <t>Ceremonies don't always go as planned.
For example, after a ceremony completes, one or more of the selected candidates might be removed from the selected set due to voluntary withdrawal or established rules (such as no two candidates being from the same geographic region).
In such cases, no new ceremony is needed: the CA simply selects the next candidate(s) on the list that is ordered by hash values.</t>
      <t>Similarly, if after the selection process is completed, the size <em>S</em> of the selected set needs to increase, the CA simply selects the next candidate(s) on the list that is ordered by hash values.</t>
    </section>
    <section anchor="performing-a-weighted-selection">
      <name>Performing a Weighted Selection</name>
      <t>In some selections, the CA wants to give candidates a weighted chance of being selected.
For example, a legislature might select its leadership randomly, but weights the chance of being selected by the size of the membership of the political party in the legislature.
The CA can create the pool with multiple names for each party, giving each name a number.</t>
      <t>For example, assume a legislature has 27 members of the Orange party, 20 members of the Yellow party, and 7 members of the Green party.
The CA could create a pool consisting of the names "Orange1", "Orange2", ... "Orange27", "Yellow1", "Yellow2", ... "Yellow20", "Green1", "Green2", ... "Green7".
The selected party would be the one whose name appears in the first name of the list of hashes.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA considerations.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The value <em>D</em> used in this process is explicitly not cryptographically strong; in fact, it might provide only a few bits of randomness.
The FTSE 100 Index might be predictable after the third digit from the right, but not the last three digits, meaning that they only have randomness of about 10 bits.
The value of <em>D</em> is concatenated into each candidate string before the whole string is hashed, so incorrectly predicting even one character of <em>D</em> completely changes the value of the hash for comparison.</t>
      <t>Because of this, a candidate who has a lot of leeway in choosing their name can possibly increase their chance of being selected by as much as 0.1% with such source of randomness.
The procedure in this document assumes that candidates have very little leeway in choosing their names; the CA must accept each name before it is put into the pool.
The combination of the limited leeway for choosing the names in the pool and the necessity to predict <em>D</em> exactly in order to gain any benefit means that <em>D</em> needs much less randomness that a random number that would be used during encryption or authentication.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="SHA-2">
          <front>
            <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="May" year="2011"/>
            <abstract>
              <t>Federal Information Processing Standard, FIPS</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6234"/>
          <seriesInfo name="DOI" value="10.17487/RFC6234"/>
        </reference>
        <reference anchor="Unicode" target="https://www.unicode.org/versions/latest/">
          <front>
            <title>The Unicode Standard (latest version)</title>
            <author>
              <organization>The Unicode Consortium</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="UTF-8">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.thomson-elegy-vrs">
          <front>
            <title>A Verifiable Random Selection Process</title>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="22" month="June" year="2023"/>
            <abstract>
              <t>   A process for performing random selection without bias is described.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-thomson-elegy-vrs-00"/>
        </reference>
      </references>
    </references>
    <?line 227?>

<section anchor="sample-code">
      <name>Sample Code</name>
      <t>The following is a list of figures for an implementation of the procedure shown in this document.</t>
      <ul spacing="normal">
        <li>The Python script in <xref target="the-program"/> implements the algorithm from this document.</li>
        <li>The file that contains the list of names is shown in <xref target="namelist"/>. (The names are the winners of the Nobel laureates in Literature for 2016 through 2021.)</li>
        <li>A file showing the UTF-8 representation of the names from <xref target="namelist"/> is shown in <xref target="namedisplay"/>. This file is suitable for showing to the candidates.</li>
        <li>The file that contains the <em>S</em> and <em>D</em> on separate lines is shown in <xref target="selectioninfo"/>.</li>
        <li>
          <xref target="namelist-out"/> shows the result of running the program with that file as input.</li>
      </ul>
      <figure anchor="the-program">
        <name>Example Python code for this procedure</name>
        <artwork><![CDATA[
#!/usr/bin/env python3

# Program to randomly select some candidates from a group
#  See draft-hoffman-reandom-candidate-selection

import hashlib, sys
from pathlib import Path

# Helper function to turn a UTF-8 string into its hex representation
def hexify(in_str):
  return "".join([hex(c)[2:] for c in in_str.encode("utf8")])

# Santity check the input files given on the command line
if len(sys.argv) == 1:
  exit("Must give the name of the candidate file, and possibly " + \
    "the selection file, on the command line. Exiting.")
candidate_path = Path(sys.argv[1])
if not candidate_path.exists():
  exit(f"The file {str(candidate_path)} doesn't exist. Exiting.")
try:
  candidate_f = candidate_path.open(mode="rt", encoding="utf8")
except:
  exit("The candidates file doesn't appear to be in UTF-8. Exiting.")
candidate_lines = candidate_f.read().splitlines()
# See if there is a second file for selecting
if len(sys.argv) == 3:
  run_including_selection = True
  selection_path = Path(sys.argv[2])
  if not selection_path.exists():
    exit(f"The file {str(selection_path)} doesn't exist. Exiting.")
  try:
    selection_f = selection_path.open(mode="rt", encoding="utf8")
  except:
    exit("The selection file doesn't appear to be UTF-8. Exiting.")
  selection_lines = selection_f.read().splitlines()
  # Extract D and S from the selection file
  S_str = selection_lines[0]
  try:
    S = int(S_str)
  except:
    print(f"The first line of the selection file, '{S_str}', " + \
      "is not an integer. Exiting.")
  # D_str is the string for D, D_hex is the hex version for display
  D_str = selection_lines[1]
  D_hex = hexify(D_str)
else:
  run_including_selection = False

# Get the candidates information
C_info = []
for C_str in candidate_lines:
  C_hex = hexify(C_str)
  if run_including_selection:
    C_with_D_str = C_str + D_str
    C_with_D_hex = hexify(C_with_D_str)
    C_with_D_hash = hashlib.sha256(C_with_D_hex.encode("utf-8"))
    C_info.append([C_str, C_hex, C_with_D_str, C_with_D_hex, \
      C_with_D_hash.hexdigest()])
  else:
    C_info.append([C_str, C_hex])

# Print the results
if run_including_selection:
  print(f"S is {S}")
  print(f"D is \"{D_str}\"")
  print(f" U+{D_hex}\n")
  print("Candidate information, sorted by hash of name including D")
  selected = []
  # Sort by the hex of C_with_D_hash
  for this_info in sorted(C_info, key=lambda a: a[4], reverse=True):
    # Decrement S for each name that is selected
    if S > 0:
      selected.append(this_info[0])
      S -= 1
    print(f"{this_info[2]}")
    print(f" U+{this_info[3]}")
    print(f" {this_info[4]}")
  print("\nSelected:\n    " + "\n    ".join(selected))
else:
  for this_info in C_info:
    print(f"{this_info[0]}")
    print(f" U+{this_info[1]}")
]]></artwork>
      </figure>
      <figure anchor="namelist">
        <name>Sample name list file</name>
        <artwork><![CDATA[
Bob Dylan
石黒 一雄
Olga Tokarczuk
Peter Handke
Louise Glück
Abdulrazak Gurnah
]]></artwork>
      </figure>
      <figure anchor="namedisplay">
        <name>Full information for the names</name>
        <artwork><![CDATA[
Bob Dylan
 U+426f622044796c616e
石黒 一雄
 U+e79fb3e9bb9220e4b880e99b84
Olga Tokarczuk
 U+4f6c676120546f6b6172637a756b
Peter Handke
 U+50657465722048616e646b65
Louise Glück
 U+4c6f7569736520476cc3bc636b
Abdulrazak Gurnah
 U+416264756c72617a616b204775726e6168
]]></artwork>
      </figure>
      <figure anchor="selectioninfo">
        <name>Sample selection information file</name>
        <artwork><![CDATA[
3
7623.10
]]></artwork>
      </figure>
      <figure anchor="namelist-out">
        <name>Output of running the program on the list of names and selection information</name>
        <artwork><![CDATA[
S is 3
D is "7623.10"
 U+373632332e3130

Candidate information, sorted by hash of name including D
石黒 一雄7623.10
 U+e79fb3e9bb9220e4b880e99b84373632332e3130
 f2e0d3bbd8eac635d799702bead0fbdf07ff79ef94a261789de50e81adb38a13
Louise Glück7623.10
 U+4c6f7569736520476cc3bc636b373632332e3130
 a54e282cbaa1f29543cd13d9a29e07e3a38413360172b722f8259c2baa3c38dd
Peter Handke7623.10
 U+50657465722048616e646b65373632332e3130
 8bb3bc197c6462b033e4d8e8cf703b13b1c55172572a85d56c639db5c57d3866
Olga Tokarczuk7623.10
 U+4f6c676120546f6b6172637a756b373632332e3130
 56166c4e0e6ca027f4150bac5ce83fbf5652e440214fd255308472fed9f8fb1b
Abdulrazak Gurnah7623.10
 U+416264756c72617a616b204775726e6168373632332e3130
 340413dc6b2574f5ddc5e88e1c986a229d9defccbae249789b07a5d2337981ff
Bob Dylan7623.10
 U+426f622044796c616e373632332e3130
 05eb403f4f59f5a7b21f5e5a4e8dbfbac59344fd5e8708ab618b5e2ed27a52de

Selected:
    石黒 一雄
    Louise Glück
    Peter Handke
]]></artwork>
      </figure>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
