1pub(crate) mod field;
8pub(crate) mod scalar;
9
10#[cfg(feature = "hash2curve")]
11mod hash2curve;
12#[cfg(feature = "precomputed-tables")]
13mod tables;
14
15pub use self::scalar::Scalar;
16
17use self::field::FieldElement;
18use crate::NistP521;
19use elliptic_curve::{CurveArithmetic, PrimeCurveArithmetic, hazmat::FieldArithmetic};
20use primeorder::{PrimeCurveParams, point_arithmetic};
21
22pub type AffinePoint = primeorder::AffinePoint<NistP521>;
24
25pub type ProjectivePoint = primeorder::ProjectivePoint<NistP521>;
27
28impl CurveArithmetic for NistP521 {
29 type AffinePoint = AffinePoint;
30 type ProjectivePoint = ProjectivePoint;
31 type Scalar = Scalar;
32}
33
34impl FieldArithmetic for NistP521 {
35 type FieldElement = FieldElement;
36}
37
38impl PrimeCurveArithmetic for NistP521 {
39 type CurveGroup = ProjectivePoint;
40}
41
42impl PrimeCurveParams for NistP521 {
46 type PointArithmetic = point_arithmetic::EquationAIsMinusThree;
47
48 #[cfg(not(feature = "precomputed-tables"))]
49 type Backend = primeorder::mul_backend::VariableOnly;
50 #[cfg(feature = "precomputed-tables")]
52 type Backend = tables::backend::PrecomputedTables;
53
54 const EQUATION_A: FieldElement = FieldElement::from_u64(3).neg();
58
59 const EQUATION_B: FieldElement = FieldElement::from_hex(
63 "0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00",
64 );
65
66 const GENERATOR: (FieldElement, FieldElement) = (
77 FieldElement::from_hex(
78 "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
79 ),
80 FieldElement::from_hex(
81 "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
82 ),
83 );
84}