mod chain;
mod g1;
mod g2;
#[cfg(test)]
mod tests;
use ff::Field;
use CurveProjective;
pub trait OSSWUMap: CurveProjective {
fn osswu_map(u: &<Self as CurveProjective>::Base) -> Self;
}
#[inline(always)]
fn osswu_help<F: Field>(u: &F, xi: &F, ellp_a: &F, ellp_b: &F) -> [F; 7] {
let usq = {
let mut tmp = *u;
tmp.square();
tmp
};
let (nd_common, xi_usq, xi2_u4) = {
let mut tmp = usq;
tmp.mul_assign(xi); let tmp2 = tmp;
tmp.square(); let tmp3 = tmp;
tmp.add_assign(&tmp2); (tmp, tmp2, tmp3)
};
let x0_num = {
let mut tmp = nd_common;
tmp.add_assign(&F::one()); tmp.mul_assign(ellp_b); tmp
};
let x0_den = {
let mut tmp = *ellp_a;
if nd_common.is_zero() {
tmp.mul_assign(xi);
} else {
tmp.mul_assign(&nd_common);
tmp.negate();
}
tmp
};
let gx0_den = {
let mut tmp = x0_den;
tmp.square();
tmp.mul_assign(&x0_den);
tmp };
let gx0_num = {
let mut tmp1 = gx0_den;
tmp1.mul_assign(ellp_b); let mut tmp2 = x0_den;
tmp2.square(); tmp2.mul_assign(&x0_num); tmp2.mul_assign(ellp_a); tmp1.add_assign(&tmp2); tmp2 = x0_num;
tmp2.square(); tmp2.mul_assign(&x0_num); tmp1.add_assign(&tmp2); tmp1
};
[usq, xi_usq, xi2_u4, x0_num, x0_den, gx0_num, gx0_den]
}