Election-Tech-Initiative / Election-Tech-Initiative/electionguard-python

🐞 Occasional test failures related to `0` nonces

Offen
#708 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug
Vorherrschende Sprache
Python
Sterne
168
Forks
103
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

### Is there an existing issue for this?

- [X] I have searched the existing issues

### 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 = , 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.

```fish
for i in (seq 1 200)
poetry run pytest tests/unit/test_decrypt_with_shares.py
if test $status -ne 0
break
end
end
```

```fish
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?

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.