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