rust_sike/isogeny/
publicparams.rs

1//! Public parameters
2
3use crate::constants::{cs_p434::*, cs_p503::*, cs_p610::*, cs_p751::*};
4use crate::ff::{
5    QuadraticExtension,
6    {
7        ff_p434::PrimeFieldP434, ff_p503::PrimeFieldP503, ff_p610::PrimeFieldP610,
8        ff_p751::PrimeFieldP751,
9    },
10};
11use crate::utils::{conversion::*, strategy};
12
13/// Public parameters
14#[derive(Clone)]
15pub struct PublicParameters<K> {
16    /// Security parameter (curve-dependent)
17    pub secparam: usize,
18
19    /// Size of K_2 keyspace for sk2 generation;
20    pub keyspace2: u64,
21
22    /// Size of K_3 keyspace fir sk3 generation;
23    pub keyspace3: u64,
24
25    /// Tree-traversal strategy for the 2-torsion
26    pub e2_strategy: Option<strategy::Torsion2Strategy>,
27
28    /// Tree-traversal strategy for the 3-torsion
29    pub e3_strategy: Option<strategy::Torsion3Strategy>,
30
31    /// Exponent of 2 in the prime modulus
32    pub e2: u64,
33
34    /// Exponent of 3 in the prime modulus
35    pub e3: u64,
36
37    /// x-coordinate of the point P2
38    pub xp2: K,
39
40    /// x-coordinate of the point Q2
41    pub xq2: K,
42
43    /// x-coordinate of the point R2
44    pub xr2: K,
45
46    /// x-coordinate of the point P3
47    pub xp3: K,
48
49    /// x-coordinate of the point Q3
50    pub xq3: K,
51
52    /// x-coordinate of the point R3
53    pub xr3: K,
54}
55
56/// Load params for SIKE_p434
57pub fn sike_p434_params(
58    strat2tor: Option<strategy::Torsion2Strategy>,
59    strat3tor: Option<strategy::Torsion3Strategy>,
60) -> Result<PublicParameters<QuadraticExtension<PrimeFieldP434>>, String> {
61    Ok(PublicParameters {
62        secparam: 128,
63        keyspace2: str_to_u64(SIKE_P434_NKS2)?,
64        keyspace3: str_to_u64(SIKE_P434_NKS3)?,
65        e2_strategy: strat2tor,
66        e3_strategy: strat3tor,
67        e2: str_to_u64(SIKE_P434_E2)?,
68        e3: str_to_u64(SIKE_P434_E3)?,
69        xp2: str_to_p434(SIKE_P434_XP20, SIKE_P434_XP21)?,
70        xq2: str_to_p434(SIKE_P434_XQ20, SIKE_P434_XQ21)?,
71        xr2: str_to_p434(SIKE_P434_XR20, SIKE_P434_XR21)?,
72        xp3: str_to_p434(SIKE_P434_XP30, SIKE_P434_XP31)?,
73        xq3: str_to_p434(SIKE_P434_XQ30, SIKE_P434_XQ31)?,
74        xr3: str_to_p434(SIKE_P434_XR30, SIKE_P434_XR31)?,
75    })
76}
77
78/// Load params for SIKE_p503
79pub fn sike_p503_params(
80    strat2tor: Option<strategy::Torsion2Strategy>,
81    strat3tor: Option<strategy::Torsion3Strategy>,
82) -> Result<PublicParameters<QuadraticExtension<PrimeFieldP503>>, String> {
83    Ok(PublicParameters {
84        secparam: 192,
85        keyspace2: str_to_u64(SIKE_P503_NKS2)?,
86        keyspace3: str_to_u64(SIKE_P503_NKS3)?,
87        e2_strategy: strat2tor,
88        e3_strategy: strat3tor,
89        e2: str_to_u64(SIKE_P503_E2)?,
90        e3: str_to_u64(SIKE_P503_E3)?,
91        xp2: str_to_p503(SIKE_P503_XP20, SIKE_P503_XP21)?,
92        xq2: str_to_p503(SIKE_P503_XQ20, SIKE_P503_XQ21)?,
93        xr2: str_to_p503(SIKE_P503_XR20, SIKE_P503_XR21)?,
94        xp3: str_to_p503(SIKE_P503_XP30, SIKE_P503_XP31)?,
95        xq3: str_to_p503(SIKE_P503_XQ30, SIKE_P503_XQ31)?,
96        xr3: str_to_p503(SIKE_P503_XR30, SIKE_P503_XR31)?,
97    })
98}
99
100/// Load params for SIKE_p610
101pub fn sike_p610_params(
102    strat2tor: Option<strategy::Torsion2Strategy>,
103    strat3tor: Option<strategy::Torsion3Strategy>,
104) -> Result<PublicParameters<QuadraticExtension<PrimeFieldP610>>, String> {
105    Ok(PublicParameters {
106        secparam: 192,
107        keyspace2: str_to_u64(SIKE_P610_NKS2)?,
108        keyspace3: str_to_u64(SIKE_P610_NKS3)?,
109        e2_strategy: strat2tor,
110        e3_strategy: strat3tor,
111        e2: str_to_u64(SIKE_P610_E2)?,
112        e3: str_to_u64(SIKE_P610_E3)?,
113        xp2: str_to_p610(SIKE_P610_XP20, SIKE_P610_XP21)?,
114        xq2: str_to_p610(SIKE_P610_XQ20, SIKE_P610_XQ21)?,
115        xr2: str_to_p610(SIKE_P610_XR20, SIKE_P610_XR21)?,
116        xp3: str_to_p610(SIKE_P610_XP30, SIKE_P610_XP31)?,
117        xq3: str_to_p610(SIKE_P610_XQ30, SIKE_P610_XQ31)?,
118        xr3: str_to_p610(SIKE_P610_XR30, SIKE_P610_XR31)?,
119    })
120}
121
122/// Load params for SIKE_p751
123pub fn sike_p751_params(
124    strat2tor: Option<strategy::Torsion2Strategy>,
125    strat3tor: Option<strategy::Torsion3Strategy>,
126) -> Result<PublicParameters<QuadraticExtension<PrimeFieldP751>>, String> {
127    Ok(PublicParameters {
128        secparam: 256,
129        keyspace2: str_to_u64(SIKE_P751_NKS2)?,
130        keyspace3: str_to_u64(SIKE_P751_NKS3)?,
131        e2_strategy: strat2tor,
132        e3_strategy: strat3tor,
133        e2: str_to_u64(SIKE_P751_E2)?,
134        e3: str_to_u64(SIKE_P751_E3)?,
135        xp2: str_to_p751(SIKE_P751_XP20, SIKE_P751_XP21)?,
136        xq2: str_to_p751(SIKE_P751_XQ20, SIKE_P751_XQ21)?,
137        xr2: str_to_p751(SIKE_P751_XR20, SIKE_P751_XR21)?,
138        xp3: str_to_p751(SIKE_P751_XP30, SIKE_P751_XP31)?,
139        xq3: str_to_p751(SIKE_P751_XQ30, SIKE_P751_XQ31)?,
140        xr3: str_to_p751(SIKE_P751_XR30, SIKE_P751_XR31)?,
141    })
142}