1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.security.ssl;
  27 
  28 import java.security.spec.ECParameterSpec;
  29 import java.security.spec.ECGenParameterSpec;
  30 import static sun.security.ssl.NamedGroupType.*;
  31 
  32 enum NamedGroup {
  33     // Elliptic Curves (RFC 4492)
  34     //
  35     // See sun.security.util.CurveDB for the OIDs
  36 
  37     // NIST K-163
  38     SECT163_K1(1, NAMED_GROUP_ECDHE, "sect163k1", "1.3.132.0.1", true),
  39 
  40     SECT163_R1(2, NAMED_GROUP_ECDHE, "sect163r1", "1.3.132.0.2", false),
  41 
  42     // NIST B-163
  43     SECT163_R2(3, NAMED_GROUP_ECDHE, "sect163r2", "1.3.132.0.15", true),
  44 
  45     SECT193_R1(4, NAMED_GROUP_ECDHE, "sect193r1", "1.3.132.0.24", false),
  46     SECT193_R2(5, NAMED_GROUP_ECDHE, "sect193r2", "1.3.132.0.25", false),
  47 
  48     // NIST K-233
  49     SECT233_K1(6, NAMED_GROUP_ECDHE, "sect233k1", "1.3.132.0.26", true),
  50 
  51     // NIST B-233
  52     SECT233_R1(7, NAMED_GROUP_ECDHE, "sect233r1", "1.3.132.0.27", true),
  53 
  54     SECT239_K1(8, NAMED_GROUP_ECDHE, "sect239k1", "1.3.132.0.3", false),
  55 
  56     // NIST K-283
  57     SECT283_K1(9, NAMED_GROUP_ECDHE, "sect283k1", "1.3.132.0.16", true),
  58 
  59     // NIST B-283
  60     SECT283_R1(10, NAMED_GROUP_ECDHE, "sect283r1", "1.3.132.0.17", true),
  61 
  62     // NIST K-409
  63     SECT409_K1(11, NAMED_GROUP_ECDHE, "sect409k1", "1.3.132.0.36", true),
  64 
  65     // NIST B-409
  66     SECT409_R1(12, NAMED_GROUP_ECDHE, "sect409r1", "1.3.132.0.37", true),
  67 
  68     // NIST K-571
  69     SECT571_K1(13, NAMED_GROUP_ECDHE, "sect571k1", "1.3.132.0.38", true),
  70 
  71     // NIST B-571
  72     SECT571_R1(14, NAMED_GROUP_ECDHE, "sect571r1", "1.3.132.0.39", true),
  73 
  74     SECP160_K1(15, NAMED_GROUP_ECDHE, "secp160k1", "1.3.132.0.9", false),
  75     SECP160_R1(16, NAMED_GROUP_ECDHE, "secp160r1", "1.3.132.0.8", false),
  76     SECP160_R2(17, NAMED_GROUP_ECDHE, "secp160r2", "1.3.132.0.30", false),
  77     SECP192_K1(18, NAMED_GROUP_ECDHE, "secp192k1", "1.3.132.0.31", false),
  78 
  79     // NIST P-192
  80     SECP192_R1(19, NAMED_GROUP_ECDHE, "secp192r1", "1.2.840.10045.3.1.1", true),
  81 
  82     SECP224_K1(20, NAMED_GROUP_ECDHE, "secp224k1", "1.3.132.0.32", false),
  83     // NIST P-224
  84     SECP224_R1(21, NAMED_GROUP_ECDHE, "secp224r1", "1.3.132.0.33", true),
  85 
  86     SECP256_K1(22, NAMED_GROUP_ECDHE, "secp256k1", "1.3.132.0.10", false),
  87 
  88     // NIST P-256
  89     SECP256_R1(23, NAMED_GROUP_ECDHE, "secp256r1", "1.2.840.10045.3.1.7", true),
  90 
  91     // NIST P-384
  92     SECP384_R1(24, NAMED_GROUP_ECDHE, "secp384r1", "1.3.132.0.34", true),
  93 
  94     // NIST P-521
  95     SECP521_R1(25, NAMED_GROUP_ECDHE, "secp521r1", "1.3.132.0.35", true),
  96 
  97     // Finite Field Diffie-Hellman Ephemeral Parameters (RFC 7919)
  98     FFDHE_2048(256, NAMED_GROUP_FFDHE, "ffdhe2048",  true),
  99     FFDHE_3072(257, NAMED_GROUP_FFDHE, "ffdhe3072",  true),
 100     FFDHE_4096(258, NAMED_GROUP_FFDHE, "ffdhe4096",  true),
 101     FFDHE_6144(259, NAMED_GROUP_FFDHE, "ffdhe6144",  true),
 102     FFDHE_8192(260, NAMED_GROUP_FFDHE, "ffdhe8192",  true);
 103 
 104     int             id;
 105     NamedGroupType  type;
 106     String          name;
 107     String          oid;
 108     String          algorithm;
 109     boolean         isFips;
 110 
 111     // Constructor used for Elliptic Curve Groups (ECDHE)
 112     NamedGroup(int id, NamedGroupType type,
 113                 String name, String oid, boolean isFips) {
 114         this.id = id;
 115         this.type = type;
 116         this.name = name;
 117         this.oid = oid;
 118         this.algorithm = "EC";
 119         this.isFips = isFips;
 120     }
 121 
 122     // Constructor used for Finite Field Diffie-Hellman Groups (FFDHE)
 123     NamedGroup(int id, NamedGroupType type, String name, boolean isFips) {
 124         this.id = id;
 125         this.type = type;
 126         this.name = name;
 127         this.oid = null;
 128         this.algorithm = "DiffieHellman";
 129         this.isFips = isFips;
 130     }
 131 
 132     static NamedGroup valueOf(int id) {
 133         for (NamedGroup group : NamedGroup.values()) {
 134             if (group.id == id) {
 135                 return group;
 136             }
 137         }
 138 
 139         return null;
 140     }
 141 
 142     static NamedGroup nameOf(String name) {
 143         for (NamedGroup group : NamedGroup.values()) {
 144             if (group.name.equals(name)) {
 145                 return group;
 146             }
 147         }
 148 
 149         return null;
 150     }
 151 
 152     static NamedGroup valueOf(ECParameterSpec params) {
 153         String oid = JsseJce.getNamedCurveOid(params);
 154         if ((oid != null) && (!oid.isEmpty())) {
 155             for (NamedGroup group : NamedGroup.values()) {
 156                 if (oid.equals(group.oid)) {
 157                     return group;
 158                 }
 159             }
 160         }
 161 
 162         return null;
 163     }
 164 
 165     @Override
 166     public String toString() {
 167         return this.name;
 168     }
 169 }