crypto_bigint/uint/modular/constant_mod/
macros.rs1#[macro_export]
3macro_rules! impl_modulus {
7    ($name:ident, $uint_type:ty, $value:expr) => {
8        #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
9        pub struct $name {}
10        impl<const DLIMBS: usize>
11            $crate::modular::constant_mod::ResidueParams<{ <$uint_type>::LIMBS }> for $name
12        where
13            $uint_type: $crate::ConcatMixed<MixedOutput = $crate::Uint<DLIMBS>>,
14        {
15            const LIMBS: usize = <$uint_type>::LIMBS;
16            const MODULUS: $uint_type = {
17                let res = <$uint_type>::from_be_hex($value);
18
19                if res.as_limbs()[0].0 & 1 == 0 {
21                    panic!("modulus must be odd");
22                }
23
24                res
25            };
26            const R: $uint_type = $crate::Uint::MAX
27                .const_rem(&Self::MODULUS)
28                .0
29                .wrapping_add(&$crate::Uint::ONE);
30            const R2: $uint_type =
31                $crate::Uint::const_rem_wide(Self::R.square_wide(), &Self::MODULUS).0;
32            const MOD_NEG_INV: $crate::Limb = $crate::Limb(
33                $crate::Word::MIN.wrapping_sub(
34                    Self::MODULUS
35                        .inv_mod2k_vartime($crate::Word::BITS as usize)
36                        .as_limbs()[0]
37                        .0,
38                ),
39            );
40            const R3: $uint_type = $crate::modular::montgomery_reduction(
41                &Self::R2.square_wide(),
42                &Self::MODULUS,
43                Self::MOD_NEG_INV,
44            );
45        }
46    };
47}
48
49#[macro_export]
50macro_rules! const_residue {
54    ($variable:ident, $modulus:ident) => {
55        $crate::modular::constant_mod::Residue::<$modulus, { $modulus::LIMBS }>::new(&$variable)
56    };
57}