epir 0.0.1

EllipticPIR client library (Rust implementation).
Documentation
use criterion::{criterion_group, criterion_main, Criterion};

use epir::*;
use epir::ecelgamal::*;

fn bench_load_mg(c: &mut Criterion) {
    let mut group = c.benchmark_group("load_mg");
    group.sample_size(10);
    group.bench_function("load_mg", |b| {
        b.iter(|| {
            DecryptionContext::load_from_file(None).unwrap();
        })
    });
    group.finish();
}

fn bench_encrypt(c: &mut Criterion) {
    let mut rng: DefaultRng = Default::default();
    let privkey = PrivateKey::new(&mut rng);
    let pubkey = PublicKey::new(&privkey);
    c.bench_function("encrypt_normal", |b| {
        b.iter(|| {
            pubkey.encrypt(&1234u32.into(), &mut rng);
        })
    });
    c.bench_function("encrypt_fast", |b| {
        b.iter(|| {
            privkey.encrypt(&1234u32.into(), &mut rng);
        })
    });
}

fn bench_decrypt(c: &mut Criterion) {
    let mut rng: DefaultRng = Default::default();
    let privkey = PrivateKey::new(&mut rng);
    let cipher = privkey.encrypt(&1234u32.into(), &mut rng);
    let dec_ctx = DecryptionContext::load_from_file(None).unwrap();
    c.bench_function("decrypt", |b| {
        b.iter(|| {
            dec_ctx.decrypt_cipher(&privkey, &cipher).unwrap();
        })
    });
}

const MMAX_MOD: u8 = 16;
const MMAX: u32 = 1 << MMAX_MOD;

fn bench_generate(c: &mut Criterion) {
    let mut group = c.benchmark_group("generate");
    let mut mgs = Vec::new();
    group.sample_size(10);
    group.bench_function("no_sort", |b| {
        b.iter(|| {
            mgs = DecryptionContext::generate_no_sort(Some(MMAX), None::<fn(_)>);
        })
    });
    group.sample_size(100);
    group.bench_function("sort", |b| {
        b.iter(|| {
            DecryptionContext::generate_sort(&mut mgs);
        })
    });
    group.finish();
}

criterion_group!(benches, bench_load_mg, bench_encrypt, bench_decrypt, bench_generate);
criterion_main!(benches);