decaf377/ark_curve/element/
affine.rs

1use core::hash::Hash;
2
3use crate::ark_curve::element::EdwardsAffine;
4use ark_std::fmt::{Display, Formatter, Result as FmtResult};
5use ark_std::Zero;
6
7use zeroize::Zeroize;
8
9use crate::Element;
10
11#[derive(Copy, Clone)]
12pub struct AffinePoint {
13    pub(crate) inner: EdwardsAffine,
14}
15
16impl Hash for AffinePoint {
17    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
18        self.inner.hash(state);
19    }
20}
21
22impl Default for AffinePoint {
23    fn default() -> Self {
24        Element::default().into()
25    }
26}
27
28impl core::iter::Sum<AffinePoint> for Element {
29    fn sum<I: Iterator<Item = AffinePoint>>(iter: I) -> Self {
30        iter.fold(Self::zero(), core::ops::Add::add)
31    }
32}
33
34impl<'a> core::iter::Sum<&'a AffinePoint> for Element {
35    fn sum<I: Iterator<Item = &'a AffinePoint>>(iter: I) -> Self {
36        iter.fold(Self::zero(), core::ops::Add::add)
37    }
38}
39
40impl PartialEq for AffinePoint {
41    fn eq(&self, other: &AffinePoint) -> bool {
42        // Section 4.5 of Decaf paper
43        self.inner.x * other.inner.y == self.inner.y * other.inner.x
44    }
45}
46
47impl Eq for AffinePoint {}
48
49impl core::fmt::Debug for AffinePoint {
50    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
51        let element: Element = self.into();
52        f.write_fmt(format_args!(
53            "decaf377::AffinePoint({})",
54            hex::encode(&element.vartime_compress().0[..])
55        ))
56    }
57}
58
59impl Display for AffinePoint {
60    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
61        let element: Element = self.into();
62        write!(
63            f,
64            "decaf377::AffinePoint({})",
65            hex::encode(&element.vartime_compress().0[..])
66        )
67    }
68}
69
70impl Zeroize for AffinePoint {
71    fn zeroize(&mut self) {
72        self.inner.zeroize()
73    }
74}