1use crypto_bigint::{const_prime_monty_params, Uint};
2
3use ec::curve_edwards::EdwardsCurve;
4use ec::curve_jacobi_intersection::JacobiIntersectionCurve;
5use ec::curve_jacobi_quartic::JacobiQuarticCurve;
6use ec::curve_montgomery::MontgomeryCurve;
7use ec::curve_ops::Curve;
8use ec::curve_weierstrass::WeierstrassCurve;
9
10use fp::fp_element::FpElement;
11
12use rand::rngs::ThreadRng;
13
14const_prime_monty_params!(Fp19Mod, Uint<1>, "0000000000000013", 2);
16type F19 = FpElement<Fp19Mod, 1>;
17
18fn fp(x: u64) -> F19 {
19 F19::from_u64(x)
20}
21
22fn show_curve<C>(name: &str, curve: &C, rng: &mut ThreadRng)
23where
24 C: Curve + core::fmt::Display,
25 C::Point: core::fmt::Display,
26{
27 println!("============================================================");
28 println!("{name}");
29 println!("------------------------------------------------------------");
30 println!("curve compact : {}", curve);
31 println!("curve pretty :\n{:#}", curve);
32
33 let p = curve.random_point(rng);
34
35 println!("point compact : {}", p);
36 println!("point pretty :\n{:#}", p);
37 println!("on curve? : {}", curve.is_on_curve(&p));
38 println!();
39}
40
41fn main() {
42 let mut rng = rand::rng();
43 let w = WeierstrassCurve::new_short(fp(2), fp(3));
45 show_curve("Weierstrass", &w, &mut rng);
46
47 let m = MontgomeryCurve::new(fp(3), fp(1));
50 show_curve("Montgomery", &m, &mut rng);
51
52 let e = EdwardsCurve::new(fp(2));
55 show_curve("Edwards", &e, &mut rng);
56
57 let jq = JacobiQuarticCurve::new(fp(3), fp(5));
60 show_curve("Jacobi quartic", &jq, &mut rng);
61
62 let ji = JacobiIntersectionCurve::new(fp(2));
66 show_curve("Jacobi intersection", &ji, &mut rng);
67}