Back in 2013/2014 I was working on vVote Verifiable Voting System, which involved implementing a number of threshold cryptographic protocols. At the time there was very little by way of examples or frameworks to learn/play with threshold crypto. Recently I had some time available to take what I had learnt over those years, and since, and put together a library of threshold cryptographic protocols. The library is open source and written in Java. It is not intended as a commercial use library, more something for those interested in threshold cryptography, and fellow academics, to play around with.
It combines an abstract communication framework to allow a diverse range of distributed communication protocols to be run. It is still very much a work in progress, and any contributions/feedback are welcome. I should also note that the entire vVote system is also open source
A number of different protocols have been implemented, some with caveats around their real world use. The documentation provides an overview of each protocol as well as instructions for running the samples. The currently implemented protocols are as follows:
The protocols that are currently implemented are as follows:
- Distributed Coin Toss
- Distributed Pedersen Commitment
- Distributed Threshold ElGamal Key Generation (Feldman)
- Distributed Threshold BLS Key Generation (Feldman)
- Threshold ElGamal Decryption
- Distributed Threshold ElGamal Plaintext Equivalence Tests
Communication Layer Framework
The basic goal of this framework is to provide an abstract communication layer, which can be instantiated with various different underlying communication channels. This allows users of the Communication Layer Framework to be agnostic of the underlying channel, and even to change channels without requiring any modification of their code. For example, during development it could use an in-memory channel, before moving towards a socket based channel.
Additionally, the underlying message structure is also abstracted away. This allows modification of the underlying channel without impact on the higher level application. For example, the Communication Layer can be switched from using JSON to XML by just passing a different instantiation of the relevant CommunicationLayerMessage classes.
There is separate documentation for the Communication Layer Framework.
Currently the source code is still structured as an Eclipse project - it is currently only me working on it so that suffices. When I get the time, or if I get any interest from others wanting to work on it, I will move it to a more collaborative friendly build system - probably gradle, although I’d be open to suggestions.