Internet DRAFT - draft-thomson-elegy-vrs
draft-thomson-elegy-vrs
NomCom Eligibility Update M. Thomson
Internet-Draft Mozilla
Intended status: Informational 22 June 2023
Expires: 24 December 2023
A Verifiable Random Selection Process
draft-thomson-elegy-vrs-00
Abstract
A process for performing random selection without bias is described.
About This Document
This note is to be removed before publishing as an RFC.
The latest revision of this draft can be found at
https://martinthomson.github.io/vrs/draft-thomson-elegy-vrs.html.
Status information for this document may be found at
https://datatracker.ietf.org/doc/draft-thomson-elegy-vrs/.
Discussion of this document takes place on the NomCom Eligibility
Update Working Group mailing list (mailto:eligibility-
discuss@ietf.org), which is archived at
https://mailarchive.ietf.org/arch/browse/eligibility-discuss/.
Subscribe at https://www.ietf.org/mailman/listinfo/eligibility-
discuss/.
Source for this draft and an issue tracker can be found at
https://github.com/martinthomson/vrs.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 24 December 2023.
Thomson Expires 24 December 2023 [Page 1]
Internet-Draft Verifiable Random Selection June 2023
Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components
extracted from this document must include Revised BSD License text as
described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Revised BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
2. Process . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. Labels . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Randomness . . . . . . . . . . . . . . . . . . . . . . . 5
2.3. One-Time Codes . . . . . . . . . . . . . . . . . . . . . 5
2.4. Entropy Extraction . . . . . . . . . . . . . . . . . . . 6
2.5. Pseudorandom Function . . . . . . . . . . . . . . . . . . 7
2.6. Announcements and Timing . . . . . . . . . . . . . . . . 7
2.7. Encoding and Sorting . . . . . . . . . . . . . . . . . . 7
2.8. Hash Function Choice . . . . . . . . . . . . . . . . . . 8
3. Security Considerations . . . . . . . . . . . . . . . . . . . 8
3.1. Facilitators and Selecting Substitutes . . . . . . . . . 8
3.2. Secrecy for One-Time Codes . . . . . . . . . . . . . . . 8
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9
5. References . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1. Normative References . . . . . . . . . . . . . . . . . . 9
5.2. Informative References . . . . . . . . . . . . . . . . . 9
Appendix A. Sample Code . . . . . . . . . . . . . . . . . . . . 10
A.1. Selection . . . . . . . . . . . . . . . . . . . . . . . . 10
A.2. One-Time Codes . . . . . . . . . . . . . . . . . . . . . 11
Appendix B. Example Usage . . . . . . . . . . . . . . . . . . . 11
Appendix C. RFC 3797 . . . . . . . . . . . . . . . . . . . . . . 13
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 13
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 13
1. Introduction
On occasion, a group of people might agree that it is necessary to
select from a set of options, but cannot agree on a selection. In
such cases, a random selection might be acceptable, but any potential
for bias might not be.
Thomson Expires 24 December 2023 [Page 2]
Internet-Draft Verifiable Random Selection June 2023
A process for selection in way that is verifiable and not subject to
bias or influence by any party can be useful in such situations.
This document describes one such process.
The IETF Nominating Committee [NOMCOM] is an example of where a
random selection is necessary. Ten people are drawn from a larger
pool of eligible volunteers. As the selected group is entrusted with
considerable responsibility, there is a need to avoid any risk of
bias in the outcome.
This document describes a process that is an alternative to RFC 3797
[RFC3797].
2. Process
A random selection process might be invoked to select a subset of one
or more items from a longer list of options. The purpose of this
process is to select uniformly at random with minimal risk that the
selection is influenced by anyone, including those responsible for
executing the process.
The process for random selection is as follows:
1. Agree to use this process.
2. Appoint a facilitator, who will execute the process.
3. The facilitator performs the following in any order:
a. Publish the list of options, along with labels for each
option; see Section 2.1 for details.
b. Choose and publish details for a source of randomness that
will become available at some future time; see Section 2.2.
c. Generate and publish a one-time code; see Section 2.3.
4. Wait for all randomness to become available.
5. Publish the next one-time code; see Section 2.3.
6. Generate a pseudorandom key by extracting randomness from the
sources and the one-time code; see Section 2.4.
7. Run a pseudorandom function (PRF) using the generated key and
taking each label as input; see Section 2.5.
8. Sort the output.
Thomson Expires 24 December 2023 [Page 3]
Internet-Draft Verifiable Random Selection June 2023
9. Perform selection.
Options are selected by taking from the sorted list in order,
starting from the value with the lowest lexical value.
There might be constraints on selection, such as requirements on
diversity within the final selection, or disqualifications of
individual options (see below). If any option cannot be selected,
skip that option and select the next option from the list. Options
can only be skipped as a result of known constraints on selection,
disqualifications, and any factor that is not potentially subject to
external influence.
An options might become unavailable after selection for reasons that
are unexpected or could be subject to external influence. For
instance, when selecting volunteers, a selected person could become
unavailable through illess or other change of circumstance. In that
case, the complete set of selections is produced, applying any
constraints as above. After all selections are made, any options
that have become unavailable are publicly noted as disqualified from
selection and the process is iterated.
Subsequent iterations start at the key generation stage (Step 5
above), using the next one-time code; see Section 2.3. Using a one-
time code avoids having to wait for new randomness to become
available, but might give the facilitator some influence over the
outcome. Alternatively, the entire process can be repeated.
Section 3.1 explores the consequences of this choice in more detail.
This process does not describe how the list of options is assembled,
or how constraints on selection are agreed. This document only
describes how a random selection is made.
2.1. Labels
Options require labels. This process requires that each option be
given a unique and unambiguous label that is a sequence of bytes.
Labels could be anything, but using UTF-8 encoded Unicode strings
[UTF8] without leading or trailing whitespace can be most amenable to
use in many contexts as they can represent many concepts clearly and
in an accessible fashion.
It should be clear what option each label corresponds to. Names are
often excellent labels. Any options have the same name can have
extra text added to disambiguate them.
Thomson Expires 24 December 2023 [Page 4]
Internet-Draft Verifiable Random Selection June 2023
The use of Unicode strings allows the possibility that some strings
appear to be equal when rendered, despite having very different
character sequences. Such differences are significant; a single
choice of encodingneeds to be made for each label prior to the
release of randomness.
The facilitator announces the set of labels that will be used prior
to any randomness being available.
2.2. Randomness
A source of randomness needs to be chosen. This source needs to
produce sufficient entropy both to ensure that all possible selection
outcomes are equally likely (see Section 3.3 of [RFC3797]) and to
make pre-computation of options infeasible (see Section 3).
The randomness source might be assembled from multiple discrete
sources. Each source and the date at which the entropy will be
sampled needs to be announced.
A process for turning the randomness from each source into a single
sequence of bytes needs to be specified clearly. This too should be
announced. Section 4 of [RFC3797] describes a method for the
combination and canonical encoding of multiple sources that each
produce multiple integers.
Public lotteries are a good source of entropy, often providing in
excess of 20 bits of entropy each. Choosing three or four different
lotteries likely provides sufficient entropy.
The facilitator announces which lotteries are to be used, the date of
the lottery, and the encoding process. This announcement needs to
occur before any of the lotteries are run.
2.3. One-Time Codes
A one-time code provides a facilitator with the ability to generate
substitute selections in case of unexpected unavailability of one or
more options.
The facilitator selects a secret sequence of bytes. This could be a
string that is UTF-8 encoded as is done for labels.
The facilitator then iteratively applies SHA-256 [SHA2] to this
sequence multiple times. This generates a hash commitment.
[RFC1760] describes this process for use in generating one-time
passwords.
Thomson Expires 24 December 2023 [Page 5]
Internet-Draft Verifiable Random Selection June 2023
Concretely, if H(secret) is the process of hashing once, H^2(secret)
= H(H(secret)) is hashing twice. H^n = H(H^{n-1}(secret)) is hashing
n times.
How many times the secret is hashed depends on the facilitators
judgment of the need to find substitutes. Hashing many more times
than is expected to be necessary will ensure that substitutes can be
produced immediately.
The facilitator publishes H^n(secret) and n prior to any randomness
being available.
Once randomness is available the first iteration of the selection
process uses H^{n-1}(secret), or the preimage of the original
published value. In the i-th iteration of the section process they
use H^{n-i}(secret), or the preimage of the last published value. At
each iteration of the process, the facilitator publishes the one-time
code they use.
The chosen secret cannot be used. If the process iterates enough
times to reach that point, new randomness and a new one-time code
will need to be generated.
After the selection process is complete, the facilitator publishes
their chosen secret.
2.4. Entropy Extraction
Once randomness is available, the facilitator constructs a byte
sequence from the randomness as described in Section 2.2. They also
obtain the one-time code as described in Section 2.3.
The HKDF-Extract function (Section 2.2 of [HKDF]) with a hash
function of SHA-256 is used to extract entropy and produce a
pseudorandom key (or PRK). The salt input is set to the butes of the
one-time code, the input keying material or IKM is set to the bytes
from the randomness sources.
PRK = HKDF-Extract(salt=one-time-code, IKM=randomness)
This produces a PRK value.
Thomson Expires 24 December 2023 [Page 6]
Internet-Draft Verifiable Random Selection June 2023
2.5. Pseudorandom Function
The HKDF-Extract function (Section 2.3 of [HKDF]) with a hash
function of SHA-256 is used as a pseudorandom function. The
pseudorandom key input, PRF, is taken from the previous step
(Section 2.4); the label for each option is used as the info input;
and, the output length, L, is 32 (measured in bytes).
position = HKDF-Expand(PRK, info=label, L=32)
This produces a value, position, that can be sorted to produce a
final ordering.
2.6. Announcements and Timing
A facilitator needs to communicate clearly throughout the process.
Announcements regarding labels, randomness, and one-time codes --
including the encoding of each -- need to be made prior to any
randomness becoming available. A single announcement for all of this
information might be sufficient.
Once randomness is available, a single announcement can include the
revealed one-time code and the result of that iteration of selection.
For all announcements, allowing some time for validation and
questions is advisable. If it takes time to confirm that an option
is available for selection, the next iteration of the process cannot
be started until that time passes.
When publishing values, the facilitator can use hexadecimal encoding
to produce text strings that might be easier to use.
2.7. Encoding and Sorting
For the sorting and selection process, using hexadecimal strings
might also help simplify handling. Hexadecimal strings sort
identically to the underlying byte sequence. If the hexadecimal
strings are printed one to a line, with the input label (or name)
after it on the same line, that can make it easier to identify
options in the sorted output.
The sample code in Appendix A uses this method. It does not sort its
output, as that can be performed by a standard sort tool.
Thomson Expires 24 December 2023 [Page 7]
Internet-Draft Verifiable Random Selection June 2023
2.8. Hash Function Choice
This process uses SHA-256 as its hash function for both one-time
codes (Section 2.3) and the KDF (Sections 2.4 and 2.5). A different
hash function could be used, but then it would not be this process.
3. Security Considerations
Low entropy randomness in a selection process could allow an attacker
to compute all possible outcomes. Then, the attacker might be able
to select options (or labels for options) that improve the odds of an
outcome favorable to them. Given the use of one-time codes in this
process, the only attacker who is in any position to take advantage
of this is the facilitator.
An appeals process or similar can help safeguard against a
facilitator that might be untrustworthy.
3.1. Facilitators and Selecting Substitutes
A facilitator has a limited ability to influence the selection
process. This influence depends on the facilitator being able to
cause a selected option to become disqualified somehow.
For example, if the process selects from volunteers for a task, the
facilitator might need to check that selected volunteers are
available to perform that task. A facilitator will know who will be
selected as a substitute, if that becomes necessary. If the
facilitator prefers that a substitute is selected, they could attempt
to force the use of a substitute, such as by not investing enough
effort in confirming availability.
This process is not robust against this attack; it depends on some
amount of trust in the facilitator. If concerns exist about the
impartiality of the facilitator, the entire process can be re-run if
an option becomes unavailable. However, this adds another period of
waiting for fresh randomness, which could be too slow. This is
therefore a question of balancing a small dependency on the
facilitator against expedience.
3.2. Secrecy for One-Time Codes
The facilitator needs to keep the value they choose for generating
one-time codes a secret until the process completes and all
selections are made.
Thomson Expires 24 December 2023 [Page 8]
Internet-Draft Verifiable Random Selection June 2023
An attacker that obtains this secret -- or any unused one-time code
-- gains the foreknowledge available to the facilitator described in
Section 3.1.
4. IANA Considerations
This document has no IANA actions.
5. References
5.1. Normative References
[HKDF] Krawczyk, H. and P. Eronen, "HMAC-based Extract-and-Expand
Key Derivation Function (HKDF)", RFC 5869,
DOI 10.17487/RFC5869, May 2010,
<https://www.rfc-editor.org/rfc/rfc5869>.
[SHA2] Dang, Q., "Secure Hash Standard", National Institute of
Standards and Technology report,
DOI 10.6028/nist.fips.180-4, July 2015,
<https://doi.org/10.6028/nist.fips.180-4>.
5.2. Informative References
[CSS3] Çelik, T., Lilley, C., and L. D. Baron, "CSS Color Module
Level 3", W3C Recommendation, 18 January 2022,
<https://www.w3.org/TR/2022/REC-css-color-3-20220118/>.
[NOMCOM] Kucherawy, M., Ed., Hinden, R., Ed., and J. Livingood,
Ed., "IAB, IESG, IETF Trust, and IETF LLC Selection,
Confirmation, and Recall Process: Operation of the IETF
Nominating and Recall Committees", BCP 10, RFC 8713,
DOI 10.17487/RFC8713, February 2020,
<https://www.rfc-editor.org/rfc/rfc8713>.
[RFC1760] Haller, N., "The S/KEY One-Time Password System",
RFC 1760, DOI 10.17487/RFC1760, February 1995,
<https://www.rfc-editor.org/rfc/rfc1760>.
[RFC3797] Eastlake 3rd, D., "Publicly Verifiable Nominations
Committee (NomCom) Random Selection", RFC 3797,
DOI 10.17487/RFC3797, June 2004,
<https://www.rfc-editor.org/rfc/rfc3797>.
[UTF8] Yergeau, F., "UTF-8, a transformation format of ISO
10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
2003, <https://www.rfc-editor.org/rfc/rfc3629>.
Thomson Expires 24 December 2023 [Page 9]
Internet-Draft Verifiable Random Selection June 2023
Appendix A. Sample Code
This section includes simple python code for running this process.
Separate scripts exist for running selection (Figure 1) and managing
one-time codes (Figure 2).
A.1. Selection
Values for the randomness and one-time code are provided as the first
and second arguments to the python script in Figure 1, which
implements steps 6 and 7 of the process in Section 2.
#!/usr/bin/env python3
import sys
def hmacsha256(k, v):
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, hmac
ctx = hmac.HMAC(k, hashes.SHA256(), backend=default_backend())
ctx.update(v)
return ctx.finalize()
def extract(salt, ikm):
return hmacsha256(salt, ikm)
def expand(prk, info):
return hmacsha256(prk, info + bytes([1]))
# The canonical encoding of the randomness.
ikm = sys.argv[1].encode('utf8')
# This is the one-time code.
salt = bytes.fromhex(sys.argv[2])
prk = extract(salt, ikm)
for line in sys.stdin:
label = line.strip()
order = expand(prk, label.encode('utf8'))
print(f"{order.hex()} {label}")
Figure 1: Implementation of Pseudorandomness
This script is intended to be used with a separate sorting tool as
follows:
$ ./select.py "$randomness" "$otp" | sort
Thomson Expires 24 December 2023 [Page 10]
Internet-Draft Verifiable Random Selection June 2023
A.2. One-Time Codes
The script in Figure 2 implements the generation of one-time codes
from a secret.
#!/usr/bin/env python3
import hashlib
import sys
count = 25
input = bytes.fromhex(sys.argv[1])
# Or, for a hard-coded ASCII string: input = b"secret"
print(f" 0: {input.hex()}")
x = hashlib.sha256(input)
for i in range(1,count):
print(f"{i:>2}: {x.hexdigest()}")
x = hashlib.sha256(x.digest())
print(f"{count:>2}: {x.hexdigest()}")
Figure 2: Implementation of the One-Time Codes
This script can also be used to verify the value revealed by the
facilitator. The value revealed by the facilitator at each iteration
of the process can be passed to this script, which should produce all
previously revealed values.
Appendix B. Example Usage
A committee is tasked with painting a building (which may or may not
be a bike shed) and have concluded that three different colors are
needed for walls, doors, and trim (eaves, gutters, and so forth).
They managed to agree that the blue or anything close to blue was
undesirable, but could not otherwise agree. Ultimately the group
agreed to follow a random selection process.
The list of color names from CSS level 3 [CSS3] was agreed as the
basis for selection, with "transparent", "grey", "cyan", and
"magenta" being disqualifed on the basis of either being not a color
or an alias of another name. A list of those colors that were "blue"
enough to be disqualified were agreed.
The facilitator chose a secret phrase "totally not a bikeshed",
encoded it in UTF-8, and published the output of 10 iterations of
SHA-256 in hex:
950ea08d8d5fd3ae415b9967aba7a48aba39ca62a4d98f2e7fe25cb1b8f8c488.
Thomson Expires 24 December 2023 [Page 11]
Internet-Draft Verifiable Random Selection June 2023
The facilitator announced the exact process for public randomness,
including the use of three different lotteries on a future date and
how the results would be encoded, using the method from RFC 3797.
After waiting, the lotteries finally ran to produce the unlikely
string of "1.2.3.4.5.6./1.2.3.4.5.6./1.2.3.4.5.6./".
The facilitator revealed the output of the 9th hash iteration
(5346f2efb5397a6788fc1f1d9c05c6d3f2abe9b7d16d8592a3695b6dbe9f2456)
and ran the selection process, producing the following (including
only the first few lines, with the hashes truncated for formatting
reasons):
002ed527ae0a44a86c205d1cdba... lavenderblush
03f710be2b61a6f9c3f89aa5ab5... blue
08bab81380d7f0769cecf9969a8... darkgoldenrod
0c26494fa81f3aed8a9f66e77b7... mediumvioletred
0e1af5d1ccfd44de075cc0bb6d5... bisque
13a07cc9abf3b737e49a62b0634... lightpink
As blue was disqualified by prior agreement, the allocation was:
walls "lavenderblush", doors "darkgoldenrod", and trim
"mediumvioletred". However, upon an attempt to acquire the
"lavenderblush" paint, the supplier was unable to source enough to
cover the needed area; a substitute was needed.
The facilitator revealed the output of the 8th hash iteration
(2f70f884997ce80771adbefbbbc6c71a1b921da71896c25ca0f64966bfd0c8ce),
producing a new list of selections as follows:
00d1c59a9f1b581060a9e732e91... aqua
02b514b0b1807bfe086db524f40... darkgray
0337add95eac62a356b020a273a... cornflowerblue
The first option of "aqua" was selected for use on the walls.
Concerns were raised about "aqua" being basically blue and that it
should have been disqualified instead of "cyan", but the outcome of
the process was not in dispute as the qualified colors were very
clearly specified as part of the agreed process and that process had
been strictly adhered to.
Only murmurs about the paint supplier's familial relationship with
the facilitator would mean that the color scheme did not last long,
though maybe that was a consquence of strident complaints from the
neighbors.
Thomson Expires 24 December 2023 [Page 12]
Internet-Draft Verifiable Random Selection June 2023
Appendix C. RFC 3797
This document describes an alternative process to that described in
RFC 3797 [RFC3797]. It makes no effort to replace RFC 3797, however
it is worth noting certain key differences.
This process allows for more rapid substitution through the use of a
one-time code.
This process is marginally more robust against the inclusion of
disqualified options. The process in RFC 3797 critically depends on
the number of options being known. See Section 5.1 of [RFC3797]
recommends that any option found to be invalid remains in the list
once the list is fixed. This is because RFC 3797 selects from an
ordered list by calculating an index from its PRF output, modulo the
number of remaining options.
In comparison, this process sorts the output of its PRF, with each
output being dependent only on the public randomness, the one-time
code, and the label for the option. For the process in this
document, only labels need to be fixed prior to learning the
randomness, not the composition of the entire list of options. This
makes it possible to add or remove options without affecting the
ordering of other options, if those changes can be justified.
This process might be considered simpler than RFC 3797, even with the
use of one-time codes for substitution.
Acknowledgments
The basic underlying idea here comes from Paul Hoffman. [RFC3797]
and the one-time code idea are both the work of Donald Eastlake.
Author's Address
Martin Thomson
Mozilla
Email: mt@lowentropy.net
Thomson Expires 24 December 2023 [Page 13]