Is there an existing issue for this?
Current Behavior
Tests in tests/unit/test_decrypt_with_shares.py and tests/property/test_decryption_mediator.py occasionally fail, either in elgamal_encrypt from elgamal.py ("ElGamal encryption requires a non-zero nonce") or in group.py, where negating a zero nonce during proof construction results in a value that's too large for the group.
Log 1
tests/property/test_decryption_mediator.py:151: AssertionError
---------------------------------------------------------- Captured stdout call -----------------------------------------------------------
[388748:2022-07-15 14:12:37,483]:ERROR:elgamal.py.elgamal_encrypt:#L205: ElGamal encryption requires a non-zero nonce
------------------------------------------------------------ Captured log call ------------------------------------------------------------
ERROR electionguard:logs.py:87 elgamal.py.elgamal_encrypt:#L205: ElGamal encryption requires a non-zero nonce
Log 2
tests/unit/test_decrypt_with_shares.py:140:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
src/electionguard/encrypt.py:124: in encrypt
encrypted_ballot = encrypt_ballot(
src/electionguard/encrypt.py:480: in encrypt_ballot
encrypted_contests = encrypt_ballot_contests(
src/electionguard/encrypt.py:538: in encrypt_ballot_contests
encrypted_contest = encrypt_contest(
src/electionguard/encrypt.py:335: in encrypt_contest
encrypted_selection = encrypt_selection(
src/electionguard/encrypt.py:231: in encrypt_selection
encrypted_selection = make_ciphertext_ballot_selection(
src/electionguard/ballot.py:265: in make_ciphertext_ballot_selection
proof = flatmap_optional(
src/electionguard/utils.py:118: in flatmap_optional
return mapper(optional)
src/electionguard/ballot.py:267: in
lambda n: make_disjunctive_chaum_pedersen(
src/electionguard/chaum_pedersen.py:397: in make_disjunctive_chaum_pedersen
return make_disjunctive_chaum_pedersen_one(message, r, k, q, seed)
src/electionguard/chaum_pedersen.py:465: in make_disjunctive_chaum_pedersen_one
c0 = negate_q(w)
src/electionguard/group.py:179: in negate_q
return ElementModQ(get_small_prime() - a)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cls = <class 'electionguard.group.ElementModQ'>, data = mpz(65521), check_within_bounds = True
def __new__(cls, data: Union[int, str], check_within_bounds: bool = True): # type: ignore
"""Instantiate element mod T where element is an int or its hex representation."""
element = super(BaseElement, cls).__new__(cls, data)
if check_within_bounds:
if not 0 <= element.value < cls.get_upper_bound():
> raise OverflowError
E OverflowError
src/electionguard/group.py:28: OverflowError
Expected Behavior
The tests consistently pass.
Steps To Reproduce
Running the tests in question a few hundred times is usually enough to trigger the error.
for i in (seq 1 200)
poetry run pytest tests/unit/test_decrypt_with_shares.py
if test $status -ne 0
break
end
end
for i in (seq 1 200)
poetry run pytest tests/property/test_decryption_mediator.py
if test $status -ne 0
break
end
end
Environment
No response
Anything else?
I thought this might have something to do with #656 and the fact that the generators in election_factory.py set some sequence orders to zero, but that doesn't seem to fix it. Maybe it's related to #655?
Is there an existing issue for this?
Current Behavior
Tests in
tests/unit/test_decrypt_with_shares.pyandtests/property/test_decryption_mediator.pyoccasionally fail, either inelgamal_encryptfromelgamal.py("ElGamal encryption requires a non-zero nonce") or ingroup.py, where negating a zero nonce during proof construction results in a value that's too large for the group.Log 1
Log 2
tests/unit/test_decrypt_with_shares.py:140: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ src/electionguard/encrypt.py:124: in encrypt encrypted_ballot = encrypt_ballot( src/electionguard/encrypt.py:480: in encrypt_ballot encrypted_contests = encrypt_ballot_contests( src/electionguard/encrypt.py:538: in encrypt_ballot_contests encrypted_contest = encrypt_contest( src/electionguard/encrypt.py:335: in encrypt_contest encrypted_selection = encrypt_selection( src/electionguard/encrypt.py:231: in encrypt_selection encrypted_selection = make_ciphertext_ballot_selection( src/electionguard/ballot.py:265: in make_ciphertext_ballot_selection proof = flatmap_optional( src/electionguard/utils.py:118: in flatmap_optional return mapper(optional) src/electionguard/ballot.py:267: in lambda n: make_disjunctive_chaum_pedersen( src/electionguard/chaum_pedersen.py:397: in make_disjunctive_chaum_pedersen return make_disjunctive_chaum_pedersen_one(message, r, k, q, seed) src/electionguard/chaum_pedersen.py:465: in make_disjunctive_chaum_pedersen_one c0 = negate_q(w) src/electionguard/group.py:179: in negate_q return ElementModQ(get_small_prime() - a) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cls = <class 'electionguard.group.ElementModQ'>, data = mpz(65521), check_within_bounds = True
> raise OverflowError
E OverflowError
src/electionguard/group.py:28: OverflowError
Expected Behavior
The tests consistently pass.
Steps To Reproduce
Running the tests in question a few hundred times is usually enough to trigger the error.
Environment
No response
Anything else?
I thought this might have something to do with #656 and the fact that the generators in
election_factory.pyset some sequence orders to zero, but that doesn't seem to fix it. Maybe it's related to #655?