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