1 /*
2 * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
3 * Use is subject to license terms.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this library; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /* *********************************************************************
25 *
26 * The Original Code is the Netscape security libraries.
27 *
28 * The Initial Developer of the Original Code is
29 * Netscape Communications Corporation.
30 * Portions created by the Initial Developer are Copyright (C) 1994-2000
31 * the Initial Developer. All Rights Reserved.
32 *
33 * Contributor(s):
34 * Dr Vipul Gupta <vipul.gupta@sun.com>, Sun Microsystems Laboratories
35 *
36 * Last Modified Date from the Original Code: March 2012
37 *********************************************************************** */
38
39 #include <sys/types.h>
40
41 #ifndef _WIN32
42 #if !defined(__linux__) && !defined(_ALLBSD_SOURCE)
43 #include <sys/systm.h>
44 #endif /* __linux__ || _ALLBSD_SOURCE */
45 #include <sys/param.h>
46 #endif /* _WIN32 */
47
48 #ifdef _KERNEL
49 #include <sys/kmem.h>
50 #else
51 #include <string.h>
52 #endif
53 #include "ec.h"
54 #include "ecl-curve.h"
55 #include "ecc_impl.h"
56 #include "secoidt.h"
57
58 #define CERTICOM_OID 0x2b, 0x81, 0x04
59 #define SECG_OID CERTICOM_OID, 0x00
60
61 #define ANSI_X962_OID 0x2a, 0x86, 0x48, 0xce, 0x3d
62 #define ANSI_X962_CURVE_OID ANSI_X962_OID, 0x03
63 #define ANSI_X962_GF2m_OID ANSI_X962_CURVE_OID, 0x00
64 #define ANSI_X962_GFp_OID ANSI_X962_CURVE_OID, 0x01
65
66 #define TELETRUST_ALGO_OID 0x2b, 0x24, 0x03
67 #define ECC_BRAINPOOL TELETRUST_ALGO_OID, 0x03, 0x02, 0x08
68 #define ECC_BRAINPOOL_EC_V1 ECC_BRAINPOOL, 0x01, 0x01
69
70 #define CONST_OID static const unsigned char
71
72 /* ANSI X9.62 prime curve OIDs */
73 /* NOTE: prime192v1 is the same as secp192r1, prime256v1 is the
74 * same as secp256r1
75 */
76 CONST_OID ansiX962prime192v1[] = { ANSI_X962_GFp_OID, 0x01 };
77 CONST_OID ansiX962prime192v2[] = { ANSI_X962_GFp_OID, 0x02 };
78 CONST_OID ansiX962prime192v3[] = { ANSI_X962_GFp_OID, 0x03 };
79 CONST_OID ansiX962prime239v1[] = { ANSI_X962_GFp_OID, 0x04 };
80 CONST_OID ansiX962prime239v2[] = { ANSI_X962_GFp_OID, 0x05 };
81 CONST_OID ansiX962prime239v3[] = { ANSI_X962_GFp_OID, 0x06 };
82 CONST_OID ansiX962prime256v1[] = { ANSI_X962_GFp_OID, 0x07 };
83
84 /* SECG prime curve OIDs */
85 CONST_OID secgECsecp112r1[] = { SECG_OID, 0x06 };
86 CONST_OID secgECsecp112r2[] = { SECG_OID, 0x07 };
87 CONST_OID secgECsecp128r1[] = { SECG_OID, 0x1c };
88 CONST_OID secgECsecp128r2[] = { SECG_OID, 0x1d };
89 CONST_OID secgECsecp160k1[] = { SECG_OID, 0x09 };
90 CONST_OID secgECsecp160r1[] = { SECG_OID, 0x08 };
91 CONST_OID secgECsecp160r2[] = { SECG_OID, 0x1e };
92 CONST_OID secgECsecp192k1[] = { SECG_OID, 0x1f };
93 CONST_OID secgECsecp224k1[] = { SECG_OID, 0x20 };
94 CONST_OID secgECsecp224r1[] = { SECG_OID, 0x21 };
95 CONST_OID secgECsecp256k1[] = { SECG_OID, 0x0a };
96 CONST_OID secgECsecp384r1[] = { SECG_OID, 0x22 };
97 CONST_OID secgECsecp521r1[] = { SECG_OID, 0x23 };
98
99 /* SECG characterisitic two curve OIDs */
100 CONST_OID secgECsect113r1[] = {SECG_OID, 0x04 };
101 CONST_OID secgECsect113r2[] = {SECG_OID, 0x05 };
102 CONST_OID secgECsect131r1[] = {SECG_OID, 0x16 };
103 CONST_OID secgECsect131r2[] = {SECG_OID, 0x17 };
104 CONST_OID secgECsect163k1[] = {SECG_OID, 0x01 };
105 CONST_OID secgECsect163r1[] = {SECG_OID, 0x02 };
106 CONST_OID secgECsect163r2[] = {SECG_OID, 0x0f };
107 CONST_OID secgECsect193r1[] = {SECG_OID, 0x18 };
108 CONST_OID secgECsect193r2[] = {SECG_OID, 0x19 };
109 CONST_OID secgECsect233k1[] = {SECG_OID, 0x1a };
110 CONST_OID secgECsect233r1[] = {SECG_OID, 0x1b };
111 CONST_OID secgECsect239k1[] = {SECG_OID, 0x03 };
112 CONST_OID secgECsect283k1[] = {SECG_OID, 0x10 };
113 CONST_OID secgECsect283r1[] = {SECG_OID, 0x11 };
114 CONST_OID secgECsect409k1[] = {SECG_OID, 0x24 };
115 CONST_OID secgECsect409r1[] = {SECG_OID, 0x25 };
116 CONST_OID secgECsect571k1[] = {SECG_OID, 0x26 };
117 CONST_OID secgECsect571r1[] = {SECG_OID, 0x27 };
118
119 /* ANSI X9.62 characteristic two curve OIDs */
120 CONST_OID ansiX962c2pnb163v1[] = { ANSI_X962_GF2m_OID, 0x01 };
121 CONST_OID ansiX962c2pnb163v2[] = { ANSI_X962_GF2m_OID, 0x02 };
122 CONST_OID ansiX962c2pnb163v3[] = { ANSI_X962_GF2m_OID, 0x03 };
123 CONST_OID ansiX962c2pnb176v1[] = { ANSI_X962_GF2m_OID, 0x04 };
124 CONST_OID ansiX962c2tnb191v1[] = { ANSI_X962_GF2m_OID, 0x05 };
125 CONST_OID ansiX962c2tnb191v2[] = { ANSI_X962_GF2m_OID, 0x06 };
126 CONST_OID ansiX962c2tnb191v3[] = { ANSI_X962_GF2m_OID, 0x07 };
127 CONST_OID ansiX962c2onb191v4[] = { ANSI_X962_GF2m_OID, 0x08 };
128 CONST_OID ansiX962c2onb191v5[] = { ANSI_X962_GF2m_OID, 0x09 };
129 CONST_OID ansiX962c2pnb208w1[] = { ANSI_X962_GF2m_OID, 0x0a };
130 CONST_OID ansiX962c2tnb239v1[] = { ANSI_X962_GF2m_OID, 0x0b };
131 CONST_OID ansiX962c2tnb239v2[] = { ANSI_X962_GF2m_OID, 0x0c };
132 CONST_OID ansiX962c2tnb239v3[] = { ANSI_X962_GF2m_OID, 0x0d };
133 CONST_OID ansiX962c2onb239v4[] = { ANSI_X962_GF2m_OID, 0x0e };
134 CONST_OID ansiX962c2onb239v5[] = { ANSI_X962_GF2m_OID, 0x0f };
135 CONST_OID ansiX962c2pnb272w1[] = { ANSI_X962_GF2m_OID, 0x10 };
136 CONST_OID ansiX962c2pnb304w1[] = { ANSI_X962_GF2m_OID, 0x11 };
137 CONST_OID ansiX962c2tnb359v1[] = { ANSI_X962_GF2m_OID, 0x12 };
138 CONST_OID ansiX962c2pnb368w1[] = { ANSI_X962_GF2m_OID, 0x13 };
139 CONST_OID ansiX962c2tnb431r1[] = { ANSI_X962_GF2m_OID, 0x14 };
140
141 /* TeleTrusT ECC Brainpool prime curve OIDs */
142 CONST_OID brainpoolP160r1[] = { ECC_BRAINPOOL_EC_V1, 0x01 };
143 CONST_OID brainpoolP160t1[] = { ECC_BRAINPOOL_EC_V1, 0x02 };
144 CONST_OID brainpoolP192r1[] = { ECC_BRAINPOOL_EC_V1, 0x03 };
145 CONST_OID brainpoolP192t1[] = { ECC_BRAINPOOL_EC_V1, 0x04 };
146 CONST_OID brainpoolP224r1[] = { ECC_BRAINPOOL_EC_V1, 0x05 };
147 CONST_OID brainpoolP224t1[] = { ECC_BRAINPOOL_EC_V1, 0x06 };
148 CONST_OID brainpoolP256r1[] = { ECC_BRAINPOOL_EC_V1, 0x07 };
149 CONST_OID brainpoolP256t1[] = { ECC_BRAINPOOL_EC_V1, 0x08 };
150 CONST_OID brainpoolP320r1[] = { ECC_BRAINPOOL_EC_V1, 0x09 };
151 CONST_OID brainpoolP320t1[] = { ECC_BRAINPOOL_EC_V1, 0x0a };
152 CONST_OID brainpoolP384r1[] = { ECC_BRAINPOOL_EC_V1, 0x0b };
153 CONST_OID brainpoolP384t1[] = { ECC_BRAINPOOL_EC_V1, 0x0c };
154 CONST_OID brainpoolP512r1[] = { ECC_BRAINPOOL_EC_V1, 0x0d };
155 CONST_OID brainpoolP512t1[] = { ECC_BRAINPOOL_EC_V1, 0x0e };
156
157 #define OI(x) { siDEROID, (unsigned char *)x, sizeof x }
158 #ifndef SECOID_NO_STRINGS
159 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext }
160 #else
161 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext }
162 #endif
163
164 #define CKM_INVALID_MECHANISM 0xffffffffUL
165
166 /* XXX this is incorrect */
167 #define INVALID_CERT_EXTENSION 1
168
169 #define CKM_ECDSA 0x00001041
170 #define CKM_ECDSA_SHA1 0x00001042
171 #define CKM_ECDH1_DERIVE 0x00001050
172
173 static SECOidData ANSI_prime_oids[] = {
174 { { siDEROID, NULL, 0 }, ECCurve_noName,
175 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
176
177 OD( ansiX962prime192v1, ECCurve_NIST_P192,
178 "ANSI X9.62 elliptic curve prime192v1 (aka secp192r1, NIST P-192)",
179 CKM_INVALID_MECHANISM,
180 INVALID_CERT_EXTENSION ),
181 OD( ansiX962prime192v2, ECCurve_X9_62_PRIME_192V2,
182 "ANSI X9.62 elliptic curve prime192v2",
183 CKM_INVALID_MECHANISM,
184 INVALID_CERT_EXTENSION ),
185 OD( ansiX962prime192v3, ECCurve_X9_62_PRIME_192V3,
186 "ANSI X9.62 elliptic curve prime192v3",
187 CKM_INVALID_MECHANISM,
188 INVALID_CERT_EXTENSION ),
189 OD( ansiX962prime239v1, ECCurve_X9_62_PRIME_239V1,
190 "ANSI X9.62 elliptic curve prime239v1",
191 CKM_INVALID_MECHANISM,
192 INVALID_CERT_EXTENSION ),
193 OD( ansiX962prime239v2, ECCurve_X9_62_PRIME_239V2,
194 "ANSI X9.62 elliptic curve prime239v2",
195 CKM_INVALID_MECHANISM,
196 INVALID_CERT_EXTENSION ),
197 OD( ansiX962prime239v3, ECCurve_X9_62_PRIME_239V3,
198 "ANSI X9.62 elliptic curve prime239v3",
199 CKM_INVALID_MECHANISM,
200 INVALID_CERT_EXTENSION ),
201 OD( ansiX962prime256v1, ECCurve_NIST_P256,
202 "ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256)",
203 CKM_INVALID_MECHANISM,
204 INVALID_CERT_EXTENSION )
205 };
206
207 static SECOidData SECG_oids[] = {
208 { { siDEROID, NULL, 0 }, ECCurve_noName,
209 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
210
211 OD( secgECsect163k1, ECCurve_NIST_K163,
212 "SECG elliptic curve sect163k1 (aka NIST K-163)",
213 CKM_INVALID_MECHANISM,
214 INVALID_CERT_EXTENSION ),
215 OD( secgECsect163r1, ECCurve_SECG_CHAR2_163R1,
216 "SECG elliptic curve sect163r1",
217 CKM_INVALID_MECHANISM,
218 INVALID_CERT_EXTENSION ),
219 OD( secgECsect239k1, ECCurve_SECG_CHAR2_239K1,
220 "SECG elliptic curve sect239k1",
221 CKM_INVALID_MECHANISM,
222 INVALID_CERT_EXTENSION ),
223 OD( secgECsect113r1, ECCurve_SECG_CHAR2_113R1,
224 "SECG elliptic curve sect113r1",
225 CKM_INVALID_MECHANISM,
226 INVALID_CERT_EXTENSION ),
227 OD( secgECsect113r2, ECCurve_SECG_CHAR2_113R2,
228 "SECG elliptic curve sect113r2",
229 CKM_INVALID_MECHANISM,
230 INVALID_CERT_EXTENSION ),
231 OD( secgECsecp112r1, ECCurve_SECG_PRIME_112R1,
232 "SECG elliptic curve secp112r1",
233 CKM_INVALID_MECHANISM,
234 INVALID_CERT_EXTENSION ),
235 OD( secgECsecp112r2, ECCurve_SECG_PRIME_112R2,
236 "SECG elliptic curve secp112r2",
237 CKM_INVALID_MECHANISM,
238 INVALID_CERT_EXTENSION ),
239 OD( secgECsecp160r1, ECCurve_SECG_PRIME_160R1,
240 "SECG elliptic curve secp160r1",
241 CKM_INVALID_MECHANISM,
242 INVALID_CERT_EXTENSION ),
243 OD( secgECsecp160k1, ECCurve_SECG_PRIME_160K1,
244 "SECG elliptic curve secp160k1",
245 CKM_INVALID_MECHANISM,
246 INVALID_CERT_EXTENSION ),
247 OD( secgECsecp256k1, ECCurve_SECG_PRIME_256K1,
248 "SECG elliptic curve secp256k1",
249 CKM_INVALID_MECHANISM,
250 INVALID_CERT_EXTENSION ),
251 { { siDEROID, NULL, 0 }, ECCurve_noName,
252 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
253 { { siDEROID, NULL, 0 }, ECCurve_noName,
254 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
255 { { siDEROID, NULL, 0 }, ECCurve_noName,
256 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
257 { { siDEROID, NULL, 0 }, ECCurve_noName,
258 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
259 OD( secgECsect163r2, ECCurve_NIST_B163,
260 "SECG elliptic curve sect163r2 (aka NIST B-163)",
261 CKM_INVALID_MECHANISM,
262 INVALID_CERT_EXTENSION ),
263 OD( secgECsect283k1, ECCurve_NIST_K283,
264 "SECG elliptic curve sect283k1 (aka NIST K-283)",
265 CKM_INVALID_MECHANISM,
266 INVALID_CERT_EXTENSION ),
267 OD( secgECsect283r1, ECCurve_NIST_B283,
268 "SECG elliptic curve sect283r1 (aka NIST B-283)",
269 CKM_INVALID_MECHANISM,
270 INVALID_CERT_EXTENSION ),
271 { { siDEROID, NULL, 0 }, ECCurve_noName,
272 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
273 { { siDEROID, NULL, 0 }, ECCurve_noName,
274 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
275 { { siDEROID, NULL, 0 }, ECCurve_noName,
276 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
277 { { siDEROID, NULL, 0 }, ECCurve_noName,
278 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
279 OD( secgECsect131r1, ECCurve_SECG_CHAR2_131R1,
280 "SECG elliptic curve sect131r1",
281 CKM_INVALID_MECHANISM,
282 INVALID_CERT_EXTENSION ),
283 OD( secgECsect131r2, ECCurve_SECG_CHAR2_131R2,
284 "SECG elliptic curve sect131r2",
285 CKM_INVALID_MECHANISM,
286 INVALID_CERT_EXTENSION ),
287 OD( secgECsect193r1, ECCurve_SECG_CHAR2_193R1,
288 "SECG elliptic curve sect193r1",
289 CKM_INVALID_MECHANISM,
290 INVALID_CERT_EXTENSION ),
291 OD( secgECsect193r2, ECCurve_SECG_CHAR2_193R2,
292 "SECG elliptic curve sect193r2",
293 CKM_INVALID_MECHANISM,
294 INVALID_CERT_EXTENSION ),
295 OD( secgECsect233k1, ECCurve_NIST_K233,
296 "SECG elliptic curve sect233k1 (aka NIST K-233)",
297 CKM_INVALID_MECHANISM,
298 INVALID_CERT_EXTENSION ),
299 OD( secgECsect233r1, ECCurve_NIST_B233,
300 "SECG elliptic curve sect233r1 (aka NIST B-233)",
301 CKM_INVALID_MECHANISM,
302 INVALID_CERT_EXTENSION ),
303 OD( secgECsecp128r1, ECCurve_SECG_PRIME_128R1,
304 "SECG elliptic curve secp128r1",
305 CKM_INVALID_MECHANISM,
306 INVALID_CERT_EXTENSION ),
307 OD( secgECsecp128r2, ECCurve_SECG_PRIME_128R2,
308 "SECG elliptic curve secp128r2",
309 CKM_INVALID_MECHANISM,
310 INVALID_CERT_EXTENSION ),
311 OD( secgECsecp160r2, ECCurve_SECG_PRIME_160R2,
312 "SECG elliptic curve secp160r2",
313 CKM_INVALID_MECHANISM,
314 INVALID_CERT_EXTENSION ),
315 OD( secgECsecp192k1, ECCurve_SECG_PRIME_192K1,
316 "SECG elliptic curve secp192k1",
317 CKM_INVALID_MECHANISM,
318 INVALID_CERT_EXTENSION ),
319 OD( secgECsecp224k1, ECCurve_SECG_PRIME_224K1,
320 "SECG elliptic curve secp224k1",
321 CKM_INVALID_MECHANISM,
322 INVALID_CERT_EXTENSION ),
323 OD( secgECsecp224r1, ECCurve_NIST_P224,
324 "SECG elliptic curve secp224r1 (aka NIST P-224)",
325 CKM_INVALID_MECHANISM,
326 INVALID_CERT_EXTENSION ),
327 OD( secgECsecp384r1, ECCurve_NIST_P384,
328 "SECG elliptic curve secp384r1 (aka NIST P-384)",
329 CKM_INVALID_MECHANISM,
330 INVALID_CERT_EXTENSION ),
331 OD( secgECsecp521r1, ECCurve_NIST_P521,
332 "SECG elliptic curve secp521r1 (aka NIST P-521)",
333 CKM_INVALID_MECHANISM,
334 INVALID_CERT_EXTENSION ),
335 OD( secgECsect409k1, ECCurve_NIST_K409,
336 "SECG elliptic curve sect409k1 (aka NIST K-409)",
337 CKM_INVALID_MECHANISM,
338 INVALID_CERT_EXTENSION ),
339 OD( secgECsect409r1, ECCurve_NIST_B409,
340 "SECG elliptic curve sect409r1 (aka NIST B-409)",
341 CKM_INVALID_MECHANISM,
342 INVALID_CERT_EXTENSION ),
343 OD( secgECsect571k1, ECCurve_NIST_K571,
344 "SECG elliptic curve sect571k1 (aka NIST K-571)",
345 CKM_INVALID_MECHANISM,
346 INVALID_CERT_EXTENSION ),
347 OD( secgECsect571r1, ECCurve_NIST_B571,
348 "SECG elliptic curve sect571r1 (aka NIST B-571)",
349 CKM_INVALID_MECHANISM,
350 INVALID_CERT_EXTENSION )
351 };
352
353 static SECOidData ANSI_oids[] = {
354 { { siDEROID, NULL, 0 }, ECCurve_noName,
355 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
356
357 /* ANSI X9.62 named elliptic curves (characteristic two field) */
358 OD( ansiX962c2pnb163v1, ECCurve_X9_62_CHAR2_PNB163V1,
359 "ANSI X9.62 elliptic curve c2pnb163v1",
360 CKM_INVALID_MECHANISM,
361 INVALID_CERT_EXTENSION ),
362 OD( ansiX962c2pnb163v2, ECCurve_X9_62_CHAR2_PNB163V2,
363 "ANSI X9.62 elliptic curve c2pnb163v2",
364 CKM_INVALID_MECHANISM,
365 INVALID_CERT_EXTENSION ),
366 OD( ansiX962c2pnb163v3, ECCurve_X9_62_CHAR2_PNB163V3,
367 "ANSI X9.62 elliptic curve c2pnb163v3",
368 CKM_INVALID_MECHANISM,
369 INVALID_CERT_EXTENSION ),
370 OD( ansiX962c2pnb176v1, ECCurve_X9_62_CHAR2_PNB176V1,
371 "ANSI X9.62 elliptic curve c2pnb176v1",
372 CKM_INVALID_MECHANISM,
373 INVALID_CERT_EXTENSION ),
374 OD( ansiX962c2tnb191v1, ECCurve_X9_62_CHAR2_TNB191V1,
375 "ANSI X9.62 elliptic curve c2tnb191v1",
376 CKM_INVALID_MECHANISM,
377 INVALID_CERT_EXTENSION ),
378 OD( ansiX962c2tnb191v2, ECCurve_X9_62_CHAR2_TNB191V2,
379 "ANSI X9.62 elliptic curve c2tnb191v2",
380 CKM_INVALID_MECHANISM,
381 INVALID_CERT_EXTENSION ),
382 OD( ansiX962c2tnb191v3, ECCurve_X9_62_CHAR2_TNB191V3,
383 "ANSI X9.62 elliptic curve c2tnb191v3",
384 CKM_INVALID_MECHANISM,
385 INVALID_CERT_EXTENSION ),
386 { { siDEROID, NULL, 0 }, ECCurve_noName,
387 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
388 { { siDEROID, NULL, 0 }, ECCurve_noName,
389 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
390 OD( ansiX962c2pnb208w1, ECCurve_X9_62_CHAR2_PNB208W1,
391 "ANSI X9.62 elliptic curve c2pnb208w1",
392 CKM_INVALID_MECHANISM,
393 INVALID_CERT_EXTENSION ),
394 OD( ansiX962c2tnb239v1, ECCurve_X9_62_CHAR2_TNB239V1,
395 "ANSI X9.62 elliptic curve c2tnb239v1",
396 CKM_INVALID_MECHANISM,
397 INVALID_CERT_EXTENSION ),
398 OD( ansiX962c2tnb239v2, ECCurve_X9_62_CHAR2_TNB239V2,
399 "ANSI X9.62 elliptic curve c2tnb239v2",
400 CKM_INVALID_MECHANISM,
401 INVALID_CERT_EXTENSION ),
402 OD( ansiX962c2tnb239v3, ECCurve_X9_62_CHAR2_TNB239V3,
403 "ANSI X9.62 elliptic curve c2tnb239v3",
404 CKM_INVALID_MECHANISM,
405 INVALID_CERT_EXTENSION ),
406 { { siDEROID, NULL, 0 }, ECCurve_noName,
407 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
408 { { siDEROID, NULL, 0 }, ECCurve_noName,
409 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
410 OD( ansiX962c2pnb272w1, ECCurve_X9_62_CHAR2_PNB272W1,
411 "ANSI X9.62 elliptic curve c2pnb272w1",
412 CKM_INVALID_MECHANISM,
413 INVALID_CERT_EXTENSION ),
414 OD( ansiX962c2pnb304w1, ECCurve_X9_62_CHAR2_PNB304W1,
415 "ANSI X9.62 elliptic curve c2pnb304w1",
416 CKM_INVALID_MECHANISM,
417 INVALID_CERT_EXTENSION ),
418 OD( ansiX962c2tnb359v1, ECCurve_X9_62_CHAR2_TNB359V1,
419 "ANSI X9.62 elliptic curve c2tnb359v1",
420 CKM_INVALID_MECHANISM,
421 INVALID_CERT_EXTENSION ),
422 OD( ansiX962c2pnb368w1, ECCurve_X9_62_CHAR2_PNB368W1,
423 "ANSI X9.62 elliptic curve c2pnb368w1",
424 CKM_INVALID_MECHANISM,
425 INVALID_CERT_EXTENSION ),
426 OD( ansiX962c2tnb431r1, ECCurve_X9_62_CHAR2_TNB431R1,
427 "ANSI X9.62 elliptic curve c2tnb431r1",
428 CKM_INVALID_MECHANISM,
429 INVALID_CERT_EXTENSION )
430 };
431
432 static SECOidData BRAINPOOL_oids[] = {
433 { { siDEROID, NULL, 0 }, ECCurve_noName,
434 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
435
436 /* RFC 5639 Brainpool named elliptic curves */
437 { { siDEROID, NULL, 0 }, ECCurve_noName,
438 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
439 { { siDEROID, NULL, 0 }, ECCurve_noName,
440 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
441 { { siDEROID, NULL, 0 }, ECCurve_noName,
442 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
443 { { siDEROID, NULL, 0 }, ECCurve_noName,
444 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
445 { { siDEROID, NULL, 0 }, ECCurve_noName,
446 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
447 { { siDEROID, NULL, 0 }, ECCurve_noName,
448 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
449 OD( brainpoolP256r1, ECCurve_BrainpoolP256r1,
450 "brainpoolP256r1 domain parameter set",
451 CKM_INVALID_MECHANISM,
452 INVALID_CERT_EXTENSION ),
453 { { siDEROID, NULL, 0 }, ECCurve_noName,
454 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
455 OD( brainpoolP320r1, ECCurve_BrainpoolP320r1,
456 "brainpoolP320r1 domain parameter set",
457 CKM_INVALID_MECHANISM,
458 INVALID_CERT_EXTENSION ),
459 { { siDEROID, NULL, 0 }, ECCurve_noName,
460 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
461 OD( brainpoolP384r1, ECCurve_BrainpoolP384r1,
462 "brainpoolP384r1 domain parameter set",
463 CKM_INVALID_MECHANISM,
464 INVALID_CERT_EXTENSION ),
465 { { siDEROID, NULL, 0 }, ECCurve_noName,
466 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
467 OD( brainpoolP512r1, ECCurve_BrainpoolP512r1,
468 "brainpoolP512r1 domain parameter set",
469 CKM_INVALID_MECHANISM,
470 INVALID_CERT_EXTENSION ),
471 { { siDEROID, NULL, 0 }, ECCurve_noName,
472 "Unknown OID", CKM_INVALID_MECHANISM,
473 INVALID_CERT_EXTENSION }
474 };
475
476 int
oideql(unsigned char * reqoid,unsigned char * foundoid,size_t reqlen,size_t foundlen)477 oideql(unsigned char *reqoid, unsigned char *foundoid, size_t reqlen, size_t foundlen)
478 {
479 if (!reqoid || !foundoid) {
480 return 0;
481 }
482
483 if (reqlen != foundlen) {
484 return 0;
485 }
486
487 return memcmp(reqoid, foundoid, reqlen) == 0;
488 }
489
490 SECOidData *
SECOID_FindOID(const SECItem * oid)491 SECOID_FindOID(const SECItem *oid)
492 {
493 SECOidData *po;
494 SECOidData *ret = NULL;
495 int reqlen = oid->len;
496
497 if (reqlen == 8) {
498 if (oid->data[6] == 0x00) {
499 /* XXX bounds check */
500 po = &ANSI_oids[oid->data[7]];
501 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) {
502 ret = po;
503 }
504 }
505 if (oid->data[6] == 0x01) {
506 /* XXX bounds check */
507 po = &ANSI_prime_oids[oid->data[7]];
508 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) {
509 ret = po;
510 }
511 }
512 } else if (reqlen == 5) {
513 /* XXX bounds check */
514 po = &SECG_oids[oid->data[4]];
515 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) {
516 ret = po;
517 }
518 } else if (reqlen == 9) {
519 /* XXX bounds check */
520 po = &BRAINPOOL_oids[oid->data[8]];
521 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) {
522 ret = po;
523 }
524 }
525 return(ret);
526 }
527
528 ECCurveName
SECOID_FindOIDTag(const SECItem * oid)529 SECOID_FindOIDTag(const SECItem *oid)
530 {
531 SECOidData *oiddata;
532
533 oiddata = SECOID_FindOID (oid);
534 if (oiddata == NULL)
535 return ECCurve_noName;
536
537 return oiddata->offset;
538 }
539