This monorepo contains the ElectionGuard 2.0+ code. The core functionality is implemented in C++ for performance and interoperability. It provides functionality for all ElectionGuard workflows including key ceremony, ballot encryption, tally, ballot decryption, and verification. It is designed to be integrated into existing (or new) voting system software. It includes a variety of interop layers to provide functionality to languages including C, .NET, and Java.
This repository is pre-release
software to showcase the ElectionGuard API implemented in a native language. It is not feature complete and should not be used for production applications.
File/folder | Description |
---|---|
.github |
Github workflows and issue templates |
.vscode |
VS Code configurations |
/bindings |
Binding interfaces for different languages |
/cmake |
CMake dependencies` |
/include |
Public include headers |
/src |
ElectionGuard source code |
/test |
Unit tests |
.clang-format |
Style guidelines |
.gitignore |
Define what to ignore at commit time. |
CMakeLists.txt |
Root CMake file |
CONTRIBUTING.md |
Guidelines for contributing to the sample. |
README.md |
This README file. |
LICENSE |
The license for the sample. |
ElectionGuard is an open source software development kit (SDK) that makes voting more secure, transparent and accessible. The ElectionGuard SDK leverages homomorphic encryption to ensure that votes recorded by electronic systems of any type remain encrypted, secure, and secret. Meanwhile, ElectionGuard also allows verifiable and accurate tallying of ballots by any 3rd party organization without compromising secrecy or security.
Learn More in the ElectionGuard Repository
ElectionGuard supports a variety of use cases. The Primary use case is to generate verifiable end-to-end (E2E) encrypted elections. The ElectionGuard process can also be used for other use cases such as privacy enhanced risk-limiting audits (RLAs). This implementation only includes encryption functions and cannot be used to generate election keys and it cannot decrypt tally results.
This C++ implementation also includes a C API that can be consumed from anywhere that can call C code directly. A .Net Standard package is also provided.
- A C++17 standard compliant compiler is required to build the core library. While any modern compiler should work, the library is tested on a subset. Check out the GitHub actions to see what is officially supported.
- GNU Make is used to simplify the commands and GitHub Actions. This approach is recommended to simplify the command line experience. This is built in for MacOS and Linux. For Windows, setup is simpler with Chocolatey and installing the provided make package. The other Windows option is manually installing make.
- CMake is used to simplify the build experience.
To build for android, you need the Android SDK and platforms 21 and 26. The easiest way is to download android studio. Alternatively, you can use the SDK installation that ships with the Xamarin Tooling in Visual Studio. WE also require the use of the Android NDK. Android builds can be compiled on Linux, Mac, or Windows
To build for iOS you need XCode installed
- XCode and the Command Line Tools for XCode
- CMake 3.19 may be necessary, along with changes to the Makefile. See ISSUE #138
The automated install of dependencies is currently only supported on debian-based systems. See the makefile for more information.
Building for WebAssembly (wasm) is supported with the emscripten
toolchain. This currently is setup for compiling on Linux and Mac only.
- Install emscripten
- Install Node Version Manager
- Ensure the latest versions of both emscripten and node are activated
- Ensure Emscripten and node are both in your path
- run
make test-wasm
to build for wasm and validate the library.
Building on windows is supported using the MSVC
toolchain. MSVC is the default toolchain on Windows. All of these tools should be installed as admin or in a command prompt as admin to make sure that all of the security settings are appropriate. As for the Visual Studio 2022 install, VS 2022 Community edition will work for developing ElectionGuard. You also may use Professional or Enterprise versions.
- Install Chocolatey
- Install Visual Studio Code or Visual Studio Code
- Install Github CommandLine or Github CLI or Github Desktop
- Install Powershell Core
- Install VS 2022 or VS 2022
- Open the Visual Studio Installer and install
When compiling with shared libraries, you may encounter an error running the unit tests project. This is likely due to windows resolving the incorrect implementation of libstdc++-6.dll
. Solving this depends on your use case, but you can either ensure that the path modifications made above appear before any other paths which include this library (e.g. c\Windows\System32), or you can include a copy of the correct DLL in the output folder. See this StackOverflow post for more information
A .NET Standard binding library is provided so that this package can be consumed from C# applications. At this time, MacOS, Linux and Windows are supported.
- Latest DotNet SDK
- Visual Studio
- NuGet Command Line (CLI)
- On Linux, you need Mono
Using make,
make environment
make build
export TARGET=Debug && make build
The Android Build currently Targets API Level 26 but can be configured by modifying the Makefile
Set the path to the NDK, replacing the version with your own
export NDK_PATH=/Users/$USER/Library/Android/sdk/ndk/21.3.6528147 && make build-android
The iOS build currently targets iPhone OS 12 but can be configured by modifying the Makefile
Creates a fat binary for the simulator and targets a recent version of iOS
make build-ios
Using the default MSVC 2022 toolchain (with optional platform builds):
make build
make build-arm64
make build-x86
make build-x64
Wraps the build artifacts in a C# wrapper conforming to .Net Standard 2.0.
make build-netstandard
make test
To run the tests when building for the current host (Linux, Mac, windows:)
make build-netstandard
make test-netstandard
To run the tests when building for a mobile device, you can run the .Net Standard tests using the Xamarin Test runner on the Android Emulator or the iOS simulator:
NOTE: Xamarin build support is temporarily disabled while the project migrates to the new SDK style project format. Please refer to ISSUE #195 for more information.
make build-netstandard
Then, open Visual studio for Mac and run the ElectionGuard.Tests.Android
or ElectionGuard.Tests.iOS
project.
There is a command line interface in the ./apps/electionguard-cli
folder. This is a tool useful for generating test data and interacting with ElectionGuard.
make build-cli
make test-cli
make verify
This project encourages community contributions for development, testing, documentation, code review, and performance analysis, etc. For more information on how to contribute, see the contribution guidelines
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.
Please report any bugs, feature requests, or enhancements using the GitHub Issue Tracker. Please do not report any security vulnerabilities using the Issue Tracker. Instead, please report them to the Microsoft Security Response Center (MSRC) at https://msrc.microsoft.com/create-report. See the Security Documentation for more information.
ElectionGuard would love for you to ask questions out in the open using GitHub Discussions.
This repository is licensed under the MIT License
A huge thank you to those who helped to contribute to this project so far, including:
Olivier Pereira (Microsoft)
Steve Maier (InfernoRed Technology)
Keith Fung (InfernoRed Technology)
Matt Wilhelm (InfernoRed Technology)
Dan S. Wallach (Rice University)
Marina Polubelova (INRIA Paris)
Santiago Zanella-BΓ©guelin (Microsoft Research)