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

🐞 Occasional test failures related to `0` nonces

Đang mở
#708 4 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
Python
Star
168
Fork
103
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### 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?

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.