1 // SPDX-License-Identifier: BSD-2-Clause
2 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3  *
4  * LibTomCrypt is a library that provides various cryptographic
5  * algorithms in a highly modular and flexible manner.
6  *
7  * The library is free for all purposes without any express
8  * guarantee it works.
9  */
10 
11 #include "tomcrypt_private.h"
12 
13 #ifdef LTC_MECC
14 
15 static const struct {
16    const char *OID;
17    const char *names[6];
18 } _curve_names[] = {
19 #ifdef LTC_ECC_SECP112R1
20    {
21       "1.3.132.0.6", { "SECP112R1", "ECC-112", NULL }
22    },
23 #endif
24 #ifdef LTC_ECC_SECP112R2
25    {
26       "1.3.132.0.7", { "SECP112R2", NULL }
27    },
28 #endif
29 #ifdef LTC_ECC_SECP128R1
30    {
31       "1.3.132.0.28", { "SECP128R1", "ECC-128", NULL }
32    },
33 #endif
34 #ifdef LTC_ECC_SECP128R2
35    {
36       "1.3.132.0.29", { "SECP128R2", NULL }
37    },
38 #endif
39 #ifdef LTC_ECC_SECP160R1
40    {
41       "1.3.132.0.8", { "SECP160R1", "ECC-160", NULL }
42    },
43 #endif
44 #ifdef LTC_ECC_SECP160R2
45    {
46       "1.3.132.0.30", { "SECP160R2", NULL }
47    },
48 #endif
49 #ifdef LTC_ECC_SECP160K1
50    {
51       "1.3.132.0.9", { "SECP160K1", NULL }
52    },
53 #endif
54 #ifdef LTC_ECC_SECP192R1
55    {
56       "1.2.840.10045.3.1.1", { "SECP192R1", "NISTP192", "PRIME192V1", "ECC-192", "P-192", NULL }
57    },
58 #endif
59 #ifdef LTC_ECC_PRIME192V2
60    {
61       "1.2.840.10045.3.1.2", { "PRIME192V2", NULL }
62    },
63 #endif
64 #ifdef LTC_ECC_PRIME192V3
65    {
66       "1.2.840.10045.3.1.3", { "PRIME192V3", NULL }
67    },
68 #endif
69 #ifdef LTC_ECC_SECP192K1
70    {
71       "1.3.132.0.31", { "SECP192K1", NULL }
72    },
73 #endif
74 #ifdef LTC_ECC_SECP224R1
75    {
76       "1.3.132.0.33", { "SECP224R1", "NISTP224", "ECC-224", "P-224", NULL }
77    },
78 #endif
79 #ifdef LTC_ECC_SECP224K1
80    {
81       "1.3.132.0.32", { "SECP224K1", NULL }
82    },
83 #endif
84 #ifdef LTC_ECC_SECP256R1
85    {
86       "1.2.840.10045.3.1.7", { "SECP256R1", "NISTP256", "PRIME256V1", "ECC-256", "P-256", NULL }
87    },
88 #endif
89 #ifdef LTC_ECC_SECP256K1
90    {
91       "1.3.132.0.10", { "SECP256K1", NULL }
92    },
93 #endif
94 #ifdef LTC_ECC_SECP384R1
95    {
96       "1.3.132.0.34", { "SECP384R1", "NISTP384", "ECC-384", "P-384", NULL }
97    },
98 #endif
99 #ifdef LTC_ECC_SECP521R1
100    {
101       "1.3.132.0.35", { "SECP521R1", "NISTP521", "ECC-521", "P-521", NULL }
102    },
103 #endif
104 #ifdef LTC_ECC_PRIME239V1
105    {
106       "1.2.840.10045.3.1.4", { "PRIME239V1", NULL }
107    },
108 #endif
109 #ifdef LTC_ECC_PRIME239V2
110    {
111       "1.2.840.10045.3.1.5", { "PRIME239V2", NULL }
112    },
113 #endif
114 #ifdef LTC_ECC_PRIME239V3
115    {
116       "1.2.840.10045.3.1.6", { "PRIME239V3", NULL }
117    },
118 #endif
119 #ifdef LTC_ECC_BRAINPOOLP160R1
120    {
121       "1.3.36.3.3.2.8.1.1.1", { "BRAINPOOLP160R1", NULL }
122    },
123 #endif
124 #ifdef LTC_ECC_BRAINPOOLP192R1
125    {
126       "1.3.36.3.3.2.8.1.1.3", { "BRAINPOOLP192R1", NULL }
127    },
128 #endif
129 #ifdef LTC_ECC_BRAINPOOLP224R1
130    {
131       "1.3.36.3.3.2.8.1.1.5", { "BRAINPOOLP224R1", NULL }
132    },
133 #endif
134 #ifdef LTC_ECC_BRAINPOOLP256R1
135    {
136       "1.3.36.3.3.2.8.1.1.7", { "BRAINPOOLP256R1", NULL }
137    },
138 #endif
139 #ifdef LTC_ECC_BRAINPOOLP320R1
140    {
141       "1.3.36.3.3.2.8.1.1.9", { "BRAINPOOLP320R1", NULL }
142    },
143 #endif
144 #ifdef LTC_ECC_BRAINPOOLP384R1
145    {
146       "1.3.36.3.3.2.8.1.1.11", { "BRAINPOOLP384R1", NULL }
147    },
148 #endif
149 #ifdef LTC_ECC_BRAINPOOLP512R1
150    {
151       "1.3.36.3.3.2.8.1.1.13", { "BRAINPOOLP512R1", NULL }
152    },
153 #endif
154 #ifdef LTC_ECC_BRAINPOOLP160T1
155    {
156       "1.3.36.3.3.2.8.1.1.2", { "BRAINPOOLP160T1", NULL }
157    },
158 #endif
159 #ifdef LTC_ECC_BRAINPOOLP192T1
160    {
161       "1.3.36.3.3.2.8.1.1.4", { "BRAINPOOLP192T1", NULL }
162    },
163 #endif
164 #ifdef LTC_ECC_BRAINPOOLP224T1
165    {
166       "1.3.36.3.3.2.8.1.1.6", { "BRAINPOOLP224T1", NULL }
167    },
168 #endif
169 #ifdef LTC_ECC_BRAINPOOLP256T1
170    {
171       "1.3.36.3.3.2.8.1.1.8", { "BRAINPOOLP256T1", NULL }
172    },
173 #endif
174 #ifdef LTC_ECC_BRAINPOOLP320T1
175    {
176       "1.3.36.3.3.2.8.1.1.10", { "BRAINPOOLP320T1", NULL }
177    },
178 #endif
179 #ifdef LTC_ECC_BRAINPOOLP384T1
180    {
181       "1.3.36.3.3.2.8.1.1.12", { "BRAINPOOLP384T1", NULL }
182    },
183 #endif
184 #ifdef LTC_ECC_BRAINPOOLP512T1
185    {
186       "1.3.36.3.3.2.8.1.1.14", { "BRAINPOOLP512T1", NULL }
187    },
188 #endif
189 #ifdef LTC_ECC_SM2
190    {
191       "1.2.156.10197.1.301", { "SM2", NULL }
192    },
193 #endif
194    {
195       NULL, { NULL }
196    }
197 };
198 
199 /* case-insensitive match + ignore '-', '_', ' ' */
_name_match(const char * left,const char * right)200 static int _name_match(const char *left, const char *right)
201 {
202    char lc_r, lc_l;
203 
204    while ((*left != '\0') && (*right != '\0')) {
205       while ((*left  == ' ') || (*left  == '-') || (*left  == '_')) left++;
206       while ((*right == ' ') || (*right == '-') || (*right == '_')) right++;
207       if (*left == '\0' || *right == '\0') break;
208       lc_r = *right;
209       lc_l = *left;
210       if ((lc_r >= 'A') && (lc_r <= 'Z')) lc_r += 32;
211       if ((lc_l >= 'A') && (lc_l <= 'Z')) lc_l += 32;
212       if (lc_l != lc_r) return 0;
213       left++;
214       right++;
215    }
216 
217    if ((*left == '\0') && (*right == '\0')) return 1;
218    return 0;
219 }
220 
ecc_find_curve(const char * name_or_oid,const ltc_ecc_curve ** cu)221 int ecc_find_curve(const char *name_or_oid, const ltc_ecc_curve **cu)
222 {
223    int i, j;
224    const char *OID = NULL;
225 
226    LTC_ARGCHK(cu != NULL);
227    LTC_ARGCHK(name_or_oid != NULL);
228 
229    *cu = NULL;
230 
231    for (i = 0; _curve_names[i].OID != NULL && !OID; i++) {
232       if (XSTRCMP(_curve_names[i].OID, name_or_oid) == 0) {
233          OID = _curve_names[i].OID;
234       }
235       for (j = 0; _curve_names[i].names[j] != NULL && !OID; j++) {
236          if (_name_match(_curve_names[i].names[j], name_or_oid)) {
237             OID = _curve_names[i].OID;
238          }
239       }
240    }
241 
242    if (OID != NULL) {
243       for (i = 0; ltc_ecc_curves[i].prime != NULL; i++) {
244          if (XSTRCMP(ltc_ecc_curves[i].OID, OID) == 0) {
245             *cu = &ltc_ecc_curves[i];
246             return CRYPT_OK;
247          }
248       }
249    }
250 
251    return CRYPT_INVALID_ARG; /* not found */
252 }
253 
254 #endif
255 
256 /* ref:         $Format:%D$ */
257 /* git commit:  $Format:%H$ */
258 /* commit time: $Format:%ai$ */
259