ed25519_to_curve25519 0.2.1

Convert ed25519 keys and sign to curve25519
Documentation
#![allow(clippy::all)]
use crate::field_element_2625::FieldElement2625;

pub type FieldElement = FieldElement2625;

impl FieldElement {
    /// Compute (self^(2^250-1), self^11)
    fn pow22501(&self) -> (FieldElement, FieldElement) {
        // Instead of managing which temporary variables are used
        // for what, we define as many as we need and leave stack
        // allocation to the compiler
        //
        // Each temporary variable t_i is of the form (self)^e_i.
        // Squaring t_i corresponds to multiplying e_i by 2,
        // so the pow2k function shifts e_i left by k places.
        // Multiplying t_i and t_j corresponds to adding e_i + e_j.
        //
        // Temporary t_i                      Nonzero bits of e_i
        //
        let t0 = self.square(); //            1         e_0 = 2^1
        let t1 = t0.square().square(); //     3         e_1 = 2^3
        let t2 = self * &t1; //               3,0       e_2 = 2^3 + 2^0
        let t3 = &t0 * &t2; //                3,1,0
        let t4 = t3.square(); //              4,2,1
        let t5 = &t2 * &t4; //                4,3,2,1,0
        let t6 = t5.pow2k(5); //              9,8,7,6,5
        let t7 = &t6 * &t5; //                9,8,7,6,5,4,3,2,1,0
        let t8 = t7.pow2k(10); //             19..10
        let t9 = &t8 * &t7; //                19..0
        let t10 = t9.pow2k(20); //            39..20
        let t11 = &t10 * &t9; //              39..0
        let t12 = t11.pow2k(10); //           49..10
        let t13 = &t12 * &t7; //              49..0
        let t14 = t13.pow2k(50); //           99..50
        let t15 = &t14 * &t13; //             99..0
        let t16 = t15.pow2k(100); //          199..100
        let t17 = &t16 * &t15; //             199..0
        let t18 = t17.pow2k(50); //           249..50
        let t19 = &t18 * &t13; //             249..0

        (t19, t3)
    }

    /// Given a nonzero field element, compute its inverse.
    ///
    /// The inverse is computed as self^(p-2), since
    /// x^(p-2)x = x^(p-1) = 1 (mod p).
    ///
    /// This function returns zero on input zero.
    pub fn invert(&self) -> FieldElement {
        // The bits of p-2 = 2^255 -19 -2 are 11010111111...11.
        //
        //                                 nonzero bits of exponent
        let (t19, t3) = self.pow22501(); // t19: 249..0 ; t3: 3,1,0
        let t20 = t19.pow2k(5); //               254..5
        let t21 = &t20 * &t3; //                 254..5,3,1,0

        t21
    }
}