1use 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#[derive(Clone)]
15pub struct PublicParameters<K> {
16 pub secparam: usize,
18
19 pub keyspace2: u64,
21
22 pub keyspace3: u64,
24
25 pub e2_strategy: Option<strategy::Torsion2Strategy>,
27
28 pub e3_strategy: Option<strategy::Torsion3Strategy>,
30
31 pub e2: u64,
33
34 pub e3: u64,
36
37 pub xp2: K,
39
40 pub xq2: K,
42
43 pub xr2: K,
45
46 pub xp3: K,
48
49 pub xq3: K,
51
52 pub xr3: K,
54}
55
56pub 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
78pub 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
100pub 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
122pub 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}