Blame SPECS/openssl-1.1.1-explicit-params.patch

Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/ec/ec_asn1.c.explicit-params openssl-1.1.1g/crypto/ec/ec_asn1.c
Packit Service dd46e1
--- openssl-1.1.1g/crypto/ec/ec_asn1.c.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/ec/ec_asn1.c	2020-10-23 15:27:31.304312344 +0200
Packit Service dd46e1
@@ -137,6 +137,12 @@ struct ec_parameters_st {
Packit Service dd46e1
     ASN1_INTEGER *cofactor;
Packit Service dd46e1
 } /* ECPARAMETERS */ ;
Packit Service dd46e1
 
Packit Service dd46e1
+typedef enum {
Packit Service dd46e1
+    ECPKPARAMETERS_TYPE_NAMED = 0,
Packit Service dd46e1
+    ECPKPARAMETERS_TYPE_EXPLICIT,
Packit Service dd46e1
+    ECPKPARAMETERS_TYPE_IMPLICIT
Packit Service dd46e1
+} ecpk_parameters_type_t;
Packit Service dd46e1
+
Packit Service dd46e1
 struct ecpk_parameters_st {
Packit Service dd46e1
     int type;
Packit Service dd46e1
     union {
Packit Service dd46e1
@@ -535,9 +541,10 @@ ECPKPARAMETERS *EC_GROUP_get_ecpkparamet
Packit Service dd46e1
             return NULL;
Packit Service dd46e1
         }
Packit Service dd46e1
     } else {
Packit Service dd46e1
-        if (ret->type == 0)
Packit Service dd46e1
+        if (ret->type == ECPKPARAMETERS_TYPE_NAMED)
Packit Service dd46e1
             ASN1_OBJECT_free(ret->value.named_curve);
Packit Service dd46e1
-        else if (ret->type == 1 && ret->value.parameters)
Packit Service dd46e1
+        else if (ret->type == ECPKPARAMETERS_TYPE_EXPLICIT
Packit Service dd46e1
+                 && ret->value.parameters != NULL)
Packit Service dd46e1
             ECPARAMETERS_free(ret->value.parameters);
Packit Service dd46e1
     }
Packit Service dd46e1
 
Packit Service dd46e1
@@ -547,7 +554,7 @@ ECPKPARAMETERS *EC_GROUP_get_ecpkparamet
Packit Service dd46e1
          */
Packit Service dd46e1
         tmp = EC_GROUP_get_curve_name(group);
Packit Service dd46e1
         if (tmp) {
Packit Service dd46e1
-            ret->type = 0;
Packit Service dd46e1
+            ret->type = ECPKPARAMETERS_TYPE_NAMED;
Packit Service dd46e1
             if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL)
Packit Service dd46e1
                 ok = 0;
Packit Service dd46e1
         } else
Packit Service dd46e1
@@ -555,7 +562,7 @@ ECPKPARAMETERS *EC_GROUP_get_ecpkparamet
Packit Service dd46e1
             ok = 0;
Packit Service dd46e1
     } else {
Packit Service dd46e1
         /* use the ECPARAMETERS structure */
Packit Service dd46e1
-        ret->type = 1;
Packit Service dd46e1
+        ret->type = ECPKPARAMETERS_TYPE_EXPLICIT;
Packit Service dd46e1
         if ((ret->value.parameters =
Packit Service dd46e1
              EC_GROUP_get_ecparameters(group, NULL)) == NULL)
Packit Service dd46e1
             ok = 0;
Packit Service dd46e1
@@ -894,7 +901,8 @@ EC_GROUP *EC_GROUP_new_from_ecpkparamete
Packit Service dd46e1
         return NULL;
Packit Service dd46e1
     }
Packit Service dd46e1
 
Packit Service dd46e1
-    if (params->type == 0) {    /* the curve is given by an OID */
Packit Service dd46e1
+    if (params->type == ECPKPARAMETERS_TYPE_NAMED) {
Packit Service dd46e1
+        /* the curve is given by an OID */
Packit Service dd46e1
         tmp = OBJ_obj2nid(params->value.named_curve);
Packit Service dd46e1
         if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL) {
Packit Service dd46e1
             ECerr(EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS,
Packit Service dd46e1
@@ -902,15 +910,16 @@ EC_GROUP *EC_GROUP_new_from_ecpkparamete
Packit Service dd46e1
             return NULL;
Packit Service dd46e1
         }
Packit Service dd46e1
         EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE);
Packit Service dd46e1
-    } else if (params->type == 1) { /* the parameters are given by a
Packit Service dd46e1
-                                     * ECPARAMETERS structure */
Packit Service dd46e1
+    } else if (params->type == ECPKPARAMETERS_TYPE_EXPLICIT) {
Packit Service dd46e1
+        /* the parameters are given by an ECPARAMETERS structure */
Packit Service dd46e1
         ret = EC_GROUP_new_from_ecparameters(params->value.parameters);
Packit Service dd46e1
         if (!ret) {
Packit Service dd46e1
             ECerr(EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS, ERR_R_EC_LIB);
Packit Service dd46e1
             return NULL;
Packit Service dd46e1
         }
Packit Service dd46e1
         EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_EXPLICIT_CURVE);
Packit Service dd46e1
-    } else if (params->type == 2) { /* implicitlyCA */
Packit Service dd46e1
+    } else if (params->type == ECPKPARAMETERS_TYPE_IMPLICIT) {
Packit Service dd46e1
+        /* implicit parameters inherited from CA - unsupported */
Packit Service dd46e1
         return NULL;
Packit Service dd46e1
     } else {
Packit Service dd46e1
         ECerr(EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS, EC_R_ASN1_ERROR);
Packit Service dd46e1
@@ -940,6 +949,9 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **
Packit Service dd46e1
         return NULL;
Packit Service dd46e1
     }
Packit Service dd46e1
 
