Skip to main content

foundry_mpc_rs/point/
point.rs

1use elliptic_curve::Scalar;
2use elliptic_curve::ScalarPrimitive;
3use serde::{Deserialize, Serialize};
4
5use crate::compat::CSCurve;
6
7#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
8pub struct Point256 {
9    pub x: [u8; 32],
10    pub y: [u8; 32],
11}
12
13impl Point256 {
14    pub fn x_scalar<C: CSCurve>(&self) -> C::Scalar {
15        let x_scalar_primitive = ScalarPrimitive::<C>::from_slice(&self.x).unwrap();
16        let x_scalar = Scalar::<C>::from(x_scalar_primitive);
17        x_scalar
18    }
19
20    pub fn y_scalar<C: CSCurve>(&self) -> C::Scalar {
21        let y_scalar_primitive = ScalarPrimitive::<C>::from_slice(&self.y).unwrap();
22        let y_scalar = Scalar::<C>::from(y_scalar_primitive);
23        y_scalar
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use elliptic_curve::CurveArithmetic;
30    use k256::Secp256k1;
31
32    use super::*;
33
34    #[test]
35    fn test_point256() {
36        let mut point = Point256 {
37            x: [0; 32],
38            y: [0; 32],
39        };
40        point.y[31] = 1;
41        let x_scalar = point.x_scalar::<Secp256k1>();
42        assert_eq!(x_scalar, <Secp256k1 as CurveArithmetic>::Scalar::ZERO);
43        let y_scalar = point.y_scalar::<Secp256k1>();
44        assert_eq!(y_scalar, <Secp256k1 as CurveArithmetic>::Scalar::ONE);
45    }
46}