Latest update
This commit is contained in:
+91
-26
@@ -3632,7 +3632,7 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
}
|
||||
return ssl_cert_set_current(s->cert, larg);
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
case SSL_CTRL_GET_GROUPS:
|
||||
{
|
||||
uint16_t *clist;
|
||||
@@ -3640,8 +3640,8 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
|
||||
if (!s->session)
|
||||
return 0;
|
||||
clist = s->session->ext.supportedgroups;
|
||||
clistlen = s->session->ext.supportedgroups_len;
|
||||
clist = s->ext.peer_supportedgroups;
|
||||
clistlen = s->ext.peer_supportedgroups_len;
|
||||
if (parg) {
|
||||
size_t i;
|
||||
int *cptr = parg;
|
||||
@@ -3677,7 +3677,8 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
}
|
||||
return id;
|
||||
}
|
||||
#endif
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
case SSL_CTRL_SET_SIGALGS:
|
||||
return tls1_set_sigalgs(s->cert, parg, larg, 0);
|
||||
|
||||
@@ -3755,13 +3756,12 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
|
||||
#ifndef OPENSSL_NO_EC
|
||||
case SSL_CTRL_GET_EC_POINT_FORMATS:
|
||||
{
|
||||
SSL_SESSION *sess = s->session;
|
||||
const unsigned char **pformat = parg;
|
||||
|
||||
if (sess == NULL || sess->ext.ecpointformats == NULL)
|
||||
if (s->ext.peer_ecpointformats == NULL)
|
||||
return 0;
|
||||
*pformat = sess->ext.ecpointformats;
|
||||
return (int)sess->ext.ecpointformats_len;
|
||||
*pformat = s->ext.peer_ecpointformats;
|
||||
return (int)s->ext.peer_ecpointformats_len;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -3953,7 +3953,7 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
case SSL_CTRL_SET_GROUPS:
|
||||
return tls1_set_groups(&ctx->ext.supportedgroups,
|
||||
&ctx->ext.supportedgroups_len,
|
||||
@@ -3963,7 +3963,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
|
||||
return tls1_set_groups_list(&ctx->ext.supportedgroups,
|
||||
&ctx->ext.supportedgroups_len,
|
||||
parg);
|
||||
#endif
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
case SSL_CTRL_SET_SIGALGS:
|
||||
return tls1_set_sigalgs(ctx->cert, parg, larg, 0);
|
||||
|
||||
@@ -4738,25 +4739,40 @@ EVP_PKEY *ssl_generate_pkey(EVP_PKEY *pm)
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
return pkey;
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC
|
||||
|
||||
/* Generate a private key from a group ID */
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
EVP_PKEY *ssl_generate_pkey_group(SSL *s, uint16_t id)
|
||||
{
|
||||
const TLS_GROUP_INFO *ginf = tls1_group_id_lookup(id);
|
||||
EVP_PKEY_CTX *pctx = NULL;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
const TLS_GROUP_INFO *ginf = tls1_group_id_lookup(id);
|
||||
uint16_t gtype;
|
||||
# ifndef OPENSSL_NO_DH
|
||||
DH *dh = NULL;
|
||||
# endif
|
||||
|
||||
if (ginf == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
gtype = ginf->flags & TLS_CURVE_TYPE;
|
||||
if (gtype == TLS_CURVE_CUSTOM)
|
||||
pctx = EVP_PKEY_CTX_new_id(ginf->nid, NULL);
|
||||
gtype = ginf->flags & TLS_GROUP_TYPE;
|
||||
# ifndef OPENSSL_NO_DH
|
||||
if (gtype == TLS_GROUP_FFDHE)
|
||||
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL);
|
||||
# ifndef OPENSSL_NO_EC
|
||||
else
|
||||
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
|
||||
# endif
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_EC
|
||||
{
|
||||
if (gtype == TLS_GROUP_CURVE_CUSTOM)
|
||||
pctx = EVP_PKEY_CTX_new_id(ginf->nid, NULL);
|
||||
else
|
||||
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
|
||||
}
|
||||
# endif
|
||||
if (pctx == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
@@ -4767,12 +4783,40 @@ EVP_PKEY *ssl_generate_pkey_group(SSL *s, uint16_t id)
|
||||
ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (gtype != TLS_CURVE_CUSTOM
|
||||
&& EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, ginf->nid) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
# ifndef OPENSSL_NO_DH
|
||||
if (gtype == TLS_GROUP_FFDHE) {
|
||||
if ((pkey = EVP_PKEY_new()) == NULL
|
||||
|| (dh = DH_new_by_nid(ginf->nid)) == NULL
|
||||
|| !EVP_PKEY_assign(pkey, EVP_PKEY_DH, dh)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_EVP_LIB);
|
||||
DH_free(dh);
|
||||
EVP_PKEY_free(pkey);
|
||||
pkey = NULL;
|
||||
goto err;
|
||||
}
|
||||
if (EVP_PKEY_CTX_set_dh_nid(pctx, ginf->nid) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_EVP_LIB);
|
||||
EVP_PKEY_free(pkey);
|
||||
pkey = NULL;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
# ifndef OPENSSL_NO_EC
|
||||
else
|
||||
# endif
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_EC
|
||||
{
|
||||
if (gtype != TLS_GROUP_CURVE_CUSTOM
|
||||
&& EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, ginf->nid) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
if (EVP_PKEY_keygen(pctx, &pkey) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GENERATE_PKEY_GROUP,
|
||||
ERR_R_EVP_LIB);
|
||||
@@ -4784,6 +4828,7 @@ EVP_PKEY *ssl_generate_pkey_group(SSL *s, uint16_t id)
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
return pkey;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generate parameters from a group ID
|
||||
@@ -4793,11 +4838,12 @@ EVP_PKEY *ssl_generate_param_group(uint16_t id)
|
||||
EVP_PKEY_CTX *pctx = NULL;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
const TLS_GROUP_INFO *ginf = tls1_group_id_lookup(id);
|
||||
int pkey_ctx_id;
|
||||
|
||||
if (ginf == NULL)
|
||||
goto err;
|
||||
|
||||
if ((ginf->flags & TLS_CURVE_TYPE) == TLS_CURVE_CUSTOM) {
|
||||
if ((ginf->flags & TLS_GROUP_TYPE) == TLS_GROUP_CURVE_CUSTOM) {
|
||||
pkey = EVP_PKEY_new();
|
||||
if (pkey != NULL && EVP_PKEY_set_type(pkey, ginf->nid))
|
||||
return pkey;
|
||||
@@ -4805,13 +4851,28 @@ EVP_PKEY *ssl_generate_param_group(uint16_t id)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
|
||||
pkey_ctx_id = (ginf->flags & TLS_GROUP_FFDHE)
|
||||
? EVP_PKEY_DH : EVP_PKEY_EC;
|
||||
pctx = EVP_PKEY_CTX_new_id(pkey_ctx_id, NULL);
|
||||
if (pctx == NULL)
|
||||
goto err;
|
||||
if (EVP_PKEY_paramgen_init(pctx) <= 0)
|
||||
goto err;
|
||||
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, ginf->nid) <= 0)
|
||||
goto err;
|
||||
# ifndef OPENSSL_NO_DH
|
||||
if (ginf->flags & TLS_GROUP_FFDHE) {
|
||||
if (EVP_PKEY_CTX_set_dh_nid(pctx, ginf->nid) <= 0)
|
||||
goto err;
|
||||
}
|
||||
# ifndef OPENSSL_NO_EC
|
||||
else
|
||||
# endif
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_EC
|
||||
{
|
||||
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, ginf->nid) <= 0)
|
||||
goto err;
|
||||
}
|
||||
# endif
|
||||
if (EVP_PKEY_paramgen(pctx, &pkey) <= 0) {
|
||||
EVP_PKEY_free(pkey);
|
||||
pkey = NULL;
|
||||
@@ -4821,7 +4882,6 @@ EVP_PKEY *ssl_generate_param_group(uint16_t id)
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
return pkey;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Derive secrets for ECDH/DH */
|
||||
int ssl_derive(SSL *s, EVP_PKEY *privkey, EVP_PKEY *pubkey, int gensecret)
|
||||
@@ -4847,6 +4907,11 @@ int ssl_derive(SSL *s, EVP_PKEY *privkey, EVP_PKEY *pubkey, int gensecret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_DH
|
||||
if (SSL_IS_TLS13(s) && EVP_PKEY_id(privkey) == EVP_PKEY_DH)
|
||||
EVP_PKEY_CTX_set_dh_pad(pctx, 1);
|
||||
#endif
|
||||
|
||||
pms = OPENSSL_malloc(pmslen);
|
||||
if (pms == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_DERIVE,
|
||||
|
||||
Reference in New Issue
Block a user