Packit Service dd46e1
+    if (params->type == ECPKPARAMETERS_TYPE_EXPLICIT)
Packit Service dd46e1
+        group->decoded_from_explicit_params = 1;
Packit Service dd46e1
+
Packit Service dd46e1
     if (a) {
Packit Service dd46e1
         EC_GROUP_free(*a);
Packit Service dd46e1
         *a = group;
Packit Service dd46e1
@@ -991,6 +1003,9 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, con
Packit Service dd46e1
     if (priv_key->parameters) {
Packit Service dd46e1
         EC_GROUP_free(ret->group);
Packit Service dd46e1
         ret->group = EC_GROUP_new_from_ecpkparameters(priv_key->parameters);
Packit Service dd46e1
+        if (ret->group != NULL
Packit Service dd46e1
+            && priv_key->parameters->type == ECPKPARAMETERS_TYPE_EXPLICIT)
Packit Service dd46e1
+            ret->group->decoded_from_explicit_params = 1;
Packit Service dd46e1
     }
Packit Service dd46e1
 
Packit Service dd46e1
     if (ret->group == NULL) {
Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/ec/ec_key.c.explicit-params openssl-1.1.1g/crypto/ec/ec_key.c
Packit Service dd46e1
--- openssl-1.1.1g/crypto/ec/ec_key.c.explicit-params	2020-10-23 15:27:31.296312275 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/ec/ec_key.c	2020-10-23 15:27:31.304312344 +0200
Packit Service dd46e1
@@ -566,6 +566,13 @@ void EC_KEY_clear_flags(EC_KEY *key, int
Packit Service dd46e1
     key->flags &= ~flags;
Packit Service dd46e1
 }
Packit Service dd46e1
 
Packit Service dd46e1
+int EC_KEY_decoded_from_explicit_params(const EC_KEY *key)
Packit Service dd46e1
+{
Packit Service dd46e1
+    if (key == NULL || key->group == NULL)
Packit Service dd46e1
+        return -1;
Packit Service dd46e1
+    return key->group->decoded_from_explicit_params;
Packit Service dd46e1
+}
Packit Service dd46e1
+
Packit Service dd46e1
 size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form,
Packit Service dd46e1
                         unsigned char **pbuf, BN_CTX *ctx)
Packit Service dd46e1
 {
Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/ec/ec_lib.c.explicit-params openssl-1.1.1g/crypto/ec/ec_lib.c
Packit Service dd46e1
--- openssl-1.1.1g/crypto/ec/ec_lib.c.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/ec/ec_lib.c	2020-10-23 15:27:31.304312344 +0200
Packit Service dd46e1
@@ -211,6 +211,7 @@ int EC_GROUP_copy(EC_GROUP *dest, const
Packit Service dd46e1
 
Packit Service dd46e1
     dest->asn1_flag = src->asn1_flag;
Packit Service dd46e1
     dest->asn1_form = src->asn1_form;
Packit Service dd46e1
+    dest->decoded_from_explicit_params = src->decoded_from_explicit_params;
Packit Service dd46e1
 
Packit Service dd46e1
     if (src->seed) {
Packit Service dd46e1
         OPENSSL_free(dest->seed);
Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/ec/ec_local.h.explicit-params openssl-1.1.1g/crypto/ec/ec_local.h
Packit Service dd46e1
--- openssl-1.1.1g/crypto/ec/ec_local.h.explicit-params	2020-10-23 15:27:31.281312147 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/ec/ec_local.h	2020-10-23 15:27:31.304312344 +0200
Packit Service dd46e1
@@ -217,6 +217,8 @@ struct ec_group_st {
Packit Service dd46e1
     BIGNUM *order, *cofactor;
Packit Service dd46e1
     int curve_name;             /* optional NID for named curve */
Packit Service dd46e1
     int asn1_flag;              /* flag to control the asn1 encoding */
Packit Service dd46e1
+    int decoded_from_explicit_params; /* set if decoded from explicit
Packit Service dd46e1
+                                       * curve parameters encoding */
Packit Service dd46e1
     point_conversion_form_t asn1_form;
Packit Service dd46e1
     unsigned char *seed;        /* optional seed for parameters (appears in
Packit Service dd46e1
                                  * ASN1) */
Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/x509/x509_txt.c.explicit-params openssl-1.1.1g/crypto/x509/x509_txt.c
Packit Service dd46e1
--- openssl-1.1.1g/crypto/x509/x509_txt.c.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/x509/x509_txt.c	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -174,6 +174,8 @@ const char *X509_verify_cert_error_strin
Packit Service dd46e1
         return "OCSP verification failed";
Packit Service dd46e1
     case X509_V_ERR_OCSP_CERT_UNKNOWN:
Packit Service dd46e1
         return "OCSP unknown cert";
Packit Service dd46e1
+    case X509_V_ERR_EC_KEY_EXPLICIT_PARAMS:
Packit Service dd46e1
+        return "Certificate public key has explicit ECC parameters";
Packit Service dd46e1
 
Packit Service dd46e1
     default:
Packit Service dd46e1
         /* Printing an error number into a static buffer is not thread-safe */
Packit Service dd46e1
diff -up openssl-1.1.1g/crypto/x509/x509_vfy.c.explicit-params openssl-1.1.1g/crypto/x509/x509_vfy.c
Packit Service dd46e1
--- openssl-1.1.1g/crypto/x509/x509_vfy.c.explicit-params	2020-10-23 15:27:31.252311900 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/crypto/x509/x509_vfy.c	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -80,6 +80,7 @@ static int get_issuer_sk(X509 **issuer,
Packit Service dd46e1
 static int check_dane_issuer(X509_STORE_CTX *ctx, int depth);
Packit Service dd46e1
 static int check_key_level(X509_STORE_CTX *ctx, X509 *cert);
Packit Service dd46e1
 static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert);
Packit Service dd46e1
+static int check_curve(X509 *cert);
Packit Service dd46e1
 
Packit Service dd46e1
 static int get_crl_score(X509_STORE_CTX *ctx, X509 **pissuer,
Packit Service dd46e1
                          unsigned int *preasons, X509_CRL *crl, X509 *x);
Packit Service dd46e1
@@ -508,6 +509,14 @@ static int check_chain_extensions(X509_S
Packit Service dd46e1
                 ret = 1;
Packit Service dd46e1
             break;
Packit Service dd46e1
         }
Packit Service dd46e1
+        if ((ctx->param->flags & X509_V_FLAG_X509_STRICT) && num > 1) {
Packit Service dd46e1
+            /* Check for presence of explicit elliptic curve parameters */
Packit Service dd46e1
+            ret = check_curve(x);
Packit Service dd46e1
+            if (ret < 0)
Packit Service dd46e1
+                ctx->error = X509_V_ERR_UNSPECIFIED;
Packit Service dd46e1
+            else if (ret == 0)
Packit Service dd46e1
+                ctx->error = X509_V_ERR_EC_KEY_EXPLICIT_PARAMS;
Packit Service dd46e1
+        }
Packit Service dd46e1
         if ((x->ex_flags & EXFLAG_CA) == 0
Packit Service dd46e1
             && x->ex_pathlen != -1
Packit Service dd46e1
             && (ctx->param->flags & X509_V_FLAG_X509_STRICT)) {
Packit Service dd46e1
@@ -3259,6 +3268,32 @@ static int check_key_level(X509_STORE_CT
Packit Service dd46e1
 }
Packit Service dd46e1
 
Packit Service dd46e1
 /*
Packit Service dd46e1
+ * Check whether the public key of ``cert`` does not use explicit params
Packit Service dd46e1
+ * for an elliptic curve.
Packit Service dd46e1
+ *
Packit Service dd46e1
+ * Returns 1 on success, 0 if check fails, -1 for other errors.
Packit Service dd46e1
+ */
Packit Service dd46e1
+static int check_curve(X509 *cert)
Packit Service dd46e1
+{
Packit Service dd46e1
+#ifndef OPENSSL_NO_EC
Packit Service dd46e1
+    EVP_PKEY *pkey = X509_get0_pubkey(cert);
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Unsupported or malformed key */
Packit Service dd46e1
+    if (pkey == NULL)
Packit Service dd46e1
+        return -1;
Packit Service dd46e1
+
Packit Service dd46e1
+    if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
Packit Service dd46e1
+        int ret;
Packit Service dd46e1
+
Packit Service dd46e1
+        ret = EC_KEY_decoded_from_explicit_params(EVP_PKEY_get0_EC_KEY(pkey));
Packit Service dd46e1
+        return ret < 0 ? ret : !ret;
Packit Service dd46e1
+    }
Packit Service dd46e1
+#endif
Packit Service dd46e1
+
Packit Service dd46e1
+    return 1;
Packit Service dd46e1
+}
Packit Service dd46e1
+
Packit Service dd46e1
+/*
Packit Service dd46e1
  * Check whether the signature digest algorithm of ``cert`` meets the security
Packit Service dd46e1
  * level of ``ctx``.  Should not be checked for trust anchors (whether
Packit Service dd46e1
  * self-signed or otherwise).
Packit Service dd46e1
diff -up openssl-1.1.1g/doc/man3/EC_KEY_new.pod.explicit-params openssl-1.1.1g/doc/man3/EC_KEY_new.pod
Packit Service dd46e1
--- openssl-1.1.1g/doc/man3/EC_KEY_new.pod.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/doc/man3/EC_KEY_new.pod	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -9,7 +9,8 @@ EC_KEY_get0_engine,
Packit Service dd46e1
 EC_KEY_get0_group, EC_KEY_set_group, EC_KEY_get0_private_key,
Packit Service dd46e1
 EC_KEY_set_private_key, EC_KEY_get0_public_key, EC_KEY_set_public_key,
Packit Service dd46e1
 EC_KEY_get_conv_form,
Packit Service dd46e1
-EC_KEY_set_conv_form, EC_KEY_set_asn1_flag, EC_KEY_precompute_mult,
Packit Service dd46e1
+EC_KEY_set_conv_form, EC_KEY_set_asn1_flag,
Packit Service dd46e1
+EC_KEY_decoded_from_explicit_params, EC_KEY_precompute_mult,
Packit Service dd46e1
 EC_KEY_generate_key, EC_KEY_check_key, EC_KEY_set_public_key_affine_coordinates,
Packit Service dd46e1
 EC_KEY_oct2key, EC_KEY_key2buf, EC_KEY_oct2priv, EC_KEY_priv2oct,
Packit Service dd46e1
 EC_KEY_priv2buf - Functions for creating, destroying and manipulating
Packit Service dd46e1
@@ -38,6 +39,7 @@ EC_KEY objects
Packit Service dd46e1
  point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *key);
Packit Service dd46e1
  void EC_KEY_set_conv_form(EC_KEY *eckey, point_conversion_form_t cform);
Packit Service dd46e1
  void EC_KEY_set_asn1_flag(EC_KEY *eckey, int asn1_flag);
Packit Service dd46e1
+ int EC_KEY_decoded_from_explicit_params(const EC_KEY *key);
Packit Service dd46e1
  int EC_KEY_precompute_mult(EC_KEY *key, BN_CTX *ctx);
Packit Service dd46e1
  int EC_KEY_generate_key(EC_KEY *key);
Packit Service dd46e1
  int EC_KEY_check_key(const EC_KEY *key);
Packit Service dd46e1
@@ -118,6 +120,10 @@ EC_KEY_set_asn1_flag() sets the asn1_fla
Packit Service dd46e1
 (if set). Refer to L<EC_GROUP_copy(3)> for further information on the
Packit Service dd46e1
 asn1_flag.
Packit Service dd46e1
 
Packit Service dd46e1
+EC_KEY_decoded_from_explicit_params() returns 1 if the group of the I<key> was
Packit Service dd46e1
+decoded from data with explicitly encoded group parameters, -1 if the I<key>
Packit Service dd46e1
+is NULL or the group parameters are missing, and 0 otherwise.
Packit Service dd46e1
+
Packit Service dd46e1
 EC_KEY_precompute_mult() stores multiples of the underlying EC_GROUP generator
Packit Service dd46e1
 for faster point multiplication. See also L<EC_POINT_add(3)>.
Packit Service dd46e1
 
Packit Service dd46e1
diff -up openssl-1.1.1g/include/openssl/ec.h.explicit-params openssl-1.1.1g/include/openssl/ec.h
Packit Service dd46e1
--- openssl-1.1.1g/include/openssl/ec.h.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/include/openssl/ec.h	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -829,6 +829,8 @@ void EC_KEY_set_flags(EC_KEY *key, int f
Packit Service dd46e1
 
Packit Service dd46e1
 void EC_KEY_clear_flags(EC_KEY *key, int flags);
Packit Service dd46e1
 
Packit Service dd46e1
+int EC_KEY_decoded_from_explicit_params(const EC_KEY *key);
Packit Service dd46e1
+
Packit Service dd46e1
 /** Creates a new EC_KEY object using a named curve as underlying
Packit Service dd46e1
  *  EC_GROUP object.
Packit Service dd46e1
  *  \param  nid  NID of the named curve.
Packit Service dd46e1
diff -up openssl-1.1.1g/include/openssl/x509_vfy.h.explicit-params openssl-1.1.1g/include/openssl/x509_vfy.h
Packit Service dd46e1
--- openssl-1.1.1g/include/openssl/x509_vfy.h.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/include/openssl/x509_vfy.h	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -184,6 +184,7 @@ void X509_STORE_CTX_set_depth(X509_STORE
Packit Service dd46e1
 # define         X509_V_ERR_OCSP_VERIFY_NEEDED                   73  /* Need OCSP verification */
Packit Service dd46e1
 # define         X509_V_ERR_OCSP_VERIFY_FAILED                   74  /* Couldn't verify cert through OCSP */
Packit Service dd46e1
 # define         X509_V_ERR_OCSP_CERT_UNKNOWN                    75  /* Certificate wasn't recognized by the OCSP responder */
Packit Service dd46e1
+# define         X509_V_ERR_EC_KEY_EXPLICIT_PARAMS               79
Packit Service dd46e1
 
Packit Service dd46e1
 /* Certificate verify flags */
Packit Service dd46e1
 
Packit Service dd46e1
diff -up openssl-1.1.1g/ssl/statem/statem_lib.c.explicit-params openssl-1.1.1g/ssl/statem/statem_lib.c
Packit Service dd46e1
--- openssl-1.1.1g/ssl/statem/statem_lib.c.explicit-params	2020-10-23 15:27:31.249311874 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/ssl/statem/statem_lib.c	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -1341,6 +1341,7 @@ int tls_get_message_body(SSL *s, size_t
Packit Service dd46e1
 static const X509ERR2ALERT x509table[] = {
Packit Service dd46e1
     {X509_V_ERR_APPLICATION_VERIFICATION, SSL_AD_HANDSHAKE_FAILURE},
Packit Service dd46e1
     {X509_V_ERR_CA_KEY_TOO_SMALL, SSL_AD_BAD_CERTIFICATE},
Packit Service dd46e1
+    {X509_V_ERR_EC_KEY_EXPLICIT_PARAMS, SSL_AD_BAD_CERTIFICATE},
Packit Service dd46e1
     {X509_V_ERR_CA_MD_TOO_WEAK, SSL_AD_BAD_CERTIFICATE},
Packit Service dd46e1
     {X509_V_ERR_CERT_CHAIN_TOO_LONG, SSL_AD_UNKNOWN_CA},
Packit Service dd46e1
     {X509_V_ERR_CERT_HAS_EXPIRED, SSL_AD_CERTIFICATE_EXPIRED},
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ca-cert-ec-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ca-cert-ec-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ca-cert-ec-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ca-cert-ec-explicit.pem	2020-10-23 15:27:31.305312352 +0200
Packit Service dd46e1
@@ -0,0 +1,19 @@
Packit Service dd46e1
+-----BEGIN CERTIFICATE-----
Packit Service dd46e1
+MIIDGDCCAgCgAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290
Packit Service dd46e1
+IENBMCAXDTIwMDkxNTEzMDY0MVoYDzIxMjAwOTE2MTMwNjQxWjANMQswCQYDVQQD
Packit Service dd46e1
+DAJDQTCCAUswggEDBgcqhkjOPQIBMIH3AgEBMCwGByqGSM49AQECIQD/////AAAA
Packit Service dd46e1
+AQAAAAAAAAAAAAAAAP///////////////zBbBCD/////AAAAAQAAAAAAAAAAAAAA
Packit Service dd46e1
+AP///////////////AQgWsY12Ko6k+ez671VdpiGvGUdBrDMU7D2O848PifSYEsD
Packit Service dd46e1
+FQDEnTYIhucEk2pmeOETnSa3gZ9+kARBBGsX0fLhLEJH+Lzm5WOkQPJ3A32BLesz
Packit Service dd46e1
+oPShOUXYmMKWT+NC4v4af5uO5+tKfA+eFivOM1drMV7Oy7ZAaDe/UfUCIQD/////
Packit Service dd46e1
+AAAAAP//////////vOb6racXnoTzucrC/GMlUQIBAQNCAASlXna3kSD/Yol3RA5I
Packit Service dd46e1
+icjIxYb9UJoCTzb/LsxjlOvIS5OqCTzpqP0p3JrnvLPsbzq7Cf/g0bNlxAGs1iVM
Packit Service dd46e1
+5NDco1MwUTAdBgNVHQ4EFgQUFk6ucH6gMXeadmuV7a1iWEnU/CIwHwYDVR0jBBgw
Packit Service dd46e1
+FoAUjvUlrx6ba4Q9fICayVOcTXL3o1IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
Packit Service dd46e1
+9w0BAQsFAAOCAQEAdyUgfT0eAsZzoHFXoWN5uqi0MHuhLI37TEzkH5h7iTpDQJTQ
Packit Service dd46e1
+F0SjbawfM/nxxUekRW3mjFu3lft+VA7yC0OTNBLffan/vTh+HGOvvYZSMJYgKrMG
Packit Service dd46e1
+PRWgDId+n9RTcQCf+91cISvOazHixRiJG7JfRLdNZsAE+miw4HgPLFboTwpxtTDJ
Packit Service dd46e1
+zJ4ssBC6P+5IHwBCtNMiilJMMMzuSaZa5iSo6M9AdXWfcQN3uhW1lgQOLOlKLcbo
Packit Service dd46e1
+3UhW1GMMhTTeytM5aylbKhRsnL7ozmS44zsKZ25YaQxgjdKitFjVN6j7eyQ7C9J2
Packit Service dd46e1
+bLXgl3APweLQbGGs0zv08Ad0SCCKYLHK6mMJqg==
Packit Service dd46e1
+-----END CERTIFICATE-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ca-cert-ec-named.pem.explicit-params openssl-1.1.1g/test/certs/ca-cert-ec-named.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ca-cert-ec-named.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ca-cert-ec-named.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,14 @@
Packit Service dd46e1
+-----BEGIN CERTIFICATE-----
Packit Service dd46e1
+MIICJDCCAQygAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdSb290
Packit Service dd46e1
+IENBMCAXDTIwMDkxNTEzMDY1MFoYDzIxMjAwOTE2MTMwNjUwWjANMQswCQYDVQQD
Packit Service dd46e1
+DAJDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPt+MXCi9+wztEvmdG2EVSk7
Packit Service dd46e1
+bAiJMXJXW/u0NbcGCrrbhO1NJSHHV3Lks888sqeSPh/bif/ASJ0HX+VarMUoFIKj
Packit Service dd46e1
+UzBRMB0GA1UdDgQWBBRjigU5REz8Lwf1iD6mALVhsHIanjAfBgNVHSMEGDAWgBSO
Packit Service dd46e1
+9SWvHptrhD18gJrJU5xNcvejUjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
Packit Service dd46e1
+CwUAA4IBAQCQs9wpblefb2C9a7usGL1DJjWJQIFHtUf+6p/KPgEV7LF138ECjL5s
Packit Service dd46e1
+0AWRd8Q8SbsBH49j2r3LLLMkvFglyRaN+FF+TCC/UQtclTb4+HgLsUT2xSU8U2cY
Packit Service dd46e1
+SOnzNB5AX/qAAsdOGqOjivPtGXcXFexDKPsw3n+3rJgymBP6hbLagb47IabNhot5
Packit Service dd46e1
+bMM6S+bmfpMwfsm885zr5vG2Gg9FjjH94Vx4I7eRLkjCS88gkIR1J35ecHFteOdo
Packit Service dd46e1
+idOaCHQddYiKukBzgdjtTxSDXKffkaybylrwOZ8VBlQd3zC7s02d+riHCnroLnnE
Packit Service dd46e1
+cwYLlJ5z6jN7zoPZ55yX/EmA0RVny2le
Packit Service dd46e1
+-----END CERTIFICATE-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ca-key-ec-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ca-key-ec-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ca-key-ec-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ca-key-ec-explicit.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,10 @@
Packit Service dd46e1
+-----BEGIN PRIVATE KEY-----
Packit Service dd46e1
+MIIBeQIBADCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAAB
Packit Service dd46e1
+AAAAAAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA
Packit Service dd46e1
+///////////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMV
Packit Service dd46e1
+AMSdNgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg
Packit Service dd46e1
+9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8A
Packit Service dd46e1
+AAAA//////////+85vqtpxeehPO5ysL8YyVRAgEBBG0wawIBAQQgdEf20fpuqEZU
Packit Service dd46e1
+tZ4ORoq4vb5ETV4a6QOl/iGnDQt++/ihRANCAASlXna3kSD/Yol3RA5IicjIxYb9
Packit Service dd46e1
+UJoCTzb/LsxjlOvIS5OqCTzpqP0p3JrnvLPsbzq7Cf/g0bNlxAGs1iVM5NDc
Packit Service dd46e1
+-----END PRIVATE KEY-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ca-key-ec-named.pem.explicit-params openssl-1.1.1g/test/certs/ca-key-ec-named.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ca-key-ec-named.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ca-key-ec-named.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,5 @@
Packit Service dd46e1
+-----BEGIN PRIVATE KEY-----
Packit Service dd46e1
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCTrYrMKcyV49+w4B
Packit Service dd46e1
+TWr2WTZsMM4aFpaYulKAuhiuQ7mhRANCAAT7fjFwovfsM7RL5nRthFUpO2wIiTFy
Packit Service dd46e1
+V1v7tDW3Bgq624TtTSUhx1dy5LPPPLKnkj4f24n/wEidB1/lWqzFKBSC
Packit Service dd46e1
+-----END PRIVATE KEY-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-cert-ec-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ee-cert-ec-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-cert-ec-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-cert-ec-explicit.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,16 @@
Packit Service dd46e1
+-----BEGIN CERTIFICATE-----
Packit Service dd46e1
+MIIChzCCAi6gAwIBAgIBAjAKBggqhkjOPQQDAjANMQswCQYDVQQDDAJDQTAgFw0y
Packit Service dd46e1
+MDA5MTUxMzE0MzlaGA8yMTIwMDkxNjEzMTQzOVowGTEXMBUGA1UEAwwOc2VydmVy
Packit Service dd46e1
+LmV4YW1wbGUwggFLMIIBAwYHKoZIzj0CATCB9wIBATAsBgcqhkjOPQEBAiEA////
Packit Service dd46e1
+/wAAAAEAAAAAAAAAAAAAAAD///////////////8wWwQg/////wAAAAEAAAAAAAAA
Packit Service dd46e1
+AAAAAAD///////////////wEIFrGNdiqOpPns+u9VXaYhrxlHQawzFOw9jvOPD4n
Packit Service dd46e1
+0mBLAxUAxJ02CIbnBJNqZnjhE50mt4GffpAEQQRrF9Hy4SxCR/i85uVjpEDydwN9
Packit Service dd46e1
+gS3rM6D0oTlF2JjClk/jQuL+Gn+bjufrSnwPnhYrzjNXazFezsu2QGg3v1H1AiEA
Packit Service dd46e1
+/////wAAAAD//////////7zm+q2nF56E87nKwvxjJVECAQEDQgAE+7TDP7C9VqQP
Packit Service dd46e1
+TnqoJc/Fvf/N45BX+lBfmfiGBeRKtSsvrERUlymzQ4/nxVtymozAgFxQ0my998HH
Packit Service dd46e1
+TSVCj7Sq56N9MHswHQYDVR0OBBYEFKKwEfKYhNv6fbQf0Xd0te7J3GZdMB8GA1Ud
Packit Service dd46e1
+IwQYMBaAFGOKBTlETPwvB/WIPqYAtWGwchqeMAkGA1UdEwQCMAAwEwYDVR0lBAww
Packit Service dd46e1
+CgYIKwYBBQUHAwEwGQYDVR0RBBIwEIIOc2VydmVyLmV4YW1wbGUwCgYIKoZIzj0E
Packit Service dd46e1
+AwIDRwAwRAIgb4UITAOFlATeaayWQX9r5gf61qcnzT7TjXCekf7ww9oCIBDltg/u
Packit Service dd46e1
+ZvS9gqviMFuPjTuk/FhsCTAUzTT7WmgcWeH7
Packit Service dd46e1
+-----END CERTIFICATE-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-cert-ec-named-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ee-cert-ec-named-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-cert-ec-named-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-cert-ec-named-explicit.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,11 @@
Packit Service dd46e1
+-----BEGIN CERTIFICATE-----
Packit Service dd46e1
+MIIBlDCCATqgAwIBAgIBAjAKBggqhkjOPQQDAjANMQswCQYDVQQDDAJDQTAgFw0y
Packit Service dd46e1
+MDA5MTUxMzE0NDVaGA8yMTIwMDkxNjEzMTQ0NVowGTEXMBUGA1UEAwwOc2VydmVy
Packit Service dd46e1
+LmV4YW1wbGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQv5PnMStW/Wx9lpvjl
Packit Service dd46e1
+JTsFIjc2wBv14sNuMh1hfNX8ZJcoCfAAKYu6ujxXt328GWBMaubRbBjOd/eqpEst
Packit Service dd46e1
+tYKzo30wezAdBgNVHQ4EFgQUmb/qcE413hkpmtjEMyRZZFcN1TYwHwYDVR0jBBgw
Packit Service dd46e1
+FoAUFk6ucH6gMXeadmuV7a1iWEnU/CIwCQYDVR0TBAIwADATBgNVHSUEDDAKBggr
Packit Service dd46e1
+BgEFBQcDATAZBgNVHREEEjAQgg5zZXJ2ZXIuZXhhbXBsZTAKBggqhkjOPQQDAgNI
Packit Service dd46e1
+ADBFAiEA9y6J8rdAbO0mDZscIb8rIn6HgxBW4WAqTlFeZeHjjOYCIAmt2ldyObOL
Packit Service dd46e1
+tXaiaxYX3WAOR1vmfzsdrkCAOCfAkpbo
Packit Service dd46e1
+-----END CERTIFICATE-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-cert-ec-named-named.pem.explicit-params openssl-1.1.1g/test/certs/ee-cert-ec-named-named.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-cert-ec-named-named.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-cert-ec-named-named.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,11 @@
Packit Service dd46e1
+-----BEGIN CERTIFICATE-----
Packit Service dd46e1
+MIIBkzCCATqgAwIBAgIBAjAKBggqhkjOPQQDAjANMQswCQYDVQQDDAJDQTAgFw0y
Packit Service dd46e1
+MDA5MTUxNDEwNDhaGA8yMTIwMDkxNjE0MTA0OFowGTEXMBUGA1UEAwwOc2VydmVy
Packit Service dd46e1
+LmV4YW1wbGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS0YU57+RFRWxr/frnL
Packit Service dd46e1
++vOYkY3h9roKnvxCG07wK5tevEYtSdKz0KsHvDBDatw1r3JNv+m2p54/3AqFPAZ3
Packit Service dd46e1
+5b0Po30wezAdBgNVHQ4EFgQUypypuZrUl0BEmbuhfJpo3QFNIvUwHwYDVR0jBBgw
Packit Service dd46e1
+FoAUY4oFOURM/C8H9Yg+pgC1YbByGp4wCQYDVR0TBAIwADATBgNVHSUEDDAKBggr
Packit Service dd46e1
+BgEFBQcDATAZBgNVHREEEjAQgg5zZXJ2ZXIuZXhhbXBsZTAKBggqhkjOPQQDAgNH
Packit Service dd46e1
+ADBEAiAEkKD7H5uxQ4YbQOiN4evbu5RCV5W7TVE80iBfcY5u4wIgGcwr++lVNX0Q
Packit Service dd46e1
+CTT+M3ukDjOA8OEvKUz1TiDuRAQ29qU=
Packit Service dd46e1
+-----END CERTIFICATE-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-key-ec-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ee-key-ec-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-key-ec-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-key-ec-explicit.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,10 @@
Packit Service dd46e1
+-----BEGIN PRIVATE KEY-----
Packit Service dd46e1
+MIIBeQIBADCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAAB
Packit Service dd46e1
+AAAAAAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA
Packit Service dd46e1
+///////////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMV
Packit Service dd46e1
+AMSdNgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg
Packit Service dd46e1
+9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8A
Packit Service dd46e1
+AAAA//////////+85vqtpxeehPO5ysL8YyVRAgEBBG0wawIBAQQg0cmpcTcEYG5G
Packit Service dd46e1
+ZaVkGjtsBc3sLZn1EuV9qNK2qx6iNzmhRANCAAT7tMM/sL1WpA9Oeqglz8W9/83j
Packit Service dd46e1
+kFf6UF+Z+IYF5Eq1Ky+sRFSXKbNDj+fFW3KajMCAXFDSbL33wcdNJUKPtKrn
Packit Service dd46e1
+-----END PRIVATE KEY-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-key-ec-named-explicit.pem.explicit-params openssl-1.1.1g/test/certs/ee-key-ec-named-explicit.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-key-ec-named-explicit.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-key-ec-named-explicit.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,5 @@
Packit Service dd46e1
+-----BEGIN PRIVATE KEY-----
Packit Service dd46e1
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg2ue+X5ZFJPJPQG2E
Packit Service dd46e1
+WQY4ALv2PkPp2Gy6KrMiokgmjkehRANCAAQv5PnMStW/Wx9lpvjlJTsFIjc2wBv1
Packit Service dd46e1
+4sNuMh1hfNX8ZJcoCfAAKYu6ujxXt328GWBMaubRbBjOd/eqpEsttYKz
Packit Service dd46e1
+-----END PRIVATE KEY-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/ee-key-ec-named-named.pem.explicit-params openssl-1.1.1g/test/certs/ee-key-ec-named-named.pem
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/ee-key-ec-named-named.pem.explicit-params	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/ee-key-ec-named-named.pem	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -0,0 +1,5 @@
Packit Service dd46e1
+-----BEGIN PRIVATE KEY-----
Packit Service dd46e1
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgGSoneIKG3//ujXGu
Packit Service dd46e1
+/EoJdNhpKZj026EF/YQ5FblUBWahRANCAAS0YU57+RFRWxr/frnL+vOYkY3h9roK
Packit Service dd46e1
+nvxCG07wK5tevEYtSdKz0KsHvDBDatw1r3JNv+m2p54/3AqFPAZ35b0P
Packit Service dd46e1
+-----END PRIVATE KEY-----
Packit Service dd46e1
diff -up openssl-1.1.1g/test/certs/setup.sh.explicit-params openssl-1.1.1g/test/certs/setup.sh
Packit Service dd46e1
--- openssl-1.1.1g/test/certs/setup.sh.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/certs/setup.sh	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -116,6 +116,10 @@ openssl x509 -in ca-cert-md5.pem -trusto
Packit Service dd46e1
 # CA has 768-bit key
Packit Service dd46e1
 OPENSSL_KEYBITS=768 \
Packit Service dd46e1
 ./mkcert.sh genca "CA" ca-key-768 ca-cert-768 root-key root-cert
Packit Service dd46e1
+# EC cert with explicit curve
Packit Service dd46e1
+./mkcert.sh genca "CA" ca-key-ec-explicit ca-cert-ec-explicit root-key root-cert
Packit Service dd46e1
+# EC cert with named curve
Packit Service dd46e1
+./mkcert.sh genca "CA" ca-key-ec-named ca-cert-ec-named root-key root-cert
Packit Service dd46e1
 
Packit Service dd46e1
 # client intermediate ca: cca-cert
Packit Service dd46e1
 # trust variants: +serverAuth, -serverAuth, +clientAuth, -clientAuth
Packit Service dd46e1
@@ -184,6 +188,14 @@ OPENSSL_SIGALG=md5 \
Packit Service dd46e1
 # 768-bit leaf key
Packit Service dd46e1
 OPENSSL_KEYBITS=768 \
Packit Service dd46e1
 ./mkcert.sh genee server.example ee-key-768 ee-cert-768 ca-key ca-cert
Packit Service dd46e1
+# EC cert with explicit curve signed by named curve ca
Packit Service dd46e1
+./mkcert.sh genee server.example ee-key-ec-explicit ee-cert-ec-explicit ca-key-ec-named ca-cert-ec-named
Packit Service dd46e1
+# EC cert with named curve signed by explicit curve ca
Packit Service dd46e1
+./mkcert.sh genee server.example ee-key-ec-named-explicit \
Packit Service dd46e1
+    ee-cert-ec-named-explicit ca-key-ec-explicit ca-cert-ec-explicit
Packit Service dd46e1
+# EC cert with named curve signed by named curve ca
Packit Service dd46e1
+./mkcert.sh genee server.example ee-key-ec-named-named \
Packit Service dd46e1
+    ee-cert-ec-named-named ca-key-ec-named ca-cert-ec-named
Packit Service dd46e1
 
Packit Service dd46e1
 # Proxy certificates, off of ee-client
Packit Service dd46e1
 # Start with some good ones
Packit Service dd46e1
diff -up openssl-1.1.1g/test/ec_internal_test.c.explicit-params openssl-1.1.1g/test/ec_internal_test.c
Packit Service dd46e1
--- openssl-1.1.1g/test/ec_internal_test.c.explicit-params	2020-04-21 14:22:39.000000000 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/ec_internal_test.c	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -183,6 +183,106 @@ static int field_tests_default(int n)
Packit Service dd46e1
     return ret;
Packit Service dd46e1
 }
Packit Service dd46e1
 
Packit Service dd46e1
+/*
Packit Service dd46e1
+ * Tests behavior of the decoded_from_explicit_params flag and API
Packit Service dd46e1
+ */
Packit Service dd46e1
+static int decoded_flag_test(void)
Packit Service dd46e1
+{
Packit Service dd46e1
+    EC_GROUP *grp;
Packit Service dd46e1
+    EC_GROUP *grp_copy = NULL;
Packit Service dd46e1
+    ECPARAMETERS *ecparams = NULL;
Packit Service dd46e1
+    ECPKPARAMETERS *ecpkparams = NULL;
Packit Service dd46e1
+    EC_KEY *key = NULL;
Packit Service dd46e1
+    unsigned char *encodedparams = NULL;
Packit Service dd46e1
+    const unsigned char *encp;
Packit Service dd46e1
+    int encodedlen;
Packit Service dd46e1
+    int testresult = 0;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test EC_GROUP_new not setting the flag */
Packit Service dd46e1
+    grp = EC_GROUP_new(EC_GFp_simple_method());
Packit Service dd46e1
+    if (!TEST_ptr(grp)
Packit Service dd46e1
+        || !TEST_int_eq(grp->decoded_from_explicit_params, 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+    EC_GROUP_free(grp);
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test EC_GROUP_new_by_curve_name not setting the flag */
Packit Service dd46e1
+    grp = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
Packit Service dd46e1
+    if (!TEST_ptr(grp)
Packit Service dd46e1
+        || !TEST_int_eq(grp->decoded_from_explicit_params, 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test EC_GROUP_new_from_ecparameters not setting the flag */
Packit Service dd46e1
+    if (!TEST_ptr(ecparams = EC_GROUP_get_ecparameters(grp, NULL))
Packit Service dd46e1
+        || !TEST_ptr(grp_copy = EC_GROUP_new_from_ecparameters(ecparams))
Packit Service dd46e1
+        || !TEST_int_eq(grp_copy->decoded_from_explicit_params, 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+    EC_GROUP_free(grp_copy);
Packit Service dd46e1
+    grp_copy = NULL;
Packit Service dd46e1
+    ECPARAMETERS_free(ecparams);
Packit Service dd46e1
+    ecparams = NULL;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test EC_GROUP_new_from_ecpkparameters not setting the flag */
Packit Service dd46e1
+    if (!TEST_int_eq(EC_GROUP_get_asn1_flag(grp), OPENSSL_EC_NAMED_CURVE)
Packit Service dd46e1
+        || !TEST_ptr(ecpkparams = EC_GROUP_get_ecpkparameters(grp, NULL))
Packit Service dd46e1
+        || !TEST_ptr(grp_copy = EC_GROUP_new_from_ecpkparameters(ecpkparams))
Packit Service dd46e1
+        || !TEST_int_eq(grp_copy->decoded_from_explicit_params, 0)
Packit Service dd46e1
+        || !TEST_ptr(key = EC_KEY_new())
Packit Service dd46e1
+    /* Test EC_KEY_decoded_from_explicit_params on key without a group */
Packit Service dd46e1
+        || !TEST_int_eq(EC_KEY_decoded_from_explicit_params(key), -1)
Packit Service dd46e1
+        || !TEST_int_eq(EC_KEY_set_group(key, grp_copy), 1)
Packit Service dd46e1
+    /* Test EC_KEY_decoded_from_explicit_params negative case */
Packit Service dd46e1
+        || !TEST_int_eq(EC_KEY_decoded_from_explicit_params(key), 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+    EC_GROUP_free(grp_copy);
Packit Service dd46e1
+    grp_copy = NULL;
Packit Service dd46e1
+    ECPKPARAMETERS_free(ecpkparams);
Packit Service dd46e1
+    ecpkparams = NULL;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test d2i_ECPKParameters with named params not setting the flag */
Packit Service dd46e1
+    if (!TEST_int_gt(encodedlen = i2d_ECPKParameters(grp, &encodedparams), 0)
Packit Service dd46e1
+        || !TEST_ptr(encp = encodedparams)
Packit Service dd46e1
+        || !TEST_ptr(grp_copy = d2i_ECPKParameters(NULL, &encp, encodedlen))
Packit Service dd46e1
+        || !TEST_int_eq(grp_copy->decoded_from_explicit_params, 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+    EC_GROUP_free(grp_copy);
Packit Service dd46e1
+    grp_copy = NULL;
Packit Service dd46e1
+    OPENSSL_free(encodedparams);
Packit Service dd46e1
+    encodedparams = NULL;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Asn1 flag stays set to explicit with EC_GROUP_new_from_ecpkparameters */
Packit Service dd46e1
+    EC_GROUP_set_asn1_flag(grp, OPENSSL_EC_EXPLICIT_CURVE);
Packit Service dd46e1
+    if (!TEST_ptr(ecpkparams = EC_GROUP_get_ecpkparameters(grp, NULL))
Packit Service dd46e1
+        || !TEST_ptr(grp_copy = EC_GROUP_new_from_ecpkparameters(ecpkparams))
Packit Service dd46e1
+        || !TEST_int_eq(EC_GROUP_get_asn1_flag(grp_copy), OPENSSL_EC_EXPLICIT_CURVE)
Packit Service dd46e1
+        || !TEST_int_eq(grp_copy->decoded_from_explicit_params, 0))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+    EC_GROUP_free(grp_copy);
Packit Service dd46e1
+    grp_copy = NULL;
Packit Service dd46e1
+
Packit Service dd46e1
+    /* Test d2i_ECPKParameters with explicit params setting the flag */
Packit Service dd46e1
+    if (!TEST_int_gt(encodedlen = i2d_ECPKParameters(grp, &encodedparams), 0)
Packit Service dd46e1
+        || !TEST_ptr(encp = encodedparams)
Packit Service dd46e1
+        || !TEST_ptr(grp_copy = d2i_ECPKParameters(NULL, &encp, encodedlen))
Packit Service dd46e1
+        || !TEST_int_eq(EC_GROUP_get_asn1_flag(grp_copy), OPENSSL_EC_EXPLICIT_CURVE)
Packit Service dd46e1
+        || !TEST_int_eq(grp_copy->decoded_from_explicit_params, 1)
Packit Service dd46e1
+        || !TEST_int_eq(EC_KEY_set_group(key, grp_copy), 1)
Packit Service dd46e1
+    /* Test EC_KEY_decoded_from_explicit_params positive case */
Packit Service dd46e1
+        || !TEST_int_eq(EC_KEY_decoded_from_explicit_params(key), 1))
Packit Service dd46e1
+        goto err;
Packit Service dd46e1
+
Packit Service dd46e1
+    testresult = 1;
Packit Service dd46e1
+
Packit Service dd46e1
+ err:
Packit Service dd46e1
+    EC_KEY_free(key);
Packit Service dd46e1
+    EC_GROUP_free(grp);
Packit Service dd46e1
+    EC_GROUP_free(grp_copy);
Packit Service dd46e1
+    ECPARAMETERS_free(ecparams);
Packit Service dd46e1
+    ECPKPARAMETERS_free(ecpkparams);
Packit Service dd46e1
+    OPENSSL_free(encodedparams);
Packit Service dd46e1
+
Packit Service dd46e1
+    return testresult;
Packit Service dd46e1
+}
Packit Service dd46e1
+
Packit Service dd46e1
 int setup_tests(void)
Packit Service dd46e1
 {
Packit Service dd46e1
     crv_len = EC_get_builtin_curves(NULL, 0);
Packit Service dd46e1
@@ -196,6 +296,7 @@ int setup_tests(void)
Packit Service dd46e1
     ADD_TEST(field_tests_ec2_simple);
Packit Service dd46e1
 #endif
Packit Service dd46e1
     ADD_ALL_TESTS(field_tests_default, crv_len);
Packit Service dd46e1
+    ADD_TEST(decoded_flag_test);
Packit Service dd46e1
     return 1;
Packit Service dd46e1
 }
Packit Service dd46e1
 
Packit Service dd46e1
diff -up openssl-1.1.1g/test/recipes/25-test_verify.t.explicit-params openssl-1.1.1g/test/recipes/25-test_verify.t
Packit Service dd46e1
--- openssl-1.1.1g/test/recipes/25-test_verify.t.explicit-params	2020-10-23 15:27:31.253311908 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/test/recipes/25-test_verify.t	2020-10-23 15:27:31.306312361 +0200
Packit Service dd46e1
@@ -27,7 +27,7 @@ sub verify {
Packit Service dd46e1
     run(app([@args]));
Packit Service dd46e1
 }
Packit Service dd46e1
 
Packit Service dd46e1
-plan tests => 137;
Packit Service dd46e1
+plan tests => 142;
Packit Service dd46e1
 
Packit Service dd46e1
 # Canonical success
Packit Service dd46e1
 ok(verify("ee-cert", "sslserver", ["root-cert"], ["ca-cert"]),
Packit Service dd46e1
@@ -280,6 +280,27 @@ ok(verify("ee-cert-md5", "sslserver", ["
Packit Service dd46e1
 ok(!verify("ee-cert-md5", "sslserver", ["root-cert"], ["ca-cert"]),
Packit Service dd46e1
    "reject md5 leaf at auth level 1");
Packit Service dd46e1
 
Packit Service dd46e1
+# Explicit vs named curve tests
Packit Service dd46e1
+SKIP: {
Packit Service dd46e1
+    skip "EC is not supported by this OpenSSL build", 5
Packit Service dd46e1
+        if disabled("ec");
Packit Service dd46e1
+    ok(verify("ee-cert-ec-explicit", "sslserver", ["root-cert"],
Packit Service dd46e1
+               ["ca-cert-ec-named"]),
Packit Service dd46e1
+        "accept explicit curve leaf with named curve intermediate without strict");
Packit Service dd46e1
+    ok(verify("ee-cert-ec-named-explicit", "sslserver", ["root-cert"],
Packit Service dd46e1
+               ["ca-cert-ec-explicit"]),
Packit Service dd46e1
+        "accept named curve leaf with explicit curve intermediate without strict");
Packit Service dd46e1
+    ok(!verify("ee-cert-ec-explicit", "sslserver", ["root-cert"],
Packit Service dd46e1
+               ["ca-cert-ec-named"], "-x509_strict"),
Packit Service dd46e1
+        "reject explicit curve leaf with named curve intermediate with strict");
Packit Service dd46e1
+    ok(!verify("ee-cert-ec-named-explicit", "sslserver", ["root-cert"],
Packit Service dd46e1
+               ["ca-cert-ec-explicit"], "-x509_strict"),
Packit Service dd46e1
+        "reject named curve leaf with explicit curve intermediate with strict");
Packit Service dd46e1
+    ok(verify("ee-cert-ec-named-named", "sslserver", ["root-cert"],
Packit Service dd46e1
+              ["ca-cert-ec-named"], "-x509_strict"),
Packit Service dd46e1
+        "accept named curve leaf with named curve intermediate with strict");
Packit Service dd46e1
+}
Packit Service dd46e1
+
Packit Service dd46e1
 # Depth tests, note the depth limit bounds the number of CA certificates
Packit Service dd46e1
 # between the trust-anchor and the leaf, so, for example, with a root->ca->leaf
Packit Service dd46e1
 # chain, depth = 1 is sufficient, but depth == 0 is not.
Packit Service dd46e1
diff -up openssl-1.1.1g/util/libcrypto.num.explicit-params openssl-1.1.1g/util/libcrypto.num
Packit Service dd46e1
--- openssl-1.1.1g/util/libcrypto.num.explicit-params	2020-10-23 15:27:31.265312011 +0200
Packit Service dd46e1
+++ openssl-1.1.1g/util/libcrypto.num	2020-10-23 15:31:37.424413877 +0200
Packit Service dd46e1
@@ -4587,6 +4587,7 @@ EVP_PKEY_meth_set_digestverify
Packit Service dd46e1
 EVP_PKEY_meth_get_digestverify          4541	1_1_1e	EXIST::FUNCTION:
Packit Service dd46e1
 EVP_PKEY_meth_get_digestsign            4542	1_1_1e	EXIST::FUNCTION:
Packit Service dd46e1
 RSA_get0_pss_params                     4543	1_1_1e	EXIST::FUNCTION:RSA
Packit Service dd46e1
+EC_KEY_decoded_from_explicit_params     4547	1_1_1h	EXIST::FUNCTION:EC
Packit Service dd46e1
 FIPS_drbg_reseed                        6348	1_1_0g	EXIST::FUNCTION:
Packit Service dd46e1
 FIPS_selftest_check                     6349	1_1_0g	EXIST::FUNCTION:
Packit Service dd46e1
 FIPS_rand_set_method                    6350	1_1_0g	EXIST::FUNCTION: