ADR 0008 · Architecture Decision Record

De ce am ales Belenios v2.

Pentru fiecare alegere arhitecturală importantă — în special cele unde greșelile sunt catastrofale și ireversibile — scriem un document scurt care explică ce alternative am evaluat și de ce am ales o anumită variantă. Pentru votul electronic, decizia e fixată în ADR 0008. Iată tot ce conține, în limbaj accesibil.

Status

Acceptat

Data deciziei

2026-05-04

Aplicabilitate

packages/lib/voting/*

Contextul deciziei

Pilotul OAR Transilvania (vară 2026) cere o capabilitate de vot electronic verificabil. Avem o schiță arhitecturală în documentul intern docs/09-voting-security.md; ADR-ul 0008 fixează contractul de implementare înainte ca orice cod să intre sub packages/lib/voting/*.

Biblioteca de vot e singura parte din această codebase unde greșelile pot fi catastrofale și ireversibile — un singur off-by-one într-un verificator de zero-knowledge proof e suficient ca fiecare rezultat „verificat” să fie o minciună. De aceea, blocăm designul acum și aplicăm reguli mai stricte de revizuire pentru această zonă a codului.

Decizia · 10 puncte

Ce am decis, concret.

  1. 01

    Cripto de bază: Belenios v2

    Criptare ElGamal pe curba Curve25519 / Ristretto255 (grup de ordine primă). Implementare cu @noble/curves — bibliotecă auditată independent de Trail of Bits, scrisă pur TypeScript, fără dependințe native, fără cod compilat opac (WASM blackbox). Nu inventăm criptografie nouă — refolosim ce e deja verificat științific.

  2. 02

    Generarea distribuită a cheilor: Pedersen DKG

    3-din-5 trustees ca implicit, configurabil per scrutin. Niciun trustee nu poate citi voturi singur — e nevoie de minim 3 prezenți simultan la deschidere. Transcript public al ceremoniei DKG stocat alături de scrutin, ca oricine să poată verifica că ceremonia s-a desfășurat regulamentar.

  3. 03

    Acreditare alegători: chei per-scrutin de la registru independent

    Pentru fiecare scrutin, un registru separat (DPO + secretarul filialei, dublu control) generează semnături unice pentru fiecare alegător eligibil. Registrul rulează un CLI izolat — serverul oar.digital NU vede mappingul credențial → identitate. Astfel, chiar dacă serverul ar fi compromis, atacatorul nu poate identifica votanți.

  4. 04

    Cast-as-intended UX: Benaloh challenge

    După ce alegi, vezi opțiunea aleasă + un cod de urmărire. Poți alege să auditezi plicul (re-criptat + revelare aleatorie) sau să-l trimiți final. Aplicația de audit e publicată ca pagină statică, funcționează offline. Demonstrabil, fără urmă de îndoială, că platforma NU te-a înșelat de la click la urnă.

  5. 05

    Rezistență la coerciție: re-vot stil estonian

    Pentru fiecare credențial, ultimul vot îl înlocuiește pe precedentul. Platforma NU dezvăluie nimănui (nici alegătorului, nici unui atacator, nici nouă) faptul că un alegător a re-votat. Ai libertatea totală să te răzgândești — protecție pasivă împotriva oricărei presiuni externe.

  6. 06

    Tablă publică append-only

    Fiecare plic + semnătură + transcript DKG + transcript final al numărătorii se publică ca JSON static la /api/v1/voting/[id]/bulletin, semnat de DPO cu o ștampilă electronică calificată QTSP la închidere. Nu se mai poate adăuga sau șterge nimic după aceea — append-only.

  7. 07

    Verificator CLI independent

    Un program separat (packages/lib/voting/verifier) — fără rețea, fără server, rulează replay-ul complet al transcriptului local. Oricine — auditor sau membru — rulează `pnpm db:vote-verify <bulletin.json>` pe propriul calculator și confirmă că suma publicată se potrivește cu plicurile publicate. Discrepanță = rezultat nul automat.

  8. 08

    Ancorare opțională în Bitcoin OP_RETURN

    Hash-ul tablei publice poate fi ancorat în blockchain ca o garanție extra de timestamp. Niciodată un substitut pentru garanțiile Belenios — doar un strat suplimentar. Implementat după un feature flag, oprit din implicit.

  9. 09

    Licență sursă: AGPLv3 pentru biblioteca de vot

    Aplicat la primul commit sub packages/lib/voting/* și ÎNAINTE ca orice scrutin cu efect legal să se deschidă. Restul monorepoului rămâne MIT. AGPLv3 e o licență open-source „virală” care obligă orice modificare să rămână publică — nimeni nu poate face o variantă închisă.

  10. 10

    DPIA semnată de DPO — prerechizit

    Analiza oficială de risc pentru datele alegătorilor (DPIA — Evaluare de Impact privind Protecția Datelor, cerută de RGPD) trebuie scrisă și semnată de responsabilul cu protecția datelor ÎNAINTE de orice scrutin real. Pilotul vară 2026 nu poate intra în producție fără ea.

Alternative considerate

Ce am evaluat și de ce am respins.

Helios

Asume server onest. Modelul nostru de amenințare include un server total compromis. Out.

scytl / SwissPost evoting

Cod sursă închis. Verificarea de către auditor independent e o cerință dură. Out.

Blockchain ca tablă publică

Rezolvă o problemă pe care nu o avem, cu externalități (cost, energie, guvernanță) pe care nu le vrem. Out (vezi ADR 0003).

ElGamal scris de noi în WASM

Risc catastrofal pentru beneficiu neglijabil. @noble/curves e alegerea corectă. Out.

Beneficii

  • Belenios rămâne sigur chiar dacă serverul web e total compromis — exact modelul de amenințare care contează pentru OAR.
  • Reutilizează primitive criptografice bine auditate — nu inventăm criptografie nouă.
  • Verificatorul CLI dă fiecărui membru aceeași certitudine ca un auditor forensic — închide bucla „crede pe cuvânt că e secret”.

Costuri / mitigări

  • DKG + decriptare cu prag adaugă overhead operațional: 5 trustees trebuie să se coordoneze la numărătoare. Mitigare: instrumente bot pentru trustees + chei de recuperare deținute de DPO.
  • Rotația credențialelor per-scrutin înseamnă că un alegător pierde accesul dacă ratează emailul cu credențialul. Mitigare: SMS fallback + extinderea ferestrei de vot la min. 72h.
  • AGPLv3 adaugă complexitate de packaging. Mitigare: izolarea bibliotecii de vot și a verificatorului într-un singur workspace package cu propriul fișier LICENSE.

În afara scopului · amânat

Ce nu facem acum și de ce.

  • Mix networks pentru anonimat mai puternic

    Modelul curent oferă anonimat prin separarea registrului de server; mix-ul adaugă complexitate fără să se potrivească modelului de amenințare Belenios.

  • Tablă publică pe blockchain

    Respins explicit prin ADR 0003.

  • Semnături quantum-rezistente

    Pe roadmap pentru MVP3+.

Documentul oficial ADR (Markdown, în repository) e sursa canonică pentru această decizie. Pagina aceasta îl prezintă într-o formă accesibilă pentru cititorii non-tehnici.