-
Notifications
You must be signed in to change notification settings - Fork 96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement a threshold signature scheme. #38
Comments
Here's my reading of the algorithm, translated to (Rust pseudocode and) the context of potentially asymmetric pairing functions Simple signature schemeTo generate a key pair, I pick a random To sign a message To verify my signature, you check that let x = pair(pk, hash(msg));
assert_eq!(x, pair(sk * g1, hash(msg))); // Definition of `pk`.
assert_eq!(x, pair(g1, sk * hash(msg)); // Bilinearity of `pair`.
assert_eq!(x, pair(g1, sig)); // Definition of `sig`. Threshold signature schemeNow we want any A polynomial of degree sk[0] == set.iter().map(|&i| lc(&set, i) * sk[i]).sum() Of course we never actually compute To sign a message sig[0] == set.iter().map(|&i| lc(&set, i) * sig[i]).sum() To verify our signature, you check that let x = pair(pk[0], hash(msg));
assert_eq!(x, pair(sk[0] * g1, hash(msg)); // Definition of `pk[0]`.
assert_eq!(x, pair(g1, sk[0] * hash(msg)); // Bilinearity.
// Lagrange interpolation of `sk`:
assert_eq!(x, pair(g1, set.iter().map(|&i| lc(&set, i) * sk[i]).sum() * hash(msg));
// Pull `hash(msg)` into the sum:
assert_eq!(x, pair(g1, set.iter().map(|&i| lc(&set, i) * sk[i] * hash(msg)).sum());
// Definition of `sig[i]`:
assert_eq!(x, pair(g1, set.iter().map(|&i| lc(&set, i) * sig[i]).sum());
// Lagrange interpolation of `sig`:
assert_eq!(x, pair(g1, sig[0])); Distributed key generationTBD There are ways to create the secret keys without anyone ever knowing |
The common coin is based on threshold signatures: https://eprint.iacr.org/2002/118.pdf (section 4.2)
The text was updated successfully, but these errors were encountered: