summaryrefslogtreecommitdiffstats
path: root/vendor/elliptic-curve/src/arithmetic.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/elliptic-curve/src/arithmetic.rs')
-rw-r--r--vendor/elliptic-curve/src/arithmetic.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/vendor/elliptic-curve/src/arithmetic.rs b/vendor/elliptic-curve/src/arithmetic.rs
new file mode 100644
index 0000000..7ef7fc5
--- /dev/null
+++ b/vendor/elliptic-curve/src/arithmetic.rs
@@ -0,0 +1,86 @@
+//! Elliptic curve arithmetic traits.
+
+use crate::{
+ ops::{Invert, LinearCombination, MulByGenerator, Reduce, ShrAssign},
+ point::AffineCoordinates,
+ scalar::{FromUintUnchecked, IsHigh},
+ Curve, FieldBytes, PrimeCurve, ScalarPrimitive,
+};
+use core::fmt::Debug;
+use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption};
+use zeroize::DefaultIsZeroes;
+
+/// Elliptic curve with an arithmetic implementation.
+pub trait CurveArithmetic: Curve {
+ /// Elliptic curve point in affine coordinates.
+ type AffinePoint: 'static
+ + AffineCoordinates<FieldRepr = FieldBytes<Self>>
+ + Copy
+ + ConditionallySelectable
+ + ConstantTimeEq
+ + Debug
+ + Default
+ + DefaultIsZeroes
+ + Eq
+ + PartialEq
+ + Sized
+ + Send
+ + Sync;
+
+ /// Elliptic curve point in projective coordinates.
+ ///
+ /// Note: the following bounds are provided by [`group::Group`]:
+ /// - `'static`
+ /// - [`Copy`]
+ /// - [`Clone`]
+ /// - [`Debug`]
+ /// - [`Eq`]
+ /// - [`Sized`]
+ /// - [`Send`]
+ /// - [`Sync`]
+ type ProjectivePoint: ConditionallySelectable
+ + ConstantTimeEq
+ + Default
+ + DefaultIsZeroes
+ + From<Self::AffinePoint>
+ + Into<Self::AffinePoint>
+ + LinearCombination
+ + MulByGenerator
+ + group::Curve<AffineRepr = Self::AffinePoint>
+ + group::Group<Scalar = Self::Scalar>;
+
+ /// Scalar field modulo this curve's order.
+ ///
+ /// Note: the following bounds are provided by [`ff::Field`]:
+ /// - `'static`
+ /// - [`Copy`]
+ /// - [`Clone`]
+ /// - [`ConditionallySelectable`]
+ /// - [`ConstantTimeEq`]
+ /// - [`Debug`]
+ /// - [`Default`]
+ /// - [`Send`]
+ /// - [`Sync`]
+ type Scalar: AsRef<Self::Scalar>
+ + DefaultIsZeroes
+ + From<ScalarPrimitive<Self>>
+ + FromUintUnchecked<Uint = Self::Uint>
+ + Into<FieldBytes<Self>>
+ + Into<ScalarPrimitive<Self>>
+ + Into<Self::Uint>
+ + Invert<Output = CtOption<Self::Scalar>>
+ + IsHigh
+ + PartialOrd
+ + Reduce<Self::Uint, Bytes = FieldBytes<Self>>
+ + ShrAssign<usize>
+ + ff::Field
+ + ff::PrimeField<Repr = FieldBytes<Self>>;
+}
+
+/// Prime order elliptic curve with projective arithmetic implementation.
+pub trait PrimeCurveArithmetic:
+ PrimeCurve + CurveArithmetic<ProjectivePoint = Self::CurveGroup>
+{
+ /// Prime order elliptic curve group.
+ type CurveGroup: group::prime::PrimeCurve<Affine = <Self as CurveArithmetic>::AffinePoint>;
+}