#![allow(dead_code)]
use super::bn::{self, Modulus};
use super::paillier::PrivateKey;
use purecrypto::bignum::BoxedUint;
use purecrypto::rng::RngCore;
pub const SAFE_PRIME_BITS: usize = 1024;
#[cfg(not(test))]
pub(crate) const MIN_PEER_MODULUS_BITS: usize = 2 * SAFE_PRIME_BITS;
#[cfg(test)]
pub(crate) const MIN_PEER_MODULUS_BITS: usize = 512;
#[derive(Clone)]
pub struct LocalPreParams {
pub paillier_sk: PrivateKey,
pub ntilde_i: BoxedUint,
pub h1i: BoxedUint,
pub h2i: BoxedUint,
pub alpha: BoxedUint,
pub beta: BoxedUint,
pub p: BoxedUint,
pub q: BoxedUint,
}
impl LocalPreParams {
pub fn generate<R: RngCore>(safe_prime_bits: usize, rng: &mut R) -> LocalPreParams {
let pai_p = bn::generate_safe_prime(safe_prime_bits, rng);
let pai_q = bn::generate_safe_prime(safe_prime_bits, rng);
let paillier_sk = PrivateKey::from_primes(pai_p, pai_q);
let (p, safe_p) = bn::generate_germain(safe_prime_bits, rng);
let (q, safe_q) = bn::generate_germain(safe_prime_bits, rng);
let ntilde_i = bn::mul(&safe_p, &safe_q);
let ord = bn::mul(&p, &q);
let modn = Modulus::new(ñ_i);
let f1 = bn::rand_unit(ñ_i, rng);
let (alpha, beta) = loop {
let a = bn::rand_unit(ñ_i, rng);
if let Some(b) = bn::mod_inv(&a, &ord) {
break (a, b);
}
};
let h1i = modn.mul(&f1, &f1);
let h2i = modn.pow(&h1i, &alpha);
LocalPreParams {
paillier_sk,
ntilde_i,
h1i,
h2i,
alpha,
beta,
p,
q,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ecdsatss::dlnproof;
use purecrypto::rng::OsRng;
#[test]
#[ignore = "safe-prime generation is slow"]
fn generate_yields_valid_dln_setup() {
let mut rng = OsRng;
let pp = LocalPreParams::generate(256, &mut rng);
let proof = dlnproof::prove(
&pp.h1i,
&pp.h2i,
&pp.alpha,
&pp.p,
&pp.q,
&pp.ntilde_i,
&mut rng,
);
assert!(dlnproof::verify(&proof, &pp.h1i, &pp.h2i, &pp.ntilde_i));
}
}