Coverage Report

Created: 2024-11-21 07:03

/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