Serverless web app that allows organizing single-choice and multi-choice polls that combine privacy and universal verifiability with the help of some applied cryptography.
Core technologies:
- Rust programming language, WASM and Yew framework for dynamic logic
- Webpack packager
- Bootstrap and Bootstrap Icons for styling
- Additively homomorphic ElGamal encryption and related zero-knowledge proofs
to prove authenticity of voting and tallying without disclosing any information
powered by the
elastic-elgamal
library with the Ristretto255 crypto backend
See the Implementation page for details on how the app works, and the About page for more details on technologies used.
Cryptography behind the app was not independently audited, in particular against side-channel (e.g., timing) attacks.
The app entirely lacks a server part; the poll state is stored within the browser. It is participants’ responsibility to exchange data via a reliable broadcast channel, sync it among themselves, and to back this data up if needed.
The application is early-stage and the backward compatibility is not yet a thing. Thus, polls created in one version of the app may become unreadable in the following versions.
You will need to install a Node / npm toolchain (preferably via a manager like nvm
)
and a Rust toolchain (preferably via rustup
). Both toolchains should be recent; i.e., Node 20-LTS
and Rust 1.80+. You should also install wasm-pack
.
To serve the app locally with the Webpack dev server, run
npm start
To run tests, use npm test
.
Be aware that this command requires specifying browsers used for testing as flags
(e.g., -- --firefox
).
Consult package.json
for the full list of linting and testing commands.
Note that Rust-related linting requires additional components (fmt
and clippy
) installed as a part
of the relevant toolchain.
Licensed under Apache-2.0 license.