<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.2 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-hoffman-random-candidate-selection-02" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="Candidate Selection">Simple Random Candidate Selection</title>
    <seriesInfo name="Internet-Draft" value="draft-hoffman-random-candidate-selection-02"/>
    <author initials="P." surname="Hoffman" fullname="Paul Hoffman">
      <organization>ICANN</organization>
      <address>
        <email>paul.hoffman@icann.org</email>
      </address>
    </author>
    <date year="2023" month="November" day="20"/>
    <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 have 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>As described later in this document, the process can also be used for weighted selections (<xref target="weighted"/>) and for randomly sorting lists of candidates (<xref target="rand-ord"/>).</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>
                <t>Announces an end date for when the pool will be complete.</t>
              </li>
              <li>
                <t>Announces a later date on which <em>D</em>, the difficult-to-predict string, will be selected.</t>
              </li>
              <li>
                <t>Announces the source where <em>D</em> will be found on that later date.</t>
              </li>
              <li>
                <t>Announces <em>S</em>, the number of candidates that will be selected.</t>
              </li>
              <li>
                <t>Opens up the pool of candidates for submission.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Candidates submit their names to the pool until the closing date, and the CA puts the allowed names in the pool.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>On the date for selecting <em>D</em>, the CA gets <em>D</em> from the announced source.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>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).</t>
          </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 intended source is still active, and still available when the ceremony starts.</t>
          <t>Values from the FTSE 100 Index in this procedure are always encoded as four digits, followed by a period character (U+002E), followed by two more digits, such as:</t>
          <artwork><![CDATA[
7623.10
]]></artwork>
          <t>If the FTSE 100 Index ever goes above 10,000, the encoded values would be five digits, followed by a period character (U+002E), followed by two more digits.</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>
          <t>Note that some sources of randomness may have less randomness than it appears at first glance.
There can be hidden biases towards certain values that are not obvious when looking at a small set of recent values.
If a CA chooses a source for <em>D</em> other than the FTSE 100 Index, the data from source should be measured over a long period of time for unexpected biases toward values that a candidate can use to improve their chance of being selected.</t>
        </section>
      </section>
      <section anchor="name-submission-and-pool-creation">
        <name>Name Submission and Pool Creation</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-to-the-pool">
        <name>Closing Submissions to the Pool</name>
        <t>At the closing of submissions, the CA verifies that the number 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 hex value is 0x373632332e3130.</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 in descending order 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="weighted">
      <name>Performing a Weighted Selection of Candidates</name>
      <t>In some candidate 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="rand-ord">
      <name>Performing a Random Ordering of Candidates</name>
      <t>Some use cases do not involve a selection of candidates from a larger list, but instead sorting the list of candidates randomly.
The process given in this document can be easily used to do this: set <em>S</em> to the size of the pool, peform the steps of the ceremony, and create the output list in the last step as all <em>S</em> candidates in alphabetic order from highest to lowest of the hash values.</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>A cryptographic hash function like SHA-256 has the property that changing any individual bit of the input will change every bit in the output with a 50% chance, regardless of the position of the bit in the input.
Appending a small amount of randomness at the end of the input is just as effective as prepending the randomness at the beginning of the input nd just as effective as mixing the randomness throughout the input.
The procedure in this document appends the string from the FTSE 100 Index at the end of the candidate name because it makes viewing the pre-hashed result easier while still causing the maximum change to the resulting hash value.</t>
      <t>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 anchor="sec-normative-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 anchor="sec-informative-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 251?>

<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>
          <t>The Python script in <xref target="the-program"/> implements the algorithm from this document.</t>
        </li>
        <li>
          <t>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.)</t>
        </li>
        <li>
          <t>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.</t>
        </li>
        <li>
          <t>The file that contains the <em>S</em> and <em>D</em> on separate lines is shown in <xref target="selectioninfo"/>.</t>
        </li>
        <li>
          <t><xref target="namelist-out"/> shows the result of running the program with that file as input.</t>
        </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-random-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")])

# Sanity 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" {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" {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" {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
 426f622044796c616e
石黒 一雄
 e79fb3e9bb9220e4b880e99b84
Olga Tokarczuk
 4f6c676120546f6b6172637a756b
Peter Handke
 50657465722048616e646b65
Louise Glück
 4c6f7569736520476cc3bc636b
Abdulrazak Gurnah
 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"
 373632332e3130

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

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

-->

</rfc>
