use super::blinding::*;
use crate::keys::*;
use rand_core::{CryptoRng, Rng};
fn make_distributed_global_keys_generic<R, PK, SK, F>(
n: usize,
rng: &mut R,
make_keys: F,
make_blinded: fn(&SK, &[BlindingFactor]) -> Option<SK::BlindedType>,
) -> (PK, SK::BlindedType, Vec<BlindingFactor>)
where
R: Rng + CryptoRng,
F: Fn(&mut R) -> (PK, SK),
SK: BlindableGlobalSecretKey,
{
let (pk, sk) = make_keys(rng);
let blinding_factors: Vec<BlindingFactor> =
(0..n).map(|_| BlindingFactor::random(rng)).collect();
#[allow(clippy::unwrap_used)]
let bsk = make_blinded(&sk, &blinding_factors).unwrap();
(pk, bsk, blinding_factors)
}
pub fn make_distributed_pseudonym_global_keys<R: Rng + CryptoRng>(
n: usize,
rng: &mut R,
) -> (
PseudonymGlobalPublicKey,
BlindedPseudonymGlobalSecretKey,
Vec<BlindingFactor>,
) {
make_distributed_global_keys_generic(
n,
rng,
make_pseudonym_global_keys,
make_blinded_pseudonym_global_secret_key,
)
}
pub fn make_distributed_attribute_global_keys<R: Rng + CryptoRng>(
n: usize,
rng: &mut R,
) -> (
AttributeGlobalPublicKey,
BlindedAttributeGlobalSecretKey,
Vec<BlindingFactor>,
) {
make_distributed_global_keys_generic(
n,
rng,
make_attribute_global_keys,
make_blinded_attribute_global_secret_key,
)
}
pub fn make_distributed_global_keys<R: Rng + CryptoRng>(
n: usize,
rng: &mut R,
) -> (GlobalPublicKeys, BlindedGlobalKeys, Vec<BlindingFactor>) {
let (pseudonym_pk, pseudonym_sk) = make_pseudonym_global_keys(rng);
let (attribute_pk, attribute_sk) = make_attribute_global_keys(rng);
let blinding_factors: Vec<BlindingFactor> =
(0..n).map(|_| BlindingFactor::random(rng)).collect();
#[allow(clippy::unwrap_used)]
let blinded_global_keys =
make_blinded_global_keys(&pseudonym_sk, &attribute_sk, &blinding_factors).unwrap();
(
GlobalPublicKeys {
pseudonym: pseudonym_pk,
attribute: attribute_pk,
},
blinded_global_keys,
blinding_factors,
)
}