franklin-crypto 0.32.11

Cryptographic library for SNARK gadgets, based on sapling-crypto
mod test {
    use super::*;
    use crate::alt_babyjubjub::edwards::Point;
    use crate::alt_babyjubjub::fs::Fs;
    use crate::alt_babyjubjub::AltJubjubBn256;
    use crate::bellman::pairing::bn256::{Bn256, Fr};
    use crate::generic_twisted_edwards::bn256::*;
    use crate::generic_twisted_edwards::edwards::*;
    use crate::rand::{Rand, Rng, SeedableRng, XorShiftRng};
    use bellman::ScalarEngine;

    #[test]
    fn test_new_edwards_addition() {
        let rng = &mut XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);

        let jubjub = AltBabyJubjubBn256::get_implementor();
        let jubjub_params = AltJubjubBn256::new();

        for _ in 0..10 {
            let p = jubjub.rand(rng);
            let (p_x, p_y) = p.into_xy();
            let q = jubjub.rand(rng);
            let (q_x, q_y) = q.into_xy();

            let (expected_x, expected_y) = {
                let p = Point::<Bn256, _>::from_xy(p_x, p_y, &jubjub_params).expect("a point");
                let q = Point::from_xy(q_x, q_y, &jubjub_params).expect("a point");

                let expected = p.add(&q, &jubjub_params);

                let (x, y) = expected.into_xy();

                let expected_x: <Bn256 as ScalarEngine>::Fr = x;
                let expected_y: <Bn256 as ScalarEngine>::Fr = y;

                (expected_x, expected_y)
            };

            let (actual_x, actual_y) = jubjub.add(&p, &q).into_xy();

            assert_eq!(expected_x, actual_x);
            assert_eq!(expected_y, actual_y);
        }
    }

    #[test]
    fn test_new_edwards_doubling() {
        let rng = &mut XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);

        let jubjub = AltBabyJubjubBn256::get_implementor();
        let jubjub_params = AltJubjubBn256::new();

        for _ in 0..10 {
            let p = jubjub.rand(rng);
            let (p_x, p_y) = p.into_xy();

            let (expected_x, expected_y) = {
                let p = Point::<Bn256, _>::from_xy(p_x, p_y, &jubjub_params).expect("a point");

                let expected = p.double(&jubjub_params);

                let (x, y) = expected.into_xy();

                let expected_x: <Bn256 as ScalarEngine>::Fr = x;
                let expected_y: <Bn256 as ScalarEngine>::Fr = y;

                (expected_x, expected_y)
            };

            let (actual_x, actual_y) = jubjub.double(&p).into_xy();

            assert_eq!(expected_x, actual_x);
            assert_eq!(expected_y, actual_y);
        }
    }

    #[test]
    fn test_new_edwards_mul_scalar() {
        let rng = &mut XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);

        let jubjub = AltBabyJubjubBn256::get_implementor();
        let jubjub_params = AltJubjubBn256::new();

        for _ in 0..10 {
            let p = jubjub.rand(rng);
            let (p_x, p_y) = p.into_xy();

            let scalar = Fs::rand(rng);

            let (expected_x, expected_y) = {
                let p = Point::<Bn256, _>::from_xy(p_x, p_y, &jubjub_params).expect("a point");

                let expected = p.mul(scalar, &jubjub_params);

                let (x, y) = expected.into_xy();

                let expected_x: <Bn256 as ScalarEngine>::Fr = x;
                let expected_y: <Bn256 as ScalarEngine>::Fr = y;

                (expected_x, expected_y)
            };

            let (actual_x, actual_y) = jubjub.mul(&p, scalar).into_xy();

            assert_eq!(expected_x, actual_x);
            assert_eq!(expected_y, actual_y);
        }
    }

    #[test]
    fn test_new_edwards_negate() {
        let rng = &mut XorShiftRng::from_seed([0x5dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]);

        let jubjub = AltBabyJubjubBn256::get_implementor();
        let jubjub_params = AltJubjubBn256::new();

        for _ in 0..10 {
            let p = jubjub.rand(rng);
            let (p_x, p_y) = p.into_xy();

            let p_negate = jubjub.negate(&p);
            let (actual_x, actual_y) = p_negate.into_xy();

            let (expected_x, expected_y) = {
                let p = Point::<Bn256, _>::from_xy(p_x, p_y, &jubjub_params).expect("a point");

                let expected = p.negate();

                let (x, y) = expected.into_xy();

                let expected_x: <Bn256 as ScalarEngine>::Fr = x;
                let expected_y: <Bn256 as ScalarEngine>::Fr = y;

                (expected_x, expected_y)
            };

            assert_eq!(actual_x, expected_x);
            assert_eq!(actual_y, expected_y);
        }
    }
}