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 }