Group Signatures
The Groupsig Library
The Groupsig library offers interfaces and tests useful for implementing group signatures. These interfaces are based on the work of Diaz, Arroyo and Rodriguez [JAD15] and aim to be flexible to allow for implementing many different types of group signatures. The groupsig library also provides an example implementation: the group signature of Choi, Park and Yung [CPY06].
Groupsig makes use of other Cryptimeleon libraries: Math for mathematical fundamentals and Craco for cryptographic building blocks and protocol facilities. They are included in the Groupsig library and can be used without needing to include them as a dependency. The protocol facilities of Craco are especially relevant, as they include a Schnorr protocol that enables quick and easy implementation of proof of knowledges. These are for example useful in issue/join protocols.
Implementing Your Group Signature
To implement a group signature, you will need to implement the GroupSignatureScheme
interface found in the org.cryptimeleon.groupsig.common
package.
That package contains all the relevant interfaces.
The GroupSignatureScheme
interface contains methods for all the group signature algorithms except the setup algorithm.
Setup is usually delegated to another class, and then the generated public parameters are used to instantiate the GroupSignatureScheme
class.
As the GroupSignatureScheme
interface aims to accomodate many different kinds of group signature schemes, you might not want to implement all its methods.
For example, your scheme might not support the trace
algorithm.
Then you would just have that method throw an UnsupportedOperationException
.
Join Protocol
Usually, the join protocol is given in the form of an interactive protocol.
The GroupSignatureScheme
allows you to implement this via its joinMember
and joinIssuer
methods.
The networking is intended to be realized via the BlockingQueue
parameters, aside from this you are free to implement the networking as you like.
To implement the protocol itself, you can make use of Craco’s protocol facilities. To get an idea of how these work, we recommend you take a look at our protocol tutorial and then our example implementation of [CPY06].
Data Classes
The other interfaces are mostly for data modelling.
GroupMembershipList
contains information about each group member in the form of GMLEntry
instances. These entries are usually generated when the join protocol is complete.
The issuer then updates the group membership list with the new entry.
RevocationList
contains information about the group members that had their membership revoked in the form of RevocationListEntry
instances.
Adding these entries is handled by the reveal
method of the GroupSignatureScheme
interface.
Testing Your Scheme
Groupsig offers some generic testing classes useful for testing GroupSignatureScheme
implementations.
To use them, you will need to include the tests
feature variant of the Groupsig library.
In Gradle this can be done by including the following in the dependency section of your build.gradle
file:
testImplementation(group: 'org.cryptimeleon', name: 'groupsig', version: "insertGroupsigVersionHere") {
capabilities {
requireCapability("org.cryptimeleon:groupsig-tests")
}
}
Included in this dependency is the GroupSignatureTester
class which is responsible for running the tests.
To run your own test, you will need to create a subclass of GroupSignatureTester
.
Then implement a method with the signature public static Stream<GroupSignatureTestParam> getGroupSignatureTestParams()
.
This method collects the parameters used for the test and returns them in the form of a Stream
.
You also need to implement a GroupSignatureTestParam
subclass for your group signature implementation.
This contains the parameters used for the test.
For our [CPY06] group signature, the GroupSignatureTester
subclass may look as follows:
public class GroupSignatureTesterCPY06 extends GroupSignatureTester {
public static Stream<GroupSignatureTestParam> getGroupSignatureTestParams() {
List<GroupSignatureTestParam> params = new LinkedList<>();
params.add(new CPY06TestParams().get());
return params.stream();
}
}
You can now run the tests.
Any methods of GroupSignatureScheme
that throw UnsupportedOperationException
will lead to the corresponding test being ignored.
References
[DAR15] Jesus Diaz and David Arroyo and Francisco B. Rodriguez (2015). “libgroupsig: An extensible C library for group signatures”. https://eprint.iacr.org/2015/1146
[CPY06] Seung Geol Choi, Kunsoo Park, and Moti Yung (2006). “Short Traceable Signatures Based on Bilinear Pairings”. In Advances in Information and Computer Security (pp. 88–103). Springer Berlin Heidelberg.