swisspost-evoting-go-poc/pkg/party/state.go
saymrwulf a443e44875 Voting phase: ballot submission with cross-party proof verification
Voters encrypt their selection under the election key, build the (sound)
exponentiation proof binding the ballot to their verification-card key, and
submit to the voting server. The server validates every group element on
receipt, routes the ballot to all four CCs for proof verification, and stores
it only on unanimous acceptance — persisting vcPK (finding F6) so the proof
statement is reconstructible by any party.

- voting.go: castBallot (voter), handleCastBallot (server), handleVerifyBallot
  (CC). The CC re-derives the proof statement and verifies it; a malformed proof
  or bad group element yields a clean reject, never a panic (the trust-boundary
  hardening deferred from the due-diligence pass).
- wire.go: exponentiation-proof DTO.

Tests: 4 ballots flow end-to-end and are stored with vcPK; a ballot with a
zeroed proof is rejected by the CCs and never stored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 15:19:07 +02:00

79 lines
2.2 KiB
Go

package party
import (
"math/big"
"github.com/user/evote/pkg/elgamal"
emath "github.com/user/evote/pkg/math"
"github.com/user/evote/pkg/mixnet"
"github.com/user/evote/pkg/returncodes"
"github.com/user/evote/pkg/zkp"
)
// The state structs below hold each party's PRIVATE state. Nothing here may be
// read by another party except through an explicit signed message.
// setupState is the setup component's working store while assembling cards.
type setupState struct {
primes []*big.Int
votingCards []*votingCard
mappingTable *returncodes.MappingTable
electionPK elgamal.PublicKey
returnCodePK elgamal.PublicKey
}
// ccState is a control component's private key material and mix state.
type ccState struct {
keyPair elgamal.KeyPair
returnCodeSecret emath.ZqElement
schnorrProofs []zkp.SchnorrProof
// Tally working state.
shuffle mixnet.VerifiableShuffle
decProofs []zkp.DecryptionProof
shuffleIn *elgamal.CiphertextVector
shuffleOut *elgamal.CiphertextVector
}
// ebState is the electoral board's private key material.
type ebState struct {
passwords []string
keyPair elgamal.KeyPair
}
// serverState is the voting server / ballot box.
type serverState struct {
mappingTable *returncodes.MappingTable
ballotBox []encryptedBallot
electionPK elgamal.PublicKey
returnCodePK elgamal.PublicKey
primes []*big.Int
}
// voterState is a voter client's private card and ballot secrets.
type voterState struct {
card *votingCard
electionPK elgamal.PublicKey
primes []*big.Int
vcSK emath.ZqElement
selected []int
}
// votingCard is a voter's credential bundle (private to the voter, produced by
// the setup component and delivered over a confidential channel).
type votingCard struct {
VoterID string `json:"voter_id"`
VerificationCardID string `json:"vc_id"`
StartVotingKey string `json:"svk"`
ChoiceReturnCodes []string `json:"choice_return_codes"`
VoteConfirmCode string `json:"vote_confirm_code"`
BallotCastingKey string `json:"bck"`
}
// encryptedBallot is a ballot as stored in the ballot box.
type encryptedBallot struct {
VoterID string
VerificationCardID string
Ciphertext elgamal.Ciphertext
VcPK emath.GqElement
}