use elliptic_curve::bigint::ArrayEncoding;
use elliptic_curve::ops::Reduce;
use elliptic_curve::point::AffineCoordinates;
use elliptic_curve::scalar::IsHigh;
use elliptic_curve::sec1::{FromSec1Point, ModulusSize, ToSec1Point};
use elliptic_curve::{CurveArithmetic, FieldBytesSize, PrimeCurve};
use rustcrypto_ff::{Field, PrimeField};
use rustcrypto_group::prime::{PrimeCurveAffine, PrimeGroup};
use rustcrypto_group::{Curve as GroupCurve, Group, GroupEncoding};
pub trait DklsCurve:
CurveArithmetic<
AffinePoint: GroupEncoding
+ PrimeCurveAffine<
Curve = <Self as CurveArithmetic>::ProjectivePoint,
Scalar = <Self as CurveArithmetic>::Scalar,
> + AffineCoordinates<FieldRepr = elliptic_curve::FieldBytes<Self>>,
Scalar: Reduce<Self::Uint>
+ Reduce<elliptic_curve::FieldBytes<Self>>
+ IsHigh
+ Field
+ PrimeField,
ProjectivePoint: Group
+ PrimeGroup
+ GroupCurve<AffineRepr = <Self as CurveArithmetic>::AffinePoint>,
> + PrimeCurve
+ Sized
+ 'static
{
}
impl<C> DklsCurve for C
where
C: CurveArithmetic + PrimeCurve + Sized + 'static,
C::Uint: ArrayEncoding,
<C as CurveArithmetic>::AffinePoint: GroupEncoding
+ PrimeCurveAffine<
Curve = <C as CurveArithmetic>::ProjectivePoint,
Scalar = <C as CurveArithmetic>::Scalar,
> + AffineCoordinates<FieldRepr = elliptic_curve::FieldBytes<C>>
+ FromSec1Point<C>
+ ToSec1Point<C>,
<C as CurveArithmetic>::Scalar:
Reduce<C::Uint> + Reduce<elliptic_curve::FieldBytes<C>> + IsHigh + Field + PrimeField,
<C as CurveArithmetic>::ProjectivePoint:
Group + PrimeGroup + GroupCurve<AffineRepr = <C as CurveArithmetic>::AffinePoint>,
FieldBytesSize<C>: ModulusSize,
{
}
pub trait AddressScheme<C: DklsCurve> {
fn compute_address(pk: &<C as CurveArithmetic>::AffinePoint) -> String;
}