Vada al contenuto
Condorcet.vote Alpha
← Documentazione tecnica

Prova di voto

Dimostrare che una scheda pubblicata è la propria senza rivelare la chiave segreta, ma rivelando il proprio voto: l’operazione D di cryptoVote e la busta cvproof/1 che la trasporta.

Questa pagina specifica la prova di voto degli strumenti pubblici: che cosa stabilisce, chi può produrla, il flusso con nonce, la busta scambiata campo per campo e la sua verifica. È volutamente esplicita sulle conseguenze: una prova consegnata è una divulgazione del voto, verificabile da chiunque e irrevocabile.

Protocollo v1

Che cosa stabilisce

Questa immagine di chiave è mia.

Una scheda pubblicata reca un’immagine di chiave legata all’elezione, mai un’identità. La prova collega tale immagine di chiave a una chiave pubblica, e dunque a chi detiene la chiave segreta corrispondente.

  • Una prova di Chaum–Pedersen. Prova non interattiva di uguaglianza di logaritmi discreti: chi prova conosce uno stesso scalare x tale che la chiave pubblica sia P = x·G e l’immagine di chiave I = x·B, dove B è la base legata all’elezione. Nient’altro viene rivelato su x.
  • La chiave segreta resta segreta. La prova non contiene la chiave segreta né consente di ricostruirla; consegnarla non significa cedere la chiave.
  • Legata a un’elezione e a un nonce. L’UUID dell’elezione fissa la base B e il nonce è integrato nella sfida: una prova vale soltanto per quell’elezione e per quel nonce.
  • Rivela il voto. Confrontata con il registro, la prova significa: il detentore di questa chiave ha depositato questa scheda pubblicata, la cui classifica è in chiaro. Provare il possesso di un’immagine di chiave equivale a divulgare, in modo dimostrabile, come si è votato.
Enunciato provato · operazione D
∃ x :  P = x·G  e  I = x·B
B = H_p(domain ‖ len(election_id) ‖ election_id ‖ P)

Ristretto255, Blake2b-512. B è la base da cui la scheda ricava la propria immagine di chiave: la stessa chiave segreta produce un’immagine di chiave diversa in ogni elezione.

L’immagine di chiave nella scheda firmata
Chi la produce

Il detentore della chiave, e soltanto lui.

Produrre una prova richiede la chiave segreta dell’elettore. Nessuno può quindi provare la scheda di un elettore al suo posto, né contro la sua volontà.

  • Su sua esclusiva iniziativa. La prova è un atto volontario dell’elettore, dopo il voto. Nessuna fase dell’elezione la avvia o la richiede.
  • Fuori dal controllo dell’organizzatore. È una proprietà della crittografia, non un’impostazione della piattaforma: nessun interruttore la attiva o la vieta, e l’organizzatore non può né impedirla né produrla.
  • La chiave proviene dalla ricevuta. La chiave segreta sk_… e l’immagine di chiave ki_… della scheda figurano nella ricevuta di voto .condorcet_receipt, che lo strumento legge direttamente. Tale ricevuta è rilasciata una sola volta e mai riemessa.
  • Nulla transita per la piattaforma. La piattaforma non legge, non scrive e non conserva mai la busta: essa circola tra l’elettore e il richiedente, sul canale di loro scelta.
Caso d’uso

Il voto per delega.

L’esigenza che motiva l’operazione D: un elettore, o un mandatario che ha votato per conto di terzi, dimostra a posteriori come è stata espressa una scheda.

La ricevuta di voto, campo per campo
Flusso

Una sfida, una prova, una verifica.

