ed448_goldilocks_plus/decaf/
ops.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use core::{
    borrow::Borrow,
    iter::Sum,
    ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign},
};

use crate::{curve::scalar_mul::double_and_add, Scalar};

use super::DecafPoint;

/// Scalar Mul Operations
impl<'s, 'p> Mul<&'s Scalar> for &'p DecafPoint {
    type Output = DecafPoint;
    fn mul(self, scalar: &'s Scalar) -> DecafPoint {
        // XXX: We can do better than double and add
        DecafPoint(double_and_add(&self.0, scalar))
    }
}

define_mul_variants!(LHS = DecafPoint, RHS = Scalar, Output = DecafPoint);

impl<'s, 'p> Mul<&'p DecafPoint> for &'s Scalar {
    type Output = DecafPoint;
    fn mul(self, point: &'p DecafPoint) -> DecafPoint {
        point * self
    }
}

define_mul_variants!(LHS = Scalar, RHS = DecafPoint, Output = DecafPoint);

impl<'s> MulAssign<&'s Scalar> for DecafPoint {
    fn mul_assign(&mut self, scalar: &'s Scalar) {
        *self = *self * scalar;
    }
}
impl MulAssign<Scalar> for DecafPoint {
    fn mul_assign(&mut self, scalar: Scalar) {
        *self = *self * scalar;
    }
}

// Point addition

impl<'a, 'b> Add<&'a DecafPoint> for &'b DecafPoint {
    type Output = DecafPoint;
    fn add(self, other: &'a DecafPoint) -> DecafPoint {
        DecafPoint(self.0.to_extensible().add_extended(&other.0).to_extended())
    }
}

define_add_variants!(LHS = DecafPoint, RHS = DecafPoint, Output = DecafPoint);

impl AddAssign<&DecafPoint> for DecafPoint {
    fn add_assign(&mut self, other: &DecafPoint) {
        *self = *self + other;
    }
}
impl AddAssign for DecafPoint {
    fn add_assign(&mut self, other: DecafPoint) {
        *self = *self + other;
    }
}

// Point Subtraction

impl<'a, 'b> Sub<&'a DecafPoint> for &'b DecafPoint {
    type Output = DecafPoint;
    fn sub(self, other: &'a DecafPoint) -> DecafPoint {
        DecafPoint(self.0.to_extensible().sub_extended(&other.0).to_extended())
    }
}

define_sub_variants!(LHS = DecafPoint, RHS = DecafPoint, Output = DecafPoint);

impl SubAssign<&DecafPoint> for DecafPoint {
    fn sub_assign(&mut self, other: &DecafPoint) {
        *self = *self - other;
    }
}
impl SubAssign for DecafPoint {
    fn sub_assign(&mut self, other: DecafPoint) {
        *self = *self - other;
    }
}

// Point Negation

impl<'b> Neg for &'b DecafPoint {
    type Output = DecafPoint;
    fn neg(self) -> DecafPoint {
        DecafPoint(self.0.negate())
    }
}
impl Neg for DecafPoint {
    type Output = DecafPoint;
    fn neg(self) -> DecafPoint {
        (&self).neg()
    }
}

impl<T> Sum<T> for DecafPoint
where
    T: Borrow<DecafPoint>,
{
    fn sum<I>(iter: I) -> Self
    where
        I: Iterator<Item = T>,
    {
        iter.fold(Self::IDENTITY, |acc, item| acc + item.borrow())
    }
}