foundry-mpc-rs 0.1.2

shamir-secret-sharing implementation forked from Lúcás C. Meier's cait_sith protocol and ZcashFoundation's frost
Documentation
use elliptic_curve::Scalar;
use elliptic_curve::ScalarPrimitive;
use serde::{Deserialize, Serialize};

use crate::compat::CSCurve;

#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Point256 {
    pub x: [u8; 32],
    pub y: [u8; 32],
}

impl Point256 {
    pub fn x_scalar<C: CSCurve>(&self) -> C::Scalar {
        let x_scalar_primitive = ScalarPrimitive::<C>::from_slice(&self.x).unwrap();
        let x_scalar = Scalar::<C>::from(x_scalar_primitive);
        x_scalar
    }

    pub fn y_scalar<C: CSCurve>(&self) -> C::Scalar {
        let y_scalar_primitive = ScalarPrimitive::<C>::from_slice(&self.y).unwrap();
        let y_scalar = Scalar::<C>::from(y_scalar_primitive);
        y_scalar
    }
}

#[cfg(test)]
mod tests {
    use elliptic_curve::CurveArithmetic;
    use k256::Secp256k1;

    use super::*;

    #[test]
    fn test_point256() {
        let mut point = Point256 {
            x: [0; 32],
            y: [0; 32],
        };
        point.y[31] = 1;
        let x_scalar = point.x_scalar::<Secp256k1>();
        assert_eq!(x_scalar, <Secp256k1 as CurveArithmetic>::Scalar::ZERO);
        let y_scalar = point.y_scalar::<Secp256k1>();
        assert_eq!(y_scalar, <Secp256k1 as CurveArithmetic>::Scalar::ONE);
    }
}