use subtle::{Choice, CtOption};
use crate::{prime::PrimeGroup, Curve, CurveAffine, Group, GroupEncoding, GroupOps, GroupOpsOwned};
pub trait CofactorGroup:
Group
+ GroupEncoding
+ GroupOps<<Self as CofactorGroup>::Subgroup>
+ GroupOpsOwned<<Self as CofactorGroup>::Subgroup>
{
type Subgroup: PrimeGroup<Scalar = Self::Scalar> + Into<Self>;
fn clear_cofactor(&self) -> Self::Subgroup;
fn into_subgroup(self) -> CtOption<Self::Subgroup>;
fn is_small_order(&self) -> Choice {
self.clear_cofactor().is_identity()
}
fn is_torsion_free(&self) -> Choice;
}
pub trait CofactorCurve: Curve + CofactorGroup {}
pub trait CofactorCurveAffine: CurveAffine {}
impl<C: CurveAffine> CofactorCurveAffine for C where C::Curve: CofactorCurve {}