xref: /illumos-gate/usr/src/common/crypto/ecc/oid.c (revision 55fea89d)
1f9fbec18Smcpowers /* ***** BEGIN LICENSE BLOCK *****
2f9fbec18Smcpowers  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3f9fbec18Smcpowers  *
4f9fbec18Smcpowers  * The contents of this file are subject to the Mozilla Public License Version
5f9fbec18Smcpowers  * 1.1 (the "License"); you may not use this file except in compliance with
6f9fbec18Smcpowers  * the License. You may obtain a copy of the License at
7f9fbec18Smcpowers  * http://www.mozilla.org/MPL/
8f9fbec18Smcpowers  *
9f9fbec18Smcpowers  * Software distributed under the License is distributed on an "AS IS" basis,
10f9fbec18Smcpowers  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11f9fbec18Smcpowers  * for the specific language governing rights and limitations under the
12f9fbec18Smcpowers  * License.
13f9fbec18Smcpowers  *
14f9fbec18Smcpowers  * The Original Code is the Netscape security libraries.
15f9fbec18Smcpowers  *
16f9fbec18Smcpowers  * The Initial Developer of the Original Code is
17f9fbec18Smcpowers  * Netscape Communications Corporation.
18f9fbec18Smcpowers  * Portions created by the Initial Developer are Copyright (C) 1994-2000
19f9fbec18Smcpowers  * the Initial Developer. All Rights Reserved.
20f9fbec18Smcpowers  *
21f9fbec18Smcpowers  * Contributor(s):
22f9fbec18Smcpowers  *   Dr Vipul Gupta <vipul.gupta@sun.com>, Sun Microsystems Laboratories
23f9fbec18Smcpowers  *
24f9fbec18Smcpowers  * Alternatively, the contents of this file may be used under the terms of
25f9fbec18Smcpowers  * either the GNU General Public License Version 2 or later (the "GPL"), or
26f9fbec18Smcpowers  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27f9fbec18Smcpowers  * in which case the provisions of the GPL or the LGPL are applicable instead
28f9fbec18Smcpowers  * of those above. If you wish to allow use of your version of this file only
29f9fbec18Smcpowers  * under the terms of either the GPL or the LGPL, and not to allow others to
30f9fbec18Smcpowers  * use your version of this file under the terms of the MPL, indicate your
31f9fbec18Smcpowers  * decision by deleting the provisions above and replace them with the notice
32f9fbec18Smcpowers  * and other provisions required by the GPL or the LGPL. If you do not delete
33f9fbec18Smcpowers  * the provisions above, a recipient may use your version of this file under
34f9fbec18Smcpowers  * the terms of any one of the MPL, the GPL or the LGPL.
35f9fbec18Smcpowers  *
36f9fbec18Smcpowers  * ***** END LICENSE BLOCK ***** */
37f9fbec18Smcpowers /*
38f9fbec18Smcpowers  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
39f9fbec18Smcpowers  * Use is subject to license terms.
40f9fbec18Smcpowers  *
41f9fbec18Smcpowers  * Sun elects to use this software under the MPL license.
42f9fbec18Smcpowers  */
43f9fbec18Smcpowers 
44f9fbec18Smcpowers #include <sys/types.h>
45f9fbec18Smcpowers #include <sys/systm.h>
46f9fbec18Smcpowers #include <sys/param.h>
47f9fbec18Smcpowers #ifdef _KERNEL
48f9fbec18Smcpowers #include <sys/kmem.h>
49f9fbec18Smcpowers #else
50f9fbec18Smcpowers #include <string.h>
51f9fbec18Smcpowers #endif
52f9fbec18Smcpowers #include "ec.h"
53f9fbec18Smcpowers #include "ecl-curve.h"
54f9fbec18Smcpowers #include "ecc_impl.h"
55f9fbec18Smcpowers #include "secoidt.h"
56f9fbec18Smcpowers 
57f9fbec18Smcpowers #define CERTICOM_OID            0x2b, 0x81, 0x04
58f9fbec18Smcpowers #define SECG_OID                CERTICOM_OID, 0x00
59f9fbec18Smcpowers 
60f9fbec18Smcpowers #define ANSI_X962_OID           0x2a, 0x86, 0x48, 0xce, 0x3d
61f9fbec18Smcpowers #define ANSI_X962_CURVE_OID     ANSI_X962_OID, 0x03
62f9fbec18Smcpowers #define ANSI_X962_GF2m_OID      ANSI_X962_CURVE_OID, 0x00
63f9fbec18Smcpowers #define ANSI_X962_GFp_OID       ANSI_X962_CURVE_OID, 0x01
64f9fbec18Smcpowers 
65f9fbec18Smcpowers #define CONST_OID static const unsigned char
66f9fbec18Smcpowers 
67f9fbec18Smcpowers /* ANSI X9.62 prime curve OIDs */
68f9fbec18Smcpowers /* NOTE: prime192v1 is the same as secp192r1, prime256v1 is the
69f9fbec18Smcpowers  * same as secp256r1
70f9fbec18Smcpowers  */
71f9fbec18Smcpowers CONST_OID ansiX962prime192v1[] = { ANSI_X962_GFp_OID, 0x01 };
72f9fbec18Smcpowers CONST_OID ansiX962prime192v2[] = { ANSI_X962_GFp_OID, 0x02 };
73f9fbec18Smcpowers CONST_OID ansiX962prime192v3[] = { ANSI_X962_GFp_OID, 0x03 };
74f9fbec18Smcpowers CONST_OID ansiX962prime239v1[] = { ANSI_X962_GFp_OID, 0x04 };
75f9fbec18Smcpowers CONST_OID ansiX962prime239v2[] = { ANSI_X962_GFp_OID, 0x05 };
76f9fbec18Smcpowers CONST_OID ansiX962prime239v3[] = { ANSI_X962_GFp_OID, 0x06 };
77f9fbec18Smcpowers CONST_OID ansiX962prime256v1[] = { ANSI_X962_GFp_OID, 0x07 };
78f9fbec18Smcpowers 
79f9fbec18Smcpowers /* SECG prime curve OIDs */
80f9fbec18Smcpowers CONST_OID secgECsecp112r1[] = { SECG_OID, 0x06 };
81f9fbec18Smcpowers CONST_OID secgECsecp112r2[] = { SECG_OID, 0x07 };
82f9fbec18Smcpowers CONST_OID secgECsecp128r1[] = { SECG_OID, 0x1c };
83f9fbec18Smcpowers CONST_OID secgECsecp128r2[] = { SECG_OID, 0x1d };
84f9fbec18Smcpowers CONST_OID secgECsecp160k1[] = { SECG_OID, 0x09 };
85f9fbec18Smcpowers CONST_OID secgECsecp160r1[] = { SECG_OID, 0x08 };
86f9fbec18Smcpowers CONST_OID secgECsecp160r2[] = { SECG_OID, 0x1e };
87f9fbec18Smcpowers CONST_OID secgECsecp192k1[] = { SECG_OID, 0x1f };
88f9fbec18Smcpowers CONST_OID secgECsecp224k1[] = { SECG_OID, 0x20 };
89f9fbec18Smcpowers CONST_OID secgECsecp224r1[] = { SECG_OID, 0x21 };
90f9fbec18Smcpowers CONST_OID secgECsecp256k1[] = { SECG_OID, 0x0a };
91f9fbec18Smcpowers CONST_OID secgECsecp384r1[] = { SECG_OID, 0x22 };
92f9fbec18Smcpowers CONST_OID secgECsecp521r1[] = { SECG_OID, 0x23 };
93f9fbec18Smcpowers 
94f9fbec18Smcpowers /* SECG characterisitic two curve OIDs */
95f9fbec18Smcpowers CONST_OID secgECsect113r1[] = {SECG_OID, 0x04 };
96f9fbec18Smcpowers CONST_OID secgECsect113r2[] = {SECG_OID, 0x05 };
97f9fbec18Smcpowers CONST_OID secgECsect131r1[] = {SECG_OID, 0x16 };
98f9fbec18Smcpowers CONST_OID secgECsect131r2[] = {SECG_OID, 0x17 };
99f9fbec18Smcpowers CONST_OID secgECsect163k1[] = {SECG_OID, 0x01 };
100f9fbec18Smcpowers CONST_OID secgECsect163r1[] = {SECG_OID, 0x02 };
101f9fbec18Smcpowers CONST_OID secgECsect163r2[] = {SECG_OID, 0x0f };
102f9fbec18Smcpowers CONST_OID secgECsect193r1[] = {SECG_OID, 0x18 };
103f9fbec18Smcpowers CONST_OID secgECsect193r2[] = {SECG_OID, 0x19 };
104f9fbec18Smcpowers CONST_OID secgECsect233k1[] = {SECG_OID, 0x1a };
105f9fbec18Smcpowers CONST_OID secgECsect233r1[] = {SECG_OID, 0x1b };
106f9fbec18Smcpowers CONST_OID secgECsect239k1[] = {SECG_OID, 0x03 };
107f9fbec18Smcpowers CONST_OID secgECsect283k1[] = {SECG_OID, 0x10 };
108f9fbec18Smcpowers CONST_OID secgECsect283r1[] = {SECG_OID, 0x11 };
109f9fbec18Smcpowers CONST_OID secgECsect409k1[] = {SECG_OID, 0x24 };
110f9fbec18Smcpowers CONST_OID secgECsect409r1[] = {SECG_OID, 0x25 };
111f9fbec18Smcpowers CONST_OID secgECsect571k1[] = {SECG_OID, 0x26 };
112f9fbec18Smcpowers CONST_OID secgECsect571r1[] = {SECG_OID, 0x27 };
113f9fbec18Smcpowers 
114f9fbec18Smcpowers /* ANSI X9.62 characteristic two curve OIDs */
115f9fbec18Smcpowers CONST_OID ansiX962c2pnb163v1[] = { ANSI_X962_GF2m_OID, 0x01 };
116f9fbec18Smcpowers CONST_OID ansiX962c2pnb163v2[] = { ANSI_X962_GF2m_OID, 0x02 };
117f9fbec18Smcpowers CONST_OID ansiX962c2pnb163v3[] = { ANSI_X962_GF2m_OID, 0x03 };
118f9fbec18Smcpowers CONST_OID ansiX962c2pnb176v1[] = { ANSI_X962_GF2m_OID, 0x04 };
119f9fbec18Smcpowers CONST_OID ansiX962c2tnb191v1[] = { ANSI_X962_GF2m_OID, 0x05 };
120f9fbec18Smcpowers CONST_OID ansiX962c2tnb191v2[] = { ANSI_X962_GF2m_OID, 0x06 };
121f9fbec18Smcpowers CONST_OID ansiX962c2tnb191v3[] = { ANSI_X962_GF2m_OID, 0x07 };
122f9fbec18Smcpowers CONST_OID ansiX962c2onb191v4[] = { ANSI_X962_GF2m_OID, 0x08 };
123f9fbec18Smcpowers CONST_OID ansiX962c2onb191v5[] = { ANSI_X962_GF2m_OID, 0x09 };
124f9fbec18Smcpowers CONST_OID ansiX962c2pnb208w1[] = { ANSI_X962_GF2m_OID, 0x0a };
125f9fbec18Smcpowers CONST_OID ansiX962c2tnb239v1[] = { ANSI_X962_GF2m_OID, 0x0b };
126f9fbec18Smcpowers CONST_OID ansiX962c2tnb239v2[] = { ANSI_X962_GF2m_OID, 0x0c };
127f9fbec18Smcpowers CONST_OID ansiX962c2tnb239v3[] = { ANSI_X962_GF2m_OID, 0x0d };
128f9fbec18Smcpowers CONST_OID ansiX962c2onb239v4[] = { ANSI_X962_GF2m_OID, 0x0e };
129f9fbec18Smcpowers CONST_OID ansiX962c2onb239v5[] = { ANSI_X962_GF2m_OID, 0x0f };
130f9fbec18Smcpowers CONST_OID ansiX962c2pnb272w1[] = { ANSI_X962_GF2m_OID, 0x10 };
131f9fbec18Smcpowers CONST_OID ansiX962c2pnb304w1[] = { ANSI_X962_GF2m_OID, 0x11 };
132f9fbec18Smcpowers CONST_OID ansiX962c2tnb359v1[] = { ANSI_X962_GF2m_OID, 0x12 };
133f9fbec18Smcpowers CONST_OID ansiX962c2pnb368w1[] = { ANSI_X962_GF2m_OID, 0x13 };
134f9fbec18Smcpowers CONST_OID ansiX962c2tnb431r1[] = { ANSI_X962_GF2m_OID, 0x14 };
135f9fbec18Smcpowers 
136f9fbec18Smcpowers #define OI(x) { siDEROID, (unsigned char *)x, sizeof x }
137f9fbec18Smcpowers #ifndef SECOID_NO_STRINGS
138f9fbec18Smcpowers #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext }
139f9fbec18Smcpowers #else
140f9fbec18Smcpowers #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext }
141f9fbec18Smcpowers #endif
142f9fbec18Smcpowers 
143f9fbec18Smcpowers #define	CKM_INVALID_MECHANISM 0xffffffffUL
144f9fbec18Smcpowers 
145f9fbec18Smcpowers /* XXX this is incorrect */
146f9fbec18Smcpowers #define	INVALID_CERT_EXTENSION 1
147f9fbec18Smcpowers 
148b106467fSJason King #define CKM_ECDSA                      0x00001041UL
149b106467fSJason King #define CKM_ECDSA_SHA1                 0x00001042UL
150b106467fSJason King #define CKM_ECDH1_DERIVE               0x00001050UL
151f9fbec18Smcpowers 
152f9fbec18Smcpowers static SECOidData ANSI_prime_oids[] = {
153f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
154f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
155f9fbec18Smcpowers 
156f9fbec18Smcpowers     OD( ansiX962prime192v1, ECCurve_NIST_P192,
157*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime192v1 (aka secp192r1, NIST P-192)",
158f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
159f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
160f9fbec18Smcpowers     OD( ansiX962prime192v2, ECCurve_X9_62_PRIME_192V2,
161*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime192v2",
162f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
163f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
164f9fbec18Smcpowers     OD( ansiX962prime192v3, ECCurve_X9_62_PRIME_192V3,
165*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime192v3",
166f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
167f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
168f9fbec18Smcpowers     OD( ansiX962prime239v1, ECCurve_X9_62_PRIME_239V1,
169*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime239v1",
170f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
171f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
172f9fbec18Smcpowers     OD( ansiX962prime239v2, ECCurve_X9_62_PRIME_239V2,
173*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime239v2",
174f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
175f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
176f9fbec18Smcpowers     OD( ansiX962prime239v3, ECCurve_X9_62_PRIME_239V3,
177*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime239v3",
178f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
179f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
180f9fbec18Smcpowers     OD( ansiX962prime256v1, ECCurve_NIST_P256,
181*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256)",
182f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
183f9fbec18Smcpowers 	INVALID_CERT_EXTENSION )
184f9fbec18Smcpowers };
185f9fbec18Smcpowers 
186f9fbec18Smcpowers static SECOidData SECG_oids[] = {
187f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
188f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
189f9fbec18Smcpowers 
190f9fbec18Smcpowers     OD( secgECsect163k1, ECCurve_NIST_K163,
191*55fea89dSDan Cross 	"SECG elliptic curve sect163k1 (aka NIST K-163)",
192f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
193f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
194f9fbec18Smcpowers     OD( secgECsect163r1, ECCurve_SECG_CHAR2_163R1,
195*55fea89dSDan Cross 	"SECG elliptic curve sect163r1",
196f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
197f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
198f9fbec18Smcpowers     OD( secgECsect239k1, ECCurve_SECG_CHAR2_239K1,
199*55fea89dSDan Cross 	"SECG elliptic curve sect239k1",
200f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
201f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
202f9fbec18Smcpowers     OD( secgECsect113r1, ECCurve_SECG_CHAR2_113R1,
203*55fea89dSDan Cross 	"SECG elliptic curve sect113r1",
204f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
205f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
206f9fbec18Smcpowers     OD( secgECsect113r2, ECCurve_SECG_CHAR2_113R2,
207*55fea89dSDan Cross 	"SECG elliptic curve sect113r2",
208f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
209f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
210f9fbec18Smcpowers     OD( secgECsecp112r1, ECCurve_SECG_PRIME_112R1,
211*55fea89dSDan Cross 	"SECG elliptic curve secp112r1",
212f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
213f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
214f9fbec18Smcpowers     OD( secgECsecp112r2, ECCurve_SECG_PRIME_112R2,
215*55fea89dSDan Cross 	"SECG elliptic curve secp112r2",
216f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
217f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
218f9fbec18Smcpowers     OD( secgECsecp160r1, ECCurve_SECG_PRIME_160R1,
219*55fea89dSDan Cross 	"SECG elliptic curve secp160r1",
220f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
221f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
222f9fbec18Smcpowers     OD( secgECsecp160k1, ECCurve_SECG_PRIME_160K1,
223*55fea89dSDan Cross 	"SECG elliptic curve secp160k1",
224f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
225f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
226f9fbec18Smcpowers     OD( secgECsecp256k1, ECCurve_SECG_PRIME_256K1,
227*55fea89dSDan Cross 	"SECG elliptic curve secp256k1",
228f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
229f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
230f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
231f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
232f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
233f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
234f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
235f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
236f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
237f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
238f9fbec18Smcpowers     OD( secgECsect163r2, ECCurve_NIST_B163,
239*55fea89dSDan Cross 	"SECG elliptic curve sect163r2 (aka NIST B-163)",
240f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
241f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
242f9fbec18Smcpowers     OD( secgECsect283k1, ECCurve_NIST_K283,
243*55fea89dSDan Cross 	"SECG elliptic curve sect283k1 (aka NIST K-283)",
244f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
245f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
246f9fbec18Smcpowers     OD( secgECsect283r1, ECCurve_NIST_B283,
247*55fea89dSDan Cross 	"SECG elliptic curve sect283r1 (aka NIST B-283)",
248f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
249f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
250f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
251f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
252f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
253f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
254f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
255f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
256f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
257f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
258f9fbec18Smcpowers     OD( secgECsect131r1, ECCurve_SECG_CHAR2_131R1,
259*55fea89dSDan Cross 	"SECG elliptic curve sect131r1",
260f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
261f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
262f9fbec18Smcpowers     OD( secgECsect131r2, ECCurve_SECG_CHAR2_131R2,
263*55fea89dSDan Cross 	"SECG elliptic curve sect131r2",
264f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
265f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
266f9fbec18Smcpowers     OD( secgECsect193r1, ECCurve_SECG_CHAR2_193R1,
267*55fea89dSDan Cross 	"SECG elliptic curve sect193r1",
268f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
269f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
270f9fbec18Smcpowers     OD( secgECsect193r2, ECCurve_SECG_CHAR2_193R2,
271*55fea89dSDan Cross 	"SECG elliptic curve sect193r2",
272f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
273f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
274f9fbec18Smcpowers     OD( secgECsect233k1, ECCurve_NIST_K233,
275*55fea89dSDan Cross 	"SECG elliptic curve sect233k1 (aka NIST K-233)",
276f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
277f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
278f9fbec18Smcpowers     OD( secgECsect233r1, ECCurve_NIST_B233,
279*55fea89dSDan Cross 	"SECG elliptic curve sect233r1 (aka NIST B-233)",
280f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
281f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
282f9fbec18Smcpowers     OD( secgECsecp128r1, ECCurve_SECG_PRIME_128R1,
283*55fea89dSDan Cross 	"SECG elliptic curve secp128r1",
284f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
285f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
286f9fbec18Smcpowers     OD( secgECsecp128r2, ECCurve_SECG_PRIME_128R2,
287*55fea89dSDan Cross 	"SECG elliptic curve secp128r2",
288f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
289f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
290f9fbec18Smcpowers     OD( secgECsecp160r2, ECCurve_SECG_PRIME_160R2,
291*55fea89dSDan Cross 	"SECG elliptic curve secp160r2",
292f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
293f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
294f9fbec18Smcpowers     OD( secgECsecp192k1, ECCurve_SECG_PRIME_192K1,
295*55fea89dSDan Cross 	"SECG elliptic curve secp192k1",
296f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
297f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
298f9fbec18Smcpowers     OD( secgECsecp224k1, ECCurve_SECG_PRIME_224K1,
299*55fea89dSDan Cross 	"SECG elliptic curve secp224k1",
300f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
301f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
302f9fbec18Smcpowers     OD( secgECsecp224r1, ECCurve_NIST_P224,
303*55fea89dSDan Cross 	"SECG elliptic curve secp224r1 (aka NIST P-224)",
304f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
305f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
306f9fbec18Smcpowers     OD( secgECsecp384r1, ECCurve_NIST_P384,
307*55fea89dSDan Cross 	"SECG elliptic curve secp384r1 (aka NIST P-384)",
308f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
309f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
310f9fbec18Smcpowers     OD( secgECsecp521r1, ECCurve_NIST_P521,
311*55fea89dSDan Cross 	"SECG elliptic curve secp521r1 (aka NIST P-521)",
312f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
313f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
314f9fbec18Smcpowers     OD( secgECsect409k1, ECCurve_NIST_K409,
315*55fea89dSDan Cross 	"SECG elliptic curve sect409k1 (aka NIST K-409)",
316f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
317f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
318f9fbec18Smcpowers     OD( secgECsect409r1, ECCurve_NIST_B409,
319*55fea89dSDan Cross 	"SECG elliptic curve sect409r1 (aka NIST B-409)",
320f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
321f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
322f9fbec18Smcpowers     OD( secgECsect571k1, ECCurve_NIST_K571,
323*55fea89dSDan Cross 	"SECG elliptic curve sect571k1 (aka NIST K-571)",
324f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
325f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
326f9fbec18Smcpowers     OD( secgECsect571r1, ECCurve_NIST_B571,
327*55fea89dSDan Cross 	"SECG elliptic curve sect571r1 (aka NIST B-571)",
328f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
329f9fbec18Smcpowers 	INVALID_CERT_EXTENSION )
330f9fbec18Smcpowers };
331f9fbec18Smcpowers 
332f9fbec18Smcpowers static SECOidData ANSI_oids[] = {
333f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
334f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
335f9fbec18Smcpowers 
336f9fbec18Smcpowers     /* ANSI X9.62 named elliptic curves (characteristic two field) */
337f9fbec18Smcpowers     OD( ansiX962c2pnb163v1, ECCurve_X9_62_CHAR2_PNB163V1,
338*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb163v1",
339f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
340f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
341f9fbec18Smcpowers     OD( ansiX962c2pnb163v2, ECCurve_X9_62_CHAR2_PNB163V2,
342*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb163v2",
343f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
344f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
345f9fbec18Smcpowers     OD( ansiX962c2pnb163v3, ECCurve_X9_62_CHAR2_PNB163V3,
346*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb163v3",
347f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
348f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
349f9fbec18Smcpowers     OD( ansiX962c2pnb176v1, ECCurve_X9_62_CHAR2_PNB176V1,
350*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb176v1",
351f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
352f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
353f9fbec18Smcpowers     OD( ansiX962c2tnb191v1, ECCurve_X9_62_CHAR2_TNB191V1,
354*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb191v1",
355f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
356f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
357f9fbec18Smcpowers     OD( ansiX962c2tnb191v2, ECCurve_X9_62_CHAR2_TNB191V2,
358*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb191v2",
359f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
360f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
361f9fbec18Smcpowers     OD( ansiX962c2tnb191v3, ECCurve_X9_62_CHAR2_TNB191V3,
362*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb191v3",
363f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
364f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
365f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
366f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
367f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
368f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
369f9fbec18Smcpowers     OD( ansiX962c2pnb208w1, ECCurve_X9_62_CHAR2_PNB208W1,
370*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb208w1",
371f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
372f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
373f9fbec18Smcpowers     OD( ansiX962c2tnb239v1, ECCurve_X9_62_CHAR2_TNB239V1,
374*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb239v1",
375f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
376f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
377f9fbec18Smcpowers     OD( ansiX962c2tnb239v2, ECCurve_X9_62_CHAR2_TNB239V2,
378*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb239v2",
379f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
380f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
381f9fbec18Smcpowers     OD( ansiX962c2tnb239v3, ECCurve_X9_62_CHAR2_TNB239V3,
382*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb239v3",
383f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
384f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
385f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
386f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
387f9fbec18Smcpowers     { { siDEROID, NULL, 0 }, ECCurve_noName,
388f9fbec18Smcpowers 	"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },
389f9fbec18Smcpowers     OD( ansiX962c2pnb272w1, ECCurve_X9_62_CHAR2_PNB272W1,
390*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb272w1",
391f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
392f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
393f9fbec18Smcpowers     OD( ansiX962c2pnb304w1, ECCurve_X9_62_CHAR2_PNB304W1,
394*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb304w1",
395f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
396f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
397f9fbec18Smcpowers     OD( ansiX962c2tnb359v1, ECCurve_X9_62_CHAR2_TNB359V1,
398*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb359v1",
399f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
400f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
401f9fbec18Smcpowers     OD( ansiX962c2pnb368w1, ECCurve_X9_62_CHAR2_PNB368W1,
402*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2pnb368w1",
403f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
404f9fbec18Smcpowers 	INVALID_CERT_EXTENSION ),
405f9fbec18Smcpowers     OD( ansiX962c2tnb431r1, ECCurve_X9_62_CHAR2_TNB431R1,
406*55fea89dSDan Cross 	"ANSI X9.62 elliptic curve c2tnb431r1",
407f9fbec18Smcpowers 	CKM_INVALID_MECHANISM,
408f9fbec18Smcpowers 	INVALID_CERT_EXTENSION )
409f9fbec18Smcpowers };
410f9fbec18Smcpowers 
411f9fbec18Smcpowers SECOidData *
SECOID_FindOID(const SECItem * oid)412f9fbec18Smcpowers SECOID_FindOID(const SECItem *oid)
413f9fbec18Smcpowers {
414f9fbec18Smcpowers     SECOidData *po;
415f9fbec18Smcpowers     SECOidData *ret;
416f9fbec18Smcpowers     int i;
417f9fbec18Smcpowers 
418f9fbec18Smcpowers     if (oid->len == 8) {
419f9fbec18Smcpowers 	if (oid->data[6] == 0x00) {
420f9fbec18Smcpowers 		/* XXX bounds check */
421f9fbec18Smcpowers 		po = &ANSI_oids[oid->data[7]];
422f9fbec18Smcpowers 		if (memcmp(oid->data, po->oid.data, 8) == 0)
423f9fbec18Smcpowers 			ret = po;
424f9fbec18Smcpowers 	}
425f9fbec18Smcpowers 	if (oid->data[6] == 0x01) {
426f9fbec18Smcpowers 		/* XXX bounds check */
427f9fbec18Smcpowers 		po = &ANSI_prime_oids[oid->data[7]];
428f9fbec18Smcpowers 		if (memcmp(oid->data, po->oid.data, 8) == 0)
429f9fbec18Smcpowers 			ret = po;
430f9fbec18Smcpowers 	}
431f9fbec18Smcpowers     } else if (oid->len == 5) {
432f9fbec18Smcpowers 	/* XXX bounds check */
433f9fbec18Smcpowers 	po = &SECG_oids[oid->data[4]];
434f9fbec18Smcpowers 	if (memcmp(oid->data, po->oid.data, 5) == 0)
435f9fbec18Smcpowers 		ret = po;
436f9fbec18Smcpowers     } else {
437f9fbec18Smcpowers 	ret = NULL;
438f9fbec18Smcpowers     }
439f9fbec18Smcpowers     return(ret);
440f9fbec18Smcpowers }
441f9fbec18Smcpowers 
442f9fbec18Smcpowers ECCurveName
SECOID_FindOIDTag(const SECItem * oid)443f9fbec18Smcpowers SECOID_FindOIDTag(const SECItem *oid)
444f9fbec18Smcpowers {
445f9fbec18Smcpowers     SECOidData *oiddata;
446f9fbec18Smcpowers 
447f9fbec18Smcpowers     oiddata = SECOID_FindOID (oid);
448f9fbec18Smcpowers     if (oiddata == NULL)
449f9fbec18Smcpowers 	return ECCurve_noName;
450f9fbec18Smcpowers 
451f9fbec18Smcpowers     return oiddata->offset;
452f9fbec18Smcpowers }
453