use crate::params::SecurityLevel;
use hybrid_array::Array;
use subtle::Choice;
use zeroize::Zeroize;
#[allow(clippy::module_inception)]
pub mod fp;
pub mod fp2;
pub mod level1;
pub mod level3;
pub mod level5;
#[derive(Clone, Debug)]
pub struct Fp<L: SecurityLevel> {
pub(crate) limbs: Array<u64, L::FpLimbs>,
}
#[derive(Clone, Debug)]
pub struct Fp2<L: SecurityLevel> {
pub re: Fp<L>,
pub im: Fp<L>,
}
pub trait FpBackend: SecurityLevel {
fn set_zero(out: &mut Array<u64, Self::FpLimbs>);
fn set_one(out: &mut Array<u64, Self::FpLimbs>);
fn set_small(out: &mut Array<u64, Self::FpLimbs>, val: u64);
fn is_equal(a: &Array<u64, Self::FpLimbs>, b: &Array<u64, Self::FpLimbs>) -> Choice;
fn is_zero(a: &Array<u64, Self::FpLimbs>) -> Choice;
fn copy(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn add(
out: &mut Array<u64, Self::FpLimbs>,
a: &Array<u64, Self::FpLimbs>,
b: &Array<u64, Self::FpLimbs>,
);
fn sub(
out: &mut Array<u64, Self::FpLimbs>,
a: &Array<u64, Self::FpLimbs>,
b: &Array<u64, Self::FpLimbs>,
);
fn neg(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn mul(
out: &mut Array<u64, Self::FpLimbs>,
a: &Array<u64, Self::FpLimbs>,
b: &Array<u64, Self::FpLimbs>,
);
fn sqr(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn inv(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn sqrt(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn is_square(a: &Array<u64, Self::FpLimbs>) -> Choice;
fn half(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn div3(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn exp3div4(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>);
fn mul_small(out: &mut Array<u64, Self::FpLimbs>, a: &Array<u64, Self::FpLimbs>, val: u32);
fn encode(out: &mut [u8], a: &Array<u64, Self::FpLimbs>);
fn decode(out: &mut Array<u64, Self::FpLimbs>, bytes: &[u8]) -> Choice;
fn decode_reduce(out: &mut Array<u64, Self::FpLimbs>, bytes: &[u8]);
fn cswap(a: &mut Array<u64, Self::FpLimbs>, b: &mut Array<u64, Self::FpLimbs>, ctl: Choice);
fn select(
out: &mut Array<u64, Self::FpLimbs>,
a0: &Array<u64, Self::FpLimbs>,
a1: &Array<u64, Self::FpLimbs>,
ctl: Choice,
);
}
impl<L: SecurityLevel> Zeroize for Fp<L> {
fn zeroize(&mut self) {
self.limbs.as_mut_slice().zeroize();
}
}
impl<L: SecurityLevel> Zeroize for Fp2<L> {
fn zeroize(&mut self) {
self.re.zeroize();
self.im.zeroize();
}
}