Distributed key generation + proxy re-encryption
nube is a Rust implementation of a proxy re-encryption algorithm with distributed key generation.
See notes/dkg.lyx for the scheme descriptioin.
Usage example
use ;
// In this example, we're going to create KeyFrags for a 2-of-3 PRE (T=2, N=3)
let threshold = 2;
let shares = 3;
//
// Keymakers
//
// Let's assume there's a DKG of Ñ=4 keymakers
let keymaker1 = random;
let keymaker2 = random;
let keymaker3 = random;
let keymaker4 = random;
//
// Encryptor
//
// Accumulate the encryption key
let key_parts = ;
let encryption_key = &key_parts + &key_parts + &key_parts + &key_parts;
// Now, Encryptor encrypts something with the DKG encryption key
// For simplicity, we don't deal with messages here but only with the computation
// of the secret factor used to derive the symmetric key that encrypts the message
// TODO: use the symmetric key to encrypt a ciphertext.
let = encrypt;
//
// Recipient
//
// Recipient creates a secret key for decryption,
// and a public key that will be a target for keyslivers/keyfrags.
let recipient_sk = random;
let recipient_pk = recipient_sk.public_key;
//
// Author
//
// Author creates a label and sends it to Keymakers, requesting key slivers
let label = b"some label";
// Keymakers make key slivers intended for Recipient
let ksliver1 = keymaker1.make_key_sliver;
let ksliver2 = keymaker2.make_key_sliver;
let ksliver3 = keymaker3.make_key_sliver;
let ksliver4 = keymaker4.make_key_sliver;
// The slivers are sent back to the Author who repackages them into kfrags.
let kfrags = generate_kfrags.unwrap;
//
// Proxies
//
// Proxies reencrypt the keyfrags.
let cfrag0 = reencrypt;
let _cfrag1 = reencrypt;
let cfrag2 = reencrypt;
//
// Recipient
//
// Recipient decryptis with 2 out of 3 cfrags
let decrypted_key = decrypt.unwrap;
assert_eq!;