Tre ruoli, tre chiamate cryptoVote. Il nonce è generato da chi richiede la prova, mai dall’elettore.

  1. 1 Richiedente Genera un nonce casuale nuovo (generate_nonce_wasm, che restituisce nonce_…) e lo trasmette all’elettore, al di fuori della piattaforma. Un nonce nuovo per ogni richiesta.
  2. 2 Elettore Inserisce la propria chiave segreta sk_…, l’UUID dell’elezione, l’immagine di chiave ki_… della propria scheda (oppure carica la ricevuta) e il nonce ricevuto. Lo strumento calcola prove_ownership_wasm(secret, election, nonce), che restituisce own_…, deriva la chiave pubblica pk_… e compone la busta cvproof/1.
  3. 3 Elettore Legge l’avvertenza (la prova rivela il suo voto a chi la riceve, che a sua volta può convincerne altri), poi consegna la busta, volontariamente. La sua chiave segreta non ha mai lasciato il browser.
  4. 4 Richiedente, o chiunque Verifica la prova (verify_ownership_wasm), poi cerca l’immagine di chiave nel registro pubblicato dell’elezione per leggere la scheda corrispondente.

Freschezza, non intrasferibilità.

Il nonce è integrato nella sfida della prova: questa non può essere né precalcolata né riprodotta con un altro nonce, il che garantisce al richiedente che è stata prodotta per la sua richiesta. Resta però verificabile pubblicamente: chiunque detenga la coppia (nonce, prova) può convincerne chiunque altro. Non è una prova a verificatore designato, e nulla ne riserva la portata al solo richiedente.

Busta

cvproof/1, sei campi.

Un unico oggetto JSON UTF-8, il solo formato di scambio che gli strumenti producono o accettano. Riguarda soltanto l’elettore e il richiedente: nessun parser lato server, nessuna conservazione.

version stringa letterale
Esattamente cvproof/1; qualsiasi altro valore è rifiutato.
election UUID
L’UUID dell’elezione, lo stesso valore passato alle chiamate WASM. Accettato in maiuscole e minuscole, ricondotto in minuscole, la sua forma canonica.
public_key pk_<64 esadecimali>_<8 esadecimali>
La chiave pubblica P, derivata dalla chiave segreta dallo strumento dell’elettore.
key_image ki_<64 esadecimali>_<8 esadecimali>
L’immagine di chiave I legata all’elezione: quella della scheda pubblicata di cui si prova il possesso.
nonce nonce_<64 esadecimali>_<8 esadecimali>
Il nonce emesso dal richiedente, copiato verbatim.
proof own_<128 esadecimali>_<8 esadecimali>
L’output di prove_ownership_wasm (64 byte), copiato verbatim.
Esempio · cvproof/1
{
    "version": "cvproof/1",
    "election": "1f0c9b6e-4d2a-4c8e-9b7a-3e5f6a7b8c9d",
    "public_key": "pk_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef_a1b2c3d4",
    "key_image": "ki_fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210_0badc0de",
    "nonce": "nonce_00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff_5eed5eed",
    "proof": "own_0f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a69780f1e2d3c4b5a6978_c0ffee00"
}

Valori illustrativi: forme e lunghezze esatte, ma motivi e checksum fittizi. Questa busta non supera la verifica.

  • Stringhe prefissate canoniche. public_key, key_image, nonce e proof sono le stringhe <tag>_<esadecimale>_<checksum> emesse da cryptoVote: esadecimale minuscolo di byte interi, checksum di 4 byte (8 esadecimali). Sono trasportate verbatim e ripassate senza modifiche a verify_ownership_wasm; l’esadecimale nudo è rifiutato.
  • L’ordine dei campi è indifferente. È un oggetto JSON: il lettore legge per chiave. Lo strumento scrive i campi nell’ordine della tabella qui sopra.
  • Chiavi sconosciute ignorate. Un lettore DEVE ignorare le chiavi che non conosce, per restare compatibile con le versioni future; lo strumento le scarta in lettura.
  • Il formato prima della crittografia. version e i prefissi sono validati prima di qualsiasi chiamata crittografica. Il checksum protegge dagli errori di battitura, mai dalla falsificazione: l’autenticità poggia soltanto sulla prova.
Verifica

Valida, poi collegata al registro.

La procedura per chi riceve una busta. Una prova valida, da sola, dice: questa chiave pubblica possiede questa immagine di chiave. Soltanto il confronto con il registro la trasforma in: questo elettore ha depositato questa scheda pubblicata.

  1. 1 Leggere l’input come oggetto JSON; rifiutare un JSON non valido o qualsiasi altro tipo (array, valore semplice, null).
  2. 2 Esigere che version sia uguale a cvproof/1.
  3. 3 Esigere un UUID in election e ricondurlo in minuscole.
  4. 4 Esigere public_key in pk_, key_image in ki_, nonce in nonce_ e proof in own_, ciascuno nella sua forma canonica e alla sua lunghezza esatta; ignorare le chiavi sconosciute.
  5. 5 Confrontare nonce con quello da Lei emesso: la freschezza è acquisita solo se è il Suo.
  6. 6 Chiamare verify_ownership_wasm(public_key, key_image, election, nonce, proof) e proseguire solo in caso di true.
  7. 7 Cercare key_image tra le schede dell’elezione e leggere la scheda trovata: la sua classifica è il voto provato.

Esito della ricerca nel registro

published
La scheda è pubblicata nella catena dell’elezione; lo strumento ne mostra il contenuto.
pending
Una scheda corrispondente è stata ricevuta ma attende la pubblicazione in un lotto: il suo contenuto non è ancora leggibile, la verifica va ripetuta dopo la chiusura.
not_found
Nessuna scheda di questa elezione reca questa immagine di chiave: la prova, pur valida, non si collega ad alcun voto, e lo strumento lo segnala.
Limiti

Ciò che non aggiunge.

La prova standardizza una ricevuta che era già dimostrabile. Non è una funzione di riservatezza, e i suoi effetti sono definitivi.

  • Nessuna resistenza alla coercizione. L’elettore detiene già la propria chiave segreta e la propria immagine di chiave: una ricevuta dimostrabile esisteva prima dell’operazione D, che si limita a standardizzarla. Non aggiunge né toglie resistenza alla coercizione, coerentemente con la scelta deliberata delle ricevute verificabili anziché dell’assenza di ricevuta (receipt-freeness).
  • Nessun destinatario riservato. La prova è trasferibile: il richiedente può mostrarla a terzi, che la verificheranno quanto lui. Non può essere «solo per lui».
  • Nessun ritorno indietro. Una busta consegnata non si ritira: chi la detiene può verificarla e mostrarla, senza limiti di tempo.
  • Nessuna identità civile. La prova stabilisce il possesso di una chiave segreta, non l’identità di una persona: la busta non contiene né identificativo elettore né nome. Il collegamento tra la chiave e una persona dipende dal contesto dello scambio.
Strumento pubblico

Tutto avviene nel browser.

Gli strumenti pubblici di prova di voto implementano questa specifica: generare un nonce, provare il proprio voto, verificare una prova. Senza account né impostazioni, sono sempre disponibili; in pratica la verifica presuppone un’elezione chiusa con registro pubblicato, anche se la crittografia non dipende dal ciclo di vita dell’elezione.

  • Calcolo locale. Il nonce, la prova e la verifica sono calcolati nel browser da @condorcet.vote/crypto-vote, senza andata e ritorno con un server.
  • La chiave segreta non lascia il browser. È inserita e usata localmente, mai inviata a un server. Nulla è conservato oltre la pagina: né chiave, né nonce, né prova.
  • Una sola richiesta, su valori pubblici. Il confronto con il registro interroga un endpoint di ricerca sullo stesso host con l’UUID dell’elezione e l’immagine di chiave, due valori pubblici. Né la prova, né il nonce, né alcun segreto gli vengono inviati.
  • La stessa postura della pagina di voto. Pagina autonoma, senza Livewire, sotto la politica CSP più rigorosa (solo risorse del dominio); il modulo WASM è controllato tramite il suo hash di integrità al caricamento.
Aprire gli strumenti di prova di voto