001/* 002 * Copyright 2017-2024 Ping Identity Corporation 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright 2017-2024 Ping Identity Corporation 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020/* 021 * Copyright (C) 2017-2024 Ping Identity Corporation 022 * 023 * This program is free software; you can redistribute it and/or modify 024 * it under the terms of the GNU General Public License (GPLv2 only) 025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 026 * as published by the Free Software Foundation. 027 * 028 * This program is distributed in the hope that it will be useful, 029 * but WITHOUT ANY WARRANTY; without even the implied warranty of 030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 031 * GNU General Public License for more details. 032 * 033 * You should have received a copy of the GNU General Public License 034 * along with this program; if not, see <http://www.gnu.org/licenses>. 035 */ 036package com.unboundid.util.ssl.cert; 037 038 039 040import com.unboundid.util.NotNull; 041import com.unboundid.util.Nullable; 042import com.unboundid.util.OID; 043import com.unboundid.util.ThreadSafety; 044import com.unboundid.util.ThreadSafetyLevel; 045 046 047 048/** 049 * This enum defines a set of OIDs that are known to be associated with elliptic 050 * curve keys. 051 */ 052@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 053public enum NamedCurve 054{ 055 /** 056 * The brainpoolP256r1 curve. 057 */ 058 BRAINPOOLP256R1("1.3.36.3.3.2.8.1.1.7", "brainpoolP256r1"), 059 060 061 062 /** 063 * The brainpoolP384r1 curve. 064 */ 065 BRAINPOOLP384R1("1.3.36.3.3.2.8.1.1.11", "brainpoolP384r1"), 066 067 068 069 /** 070 * The brainpoolP512r1 curve. 071 */ 072 BRAINPOOLP512R1("1.3.36.3.3.2.8.1.1.13", "brainpoolP512r1"), 073 074 075 076 /** 077 * The secP160k1 curve. 078 */ 079 SECP160K1("1.3.132.0.9", "secP160k1"), 080 081 082 083 /** 084 * The secP160r1 curve. 085 */ 086 SECP160R1("1.3.132.0.8", "secP160r1"), 087 088 089 090 /** 091 * The secP160r2 curve. 092 */ 093 SECP160R2("1.3.132.0.30", "secP160r2"), 094 095 096 097 /** 098 * The secP192k1 curve. 099 */ 100 SECP192K1("1.3.132.0.31", "secP192k1"), 101 102 103 104 /** 105 * The secP192r1 curve (also known as nistP192). 106 */ 107 SECP192R1("1.2.840.10045.3.1.1", "secP192r1"), 108 109 110 111 /** 112 * The secP224k1 curve. 113 */ 114 SECP224K1("1.3.132.0.32", "secP224k1"), 115 116 117 118 /** 119 * The secP224r1 curve (also known as nistP224). 120 */ 121 SECP224R1("1.3.132.0.33", "secP224r1"), 122 123 124 125 /** 126 * The secP256k1 curve. 127 */ 128 SECP256K1("1.3.132.0.10", "secP256k1"), 129 130 131 132 /** 133 * The secP256r1 curve (also known as nistP256). 134 */ 135 SECP256R1("1.2.840.10045.3.1.7", "secP256r1"), 136 137 138 139 /** 140 * The secP384r1 curve (also known as nistP384). 141 */ 142 SECP384R1("1.3.132.0.34", "secP384r1"), 143 144 145 146 /** 147 * The secP521r1 curve (also known as nistP521). 148 */ 149 SECP521R1("1.3.132.0.35", "secP521r1"), 150 151 152 153 /** 154 * The secT163k1 curve. 155 */ 156 SECT163K1("1.3.132.0.1", "secT163k1"), 157 158 159 160 /** 161 * The secT163r2 curve. 162 */ 163 SECT163R2("1.3.132.0.15", "secT163r2"), 164 165 166 167 /** 168 * The secT233k1 curve. 169 */ 170 SECT233K1("1.3.132.0.26", "secT233k1"), 171 172 173 174 /** 175 * The secT233r1 curve. 176 */ 177 SECT233R1("1.3.132.0.27", "secT233r1"), 178 179 180 181 /** 182 * The secT283k1 curve. 183 */ 184 SECT283K1("1.3.132.0.16", "secT283k1"), 185 186 187 188 /** 189 * The secT283r1 curve. 190 */ 191 SECT283R1("1.3.132.0.17", "secT283r1"), 192 193 194 195 /** 196 * The secT409k1 curve. 197 */ 198 SECT409K1("1.3.132.0.36", "secT409k1"), 199 200 201 202 /** 203 * The secT409r1 curve. 204 */ 205 SECT409R1("1.3.132.0.37", "secT409r1"), 206 207 208 209 /** 210 * The secT571k1 curve. 211 */ 212 SECT571K1("1.3.132.0.38", "secT571k1"), 213 214 215 216 /** 217 * The secT571r1 curve. 218 */ 219 SECT571R1("1.3.132.0.39", "secT571r1"); 220 221 222 223 // The OID for this extended key usage ID value. 224 @NotNull private final OID oid; 225 226 // The name for this extended key usage ID value. 227 @NotNull private final String name; 228 229 230 231 /** 232 * Creates a new named curve value with the provided information. 233 * 234 * @param oidString The string representation of the OID for this named 235 * curve value. 236 * @param name The name for this named curve value. 237 */ 238 NamedCurve(@NotNull final String oidString, @NotNull final String name) 239 { 240 this.name = name; 241 242 oid = new OID(oidString); 243 } 244 245 246 247 /** 248 * Retrieves the OID for this named curve value. 249 * 250 * @return The OID for this named curve value. 251 */ 252 @NotNull() 253 public OID getOID() 254 { 255 return oid; 256 } 257 258 259 260 /** 261 * Retrieves the name for this named curve value. 262 * 263 * @return The name for this named curve value. 264 */ 265 @NotNull() 266 public String getName() 267 { 268 return name; 269 } 270 271 272 273 /** 274 * Retrieves the named curve value with the specified OID. 275 * 276 * @param oid The OID of the named curve value to retrieve. It must not be 277 * {@code null}. 278 * 279 * @return The named curve value with the specified OID, or {@code null} if 280 * there is no value with the specified OID. 281 */ 282 @Nullable() 283 public static NamedCurve forOID(@NotNull final OID oid) 284 { 285 for (final NamedCurve curve : values()) 286 { 287 if (curve.oid.equals(oid)) 288 { 289 return curve; 290 } 291 } 292 293 return null; 294 } 295 296 297 298 /** 299 * Retrieves the name for the named curve value with the provided OID, or a 300 * string representation of the OID if there is no value with that OID. 301 * 302 * @param oid The OID for the named curve to retrieve. 303 * 304 * @return The name for the named curve value with the provided OID, or a 305 * string representation of the OID if there is no value with that 306 * OID. 307 */ 308 @NotNull() 309 public static String getNameOrOID(@NotNull final OID oid) 310 { 311 final NamedCurve curve = forOID(oid); 312 if (curve == null) 313 { 314 return oid.toString(); 315 } 316 else 317 { 318 return curve.name; 319 } 320 } 321 322 323 324 /** 325 * Retrieves the named curve with the specified name. 326 * 327 * @param name The name of the named curve to retrieve. It must not be 328 * {@code null}. 329 * 330 * @return The requested named curve, or {@code null} if no such curve is 331 * defined. 332 */ 333 @Nullable() 334 public static NamedCurve forName(@NotNull final String name) 335 { 336 for (final NamedCurve namedCurve : values()) 337 { 338 if (namedCurve.name.equalsIgnoreCase(name) || 339 namedCurve.name().equalsIgnoreCase(name)) 340 { 341 return namedCurve; 342 } 343 } 344 345 return null; 346 } 347}