/src/botan/src/lib/math/pcurves/pcurves.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * (C) 2024 Jack Lloyd |
3 | | * |
4 | | * Botan is released under the Simplified BSD License (see license.txt) |
5 | | */ |
6 | | |
7 | | #include <botan/internal/pcurves.h> |
8 | | |
9 | | #include <botan/internal/pcurves_instance.h> |
10 | | |
11 | | #if defined(BOTAN_HAS_ASN1) |
12 | | #include <botan/asn1_obj.h> |
13 | | #endif |
14 | | |
15 | | namespace Botan::PCurve { |
16 | | |
17 | | #if !defined(BOTAN_HAS_PCURVES_SECP192R1) |
18 | | //static |
19 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp192r1() { |
20 | | return nullptr; |
21 | | } |
22 | | #endif |
23 | | |
24 | | #if !defined(BOTAN_HAS_PCURVES_SECP224R1) |
25 | | //static |
26 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp224r1() { |
27 | | return nullptr; |
28 | | } |
29 | | #endif |
30 | | |
31 | | #if !defined(BOTAN_HAS_PCURVES_SECP256R1) |
32 | | //static |
33 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp256r1() { |
34 | | return nullptr; |
35 | | } |
36 | | #endif |
37 | | |
38 | | #if !defined(BOTAN_HAS_PCURVES_SECP384R1) |
39 | | //static |
40 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp384r1() { |
41 | | return nullptr; |
42 | | } |
43 | | #endif |
44 | | |
45 | | #if !defined(BOTAN_HAS_PCURVES_SECP521R1) |
46 | | //static |
47 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp521r1() { |
48 | | return nullptr; |
49 | | } |
50 | | #endif |
51 | | |
52 | | #if !defined(BOTAN_HAS_PCURVES_SECP256K1) |
53 | | //static |
54 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::secp256k1() { |
55 | | return nullptr; |
56 | | } |
57 | | #endif |
58 | | |
59 | | #if !defined(BOTAN_HAS_PCURVES_BRAINPOOL256R1) |
60 | | //static |
61 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::brainpool256r1() { |
62 | | return nullptr; |
63 | | } |
64 | | #endif |
65 | | |
66 | | #if !defined(BOTAN_HAS_PCURVES_BRAINPOOL384R1) |
67 | | //static |
68 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::brainpool384r1() { |
69 | | return nullptr; |
70 | | } |
71 | | #endif |
72 | | |
73 | | #if !defined(BOTAN_HAS_PCURVES_BRAINPOOL512R1) |
74 | | //static |
75 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::brainpool512r1() { |
76 | | return nullptr; |
77 | | } |
78 | | #endif |
79 | | |
80 | | #if !defined(BOTAN_HAS_PCURVES_FRP256V1) |
81 | | //static |
82 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::frp256v1() { |
83 | | return nullptr; |
84 | | } |
85 | | #endif |
86 | | |
87 | | #if !defined(BOTAN_HAS_PCURVES_SM2P256V1) |
88 | | //static |
89 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::sm2p256v1() { |
90 | | return nullptr; |
91 | | } |
92 | | #endif |
93 | | |
94 | | #if !defined(BOTAN_HAS_PCURVES_NUMSP512D1) |
95 | | //static |
96 | | std::shared_ptr<const PrimeOrderCurve> PCurveInstance::numsp512d1() { |
97 | | return nullptr; |
98 | | } |
99 | | #endif |
100 | | |
101 | 54 | std::shared_ptr<const PrimeOrderCurve> PrimeOrderCurve::from_id(PrimeOrderCurveId id) { |
102 | 54 | switch(id.code()) { |
103 | 5 | case PrimeOrderCurveId::secp192r1: |
104 | 5 | return PCurveInstance::secp192r1(); |
105 | 5 | case PrimeOrderCurveId::secp224r1: |
106 | 5 | return PCurveInstance::secp224r1(); |
107 | 5 | case PrimeOrderCurveId::secp256r1: |
108 | 5 | return PCurveInstance::secp256r1(); |
109 | 5 | case PrimeOrderCurveId::secp384r1: |
110 | 5 | return PCurveInstance::secp384r1(); |
111 | 5 | case PrimeOrderCurveId::secp521r1: |
112 | 5 | return PCurveInstance::secp521r1(); |
113 | 5 | case PrimeOrderCurveId::secp256k1: |
114 | 5 | return PCurveInstance::secp256k1(); |
115 | 5 | case PrimeOrderCurveId::brainpool256r1: |
116 | 5 | return PCurveInstance::brainpool256r1(); |
117 | 5 | case PrimeOrderCurveId::brainpool384r1: |
118 | 5 | return PCurveInstance::brainpool384r1(); |
119 | 5 | case PrimeOrderCurveId::brainpool512r1: |
120 | 5 | return PCurveInstance::brainpool512r1(); |
121 | 4 | case PrimeOrderCurveId::frp256v1: |
122 | 4 | return PCurveInstance::frp256v1(); |
123 | 5 | case PrimeOrderCurveId::sm2p256v1: |
124 | 5 | return PCurveInstance::sm2p256v1(); |
125 | 0 | case PrimeOrderCurveId::numsp512d1: |
126 | 0 | return PCurveInstance::numsp512d1(); |
127 | 54 | } |
128 | 0 | return {}; |
129 | 54 | } |
130 | | |
131 | 0 | std::vector<PrimeOrderCurveId> PrimeOrderCurveId::all() { |
132 | 0 | return { |
133 | 0 | PrimeOrderCurveId::secp192r1, |
134 | 0 | PrimeOrderCurveId::secp224r1, |
135 | 0 | PrimeOrderCurveId::secp256r1, |
136 | 0 | PrimeOrderCurveId::secp384r1, |
137 | 0 | PrimeOrderCurveId::secp521r1, |
138 | 0 | PrimeOrderCurveId::secp256k1, |
139 | 0 | PrimeOrderCurveId::brainpool256r1, |
140 | 0 | PrimeOrderCurveId::brainpool384r1, |
141 | 0 | PrimeOrderCurveId::brainpool512r1, |
142 | 0 | PrimeOrderCurveId::frp256v1, |
143 | 0 | PrimeOrderCurveId::sm2p256v1, |
144 | 0 | PrimeOrderCurveId::numsp512d1, |
145 | 0 | }; |
146 | 0 | } |
147 | | |
148 | 0 | std::string PrimeOrderCurveId::to_string() const { |
149 | 0 | switch(this->code()) { |
150 | 0 | case PrimeOrderCurveId::secp192r1: |
151 | 0 | return "secp192r1"; |
152 | 0 | case PrimeOrderCurveId::secp224r1: |
153 | 0 | return "secp224r1"; |
154 | 0 | case PrimeOrderCurveId::secp256r1: |
155 | 0 | return "secp256r1"; |
156 | 0 | case PrimeOrderCurveId::secp384r1: |
157 | 0 | return "secp384r1"; |
158 | 0 | case PrimeOrderCurveId::secp521r1: |
159 | 0 | return "secp521r1"; |
160 | 0 | case PrimeOrderCurveId::secp256k1: |
161 | 0 | return "secp256k1"; |
162 | 0 | case PrimeOrderCurveId::brainpool256r1: |
163 | 0 | return "brainpool256r1"; |
164 | 0 | case PrimeOrderCurveId::brainpool384r1: |
165 | 0 | return "brainpool384r1"; |
166 | 0 | case PrimeOrderCurveId::brainpool512r1: |
167 | 0 | return "brainpool512r1"; |
168 | 0 | case PrimeOrderCurveId::frp256v1: |
169 | 0 | return "frp256v1"; |
170 | 0 | case PrimeOrderCurveId::sm2p256v1: |
171 | 0 | return "sm2p256v1"; |
172 | 0 | case PrimeOrderCurveId::numsp512d1: |
173 | 0 | return "numsp512d1"; |
174 | 0 | } |
175 | | |
176 | 0 | return "unknown"; |
177 | 0 | } |
178 | | |
179 | | //static |
180 | 126 | std::optional<PrimeOrderCurveId> PrimeOrderCurveId::from_string(std::string_view name) { |
181 | 126 | if(name == "secp192r1") { |
182 | 5 | return PCurve::PrimeOrderCurveId::secp192r1; |
183 | 121 | } else if(name == "secp224r1") { |
184 | 5 | return PCurve::PrimeOrderCurveId::secp224r1; |
185 | 116 | } else if(name == "secp256r1") { |
186 | 5 | return PCurve::PrimeOrderCurveId::secp256r1; |
187 | 111 | } else if(name == "secp384r1") { |
188 | 5 | return PCurve::PrimeOrderCurveId::secp384r1; |
189 | 106 | } else if(name == "secp521r1") { |
190 | 5 | return PCurve::PrimeOrderCurveId::secp521r1; |
191 | 101 | } else if(name == "secp256k1") { |
192 | 5 | return PCurve::PrimeOrderCurveId::secp256k1; |
193 | 96 | } else if(name == "brainpool256r1") { |
194 | 5 | return PCurve::PrimeOrderCurveId::brainpool256r1; |
195 | 91 | } else if(name == "brainpool384r1") { |
196 | 5 | return PCurve::PrimeOrderCurveId::brainpool384r1; |
197 | 86 | } else if(name == "brainpool512r1") { |
198 | 5 | return PCurve::PrimeOrderCurveId::brainpool512r1; |
199 | 81 | } else if(name == "frp256v1") { |
200 | 4 | return PCurve::PrimeOrderCurveId::frp256v1; |
201 | 77 | } else if(name == "sm2p256v1") { |
202 | 5 | return PCurve::PrimeOrderCurveId::sm2p256v1; |
203 | 72 | } else if(name == "numsp512d1") { |
204 | 0 | return PCurve::PrimeOrderCurveId::numsp512d1; |
205 | 72 | } else { |
206 | 72 | return {}; |
207 | 72 | } |
208 | 126 | } |
209 | | |
210 | | #if defined(BOTAN_HAS_ASN1) |
211 | | |
212 | | //static |
213 | 166 | std::optional<PrimeOrderCurveId> PrimeOrderCurveId::from_oid(const OID& oid) { |
214 | 166 | const std::string name = oid.human_name_or_empty(); |
215 | 166 | if(name.empty()) { |
216 | 40 | return {}; |
217 | 126 | } else { |
218 | 126 | return PrimeOrderCurveId::from_string(name); |
219 | 126 | } |
220 | 166 | } |
221 | | |
222 | | #endif |
223 | | |
224 | | } // namespace Botan::PCurve |