Skip to content

🐞 Incorrect generation of nonces for encryption of ballot selections #655

@danwallach

Description

@danwallach

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

encrypt_selection does this:

selection_description_hash = selection_description.crypto_hash()
nonce_sequence = Nonces(selection_description_hash, nonce_seed)
selection_nonce = nonce_sequence[selection_description.sequence_order]
disjunctive_chaum_pedersen_nonce = next(iter(nonce_sequence))

The nonce_seed value comes from a parameter to the function.

The ElectionGuard spec says: "For each option listed in the election manifest file [where an "option" here refers to a contest selection], the nonce used to encrypt that option is derived from the contest nonce ($R_C$) and the selection label for that option ($L_S) as $R = H(L_S, R_C)$."

So, the code that derives nonce_sequence is fine. But the next two lines are not compliant with the spec, because the whole sequence_order part is (or should be) subsumed in the selection_description_hash.

Instead, the last two lines should read something more like:

selection_nonce, disjunctive_chaum_pedersen_nonce = nonce_sequence[0:1]

This distinction is important for anybody trying to implement the spec correctly. It would be helpful if the spec were more clear on nonce sequences. Right now it's relatively silent on this.

Expected Behavior

No response

Steps To Reproduce

No response

Environment

No response

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions