Latest update
This commit is contained in:
+1
-2
@@ -52,8 +52,7 @@ int dtls1_dispatch_alert(SSL *s)
|
||||
s->s3.alert_dispatch = 1;
|
||||
/* fprintf( stderr, "not done with alert\n" ); */
|
||||
} else {
|
||||
if (s->s3.send_alert[0] == SSL3_AL_FATAL)
|
||||
(void)BIO_flush(s->wbio);
|
||||
(void)BIO_flush(s->wbio);
|
||||
|
||||
if (s->msg_callback)
|
||||
s->msg_callback(1, s->version, SSL3_RT_ALERT, s->s3.send_alert,
|
||||
|
||||
@@ -377,6 +377,13 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, size_t len,
|
||||
|
||||
s->rlayer.wnum = 0;
|
||||
|
||||
/*
|
||||
* If we are supposed to be sending a KeyUpdate then go into init unless we
|
||||
* have writes pending - in which case we should finish doing that first.
|
||||
*/
|
||||
if (wb->left == 0 && s->key_update != SSL_KEY_UPDATE_NONE)
|
||||
ossl_statem_set_in_init(s, 1);
|
||||
|
||||
/*
|
||||
* When writing early data on the server side we could be "in_init" in
|
||||
* between receiving the EoED and the CF - but we don't want to handle those
|
||||
|
||||
+23
-8
@@ -12,6 +12,7 @@
|
||||
#include "ssl_locl.h"
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/md5.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/cryptlib.h"
|
||||
|
||||
static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
|
||||
@@ -410,6 +411,16 @@ int ssl3_digest_cached_records(SSL *s, int keep)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ssl3_digest_master_key_set_params(const SSL_SESSION *session,
|
||||
OSSL_PARAM params[])
|
||||
{
|
||||
int n = 0;
|
||||
params[n++] = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
|
||||
(void *)session->master_key,
|
||||
session->master_key_length);
|
||||
params[n++] = OSSL_PARAM_construct_end();
|
||||
}
|
||||
|
||||
size_t ssl3_final_finish_mac(SSL *s, const char *sender, size_t len,
|
||||
unsigned char *p)
|
||||
{
|
||||
@@ -448,14 +459,18 @@ size_t ssl3_final_finish_mac(SSL *s, const char *sender, size_t len,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ((sender != NULL && EVP_DigestUpdate(ctx, sender, len) <= 0)
|
||||
|| EVP_MD_CTX_ctrl(ctx, EVP_CTRL_SSL3_MASTER_SECRET,
|
||||
(int)s->session->master_key_length,
|
||||
s->session->master_key) <= 0
|
||||
|| EVP_DigestFinal_ex(ctx, p, NULL) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_FINAL_FINISH_MAC,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
ret = 0;
|
||||
if (sender != NULL) {
|
||||
OSSL_PARAM digest_cmd_params[3];
|
||||
|
||||
ssl3_digest_master_key_set_params(s->session, digest_cmd_params);
|
||||
|
||||
if (EVP_DigestUpdate(ctx, sender, len) <= 0
|
||||
|| EVP_MD_CTX_set_params(ctx, digest_cmd_params) <= 0
|
||||
|| EVP_DigestFinal_ex(ctx, p, NULL) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_FINAL_FINISH_MAC,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
|
||||
+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,
|
||||
|
||||
@@ -154,8 +154,6 @@ CERT *ssl_cert_dup(CERT *cert)
|
||||
ret->client_sigalgslen = cert->client_sigalgslen;
|
||||
} else
|
||||
ret->client_sigalgs = NULL;
|
||||
/* Shared sigalgs also NULL */
|
||||
ret->shared_sigalgs = NULL;
|
||||
/* Copy any custom client certificate types */
|
||||
if (cert->ctype) {
|
||||
ret->ctype = OPENSSL_memdup(cert->ctype, cert->ctype_len);
|
||||
@@ -240,7 +238,6 @@ void ssl_cert_free(CERT *c)
|
||||
ssl_cert_clear_certs(c);
|
||||
OPENSSL_free(c->conf_sigalgs);
|
||||
OPENSSL_free(c->client_sigalgs);
|
||||
OPENSSL_free(c->shared_sigalgs);
|
||||
OPENSSL_free(c->ctype);
|
||||
X509_STORE_free(c->verify_store);
|
||||
X509_STORE_free(c->chain_store);
|
||||
|
||||
+25
-1
@@ -1640,7 +1640,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_list(const SSL_METHOD *ssl_method,
|
||||
ok = 1;
|
||||
rule_p = rule_str;
|
||||
if (strncmp(rule_str, "DEFAULT", 7) == 0) {
|
||||
ok = ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST,
|
||||
ok = ssl_cipher_process_rulestr(OSSL_default_cipher_list(),
|
||||
&head, &tail, ca_list, c);
|
||||
rule_p += 7;
|
||||
if (*rule_p == ':')
|
||||
@@ -2253,3 +2253,27 @@ int ssl_cert_is_disabled(size_t idx)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Default list of TLSv1.2 (and earlier) ciphers
|
||||
* SSL_DEFAULT_CIPHER_LIST deprecated in 3.0.0
|
||||
* Update both macro and function simultaneously
|
||||
*/
|
||||
const char *OSSL_default_cipher_list(void)
|
||||
{
|
||||
return "ALL:!COMPLEMENTOFDEFAULT:!eNULL";
|
||||
}
|
||||
|
||||
/*
|
||||
* Default list of TLSv1.3 (and later) ciphers
|
||||
* TLS_DEFAULT_CIPHERSUITES deprecated in 3.0.0
|
||||
* Update both macro and function simultaneously
|
||||
*/
|
||||
const char *OSSL_default_ciphersuites(void)
|
||||
{
|
||||
return "TLS_AES_256_GCM_SHA384:"
|
||||
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
|
||||
"TLS_CHACHA20_POLY1305_SHA256:"
|
||||
#endif
|
||||
"TLS_AES_128_GCM_SHA256";
|
||||
}
|
||||
+19
-10
@@ -629,6 +629,11 @@ int SSL_clear(SSL *s)
|
||||
/* Clear the verification result peername */
|
||||
X509_VERIFY_PARAM_move_peername(s->param, NULL);
|
||||
|
||||
/* Clear any shared connection state */
|
||||
OPENSSL_free(s->shared_sigalgs);
|
||||
s->shared_sigalgs = NULL;
|
||||
s->shared_sigalgslen = 0;
|
||||
|
||||
/*
|
||||
* Check to see if we were changed into a different method, if so, revert
|
||||
* back.
|
||||
@@ -655,7 +660,7 @@ int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth)
|
||||
|
||||
ctx->method = meth;
|
||||
|
||||
if (!SSL_CTX_set_ciphersuites(ctx, TLS_DEFAULT_CIPHERSUITES)) {
|
||||
if (!SSL_CTX_set_ciphersuites(ctx, OSSL_default_ciphersuites())) {
|
||||
SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
|
||||
return 0;
|
||||
}
|
||||
@@ -663,7 +668,7 @@ int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth)
|
||||
ctx->tls13_ciphersuites,
|
||||
&(ctx->cipher_list),
|
||||
&(ctx->cipher_list_by_id),
|
||||
SSL_DEFAULT_CIPHER_LIST, ctx->cert);
|
||||
OSSL_default_cipher_list(), ctx->cert);
|
||||
if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= 0)) {
|
||||
SSLerr(SSL_F_SSL_CTX_SET_SSL_VERSION, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS);
|
||||
return 0;
|
||||
@@ -780,6 +785,7 @@ SSL *SSL_new(SSL_CTX *ctx)
|
||||
s->ext.ecpointformats_len =
|
||||
ctx->ext.ecpointformats_len;
|
||||
}
|
||||
#endif
|
||||
if (ctx->ext.supportedgroups) {
|
||||
s->ext.supportedgroups =
|
||||
OPENSSL_memdup(ctx->ext.supportedgroups,
|
||||
@@ -789,7 +795,7 @@ SSL *SSL_new(SSL_CTX *ctx)
|
||||
goto err;
|
||||
s->ext.supportedgroups_len = ctx->ext.supportedgroups_len;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_NEXTPROTONEG
|
||||
s->ext.npn = NULL;
|
||||
#endif
|
||||
@@ -1234,6 +1240,7 @@ void SSL_free(SSL *s)
|
||||
ssl_cipher_preference_list_free(s->cipher_list);
|
||||
sk_SSL_CIPHER_free(s->cipher_list_by_id);
|
||||
sk_SSL_CIPHER_free(s->tls13_ciphersuites);
|
||||
sk_SSL_CIPHER_free(s->peer_ciphers);
|
||||
|
||||
/* Make the next call work :-) */
|
||||
if (s->session != NULL) {
|
||||
@@ -1246,13 +1253,16 @@ void SSL_free(SSL *s)
|
||||
clear_ciphers(s);
|
||||
|
||||
ssl_cert_free(s->cert);
|
||||
OPENSSL_free(s->shared_sigalgs);
|
||||
/* Free up if allocated */
|
||||
|
||||
OPENSSL_free(s->ext.hostname);
|
||||
SSL_CTX_free(s->session_ctx);
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(s->ext.ecpointformats);
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
OPENSSL_free(s->ext.supportedgroups);
|
||||
OPENSSL_free(s->ext.peer_supportedgroups);
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts, X509_EXTENSION_free);
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
@@ -2635,9 +2645,9 @@ STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s)
|
||||
|
||||
STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s)
|
||||
{
|
||||
if ((s == NULL) || (s->session == NULL) || !s->server)
|
||||
if ((s == NULL) || !s->server)
|
||||
return NULL;
|
||||
return s->session->ciphers;
|
||||
return s->peer_ciphers;
|
||||
}
|
||||
|
||||
STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s)
|
||||
@@ -2769,13 +2779,12 @@ char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size)
|
||||
int i;
|
||||
|
||||
if (!s->server
|
||||
|| s->session == NULL
|
||||
|| s->session->ciphers == NULL
|
||||
|| s->peer_ciphers == NULL
|
||||
|| size < 2)
|
||||
return NULL;
|
||||
|
||||
p = buf;
|
||||
clntsk = s->session->ciphers;
|
||||
clntsk = s->peer_ciphers;
|
||||
srvrsk = SSL_get_ciphers(s);
|
||||
if (clntsk == NULL || srvrsk == NULL)
|
||||
return NULL;
|
||||
@@ -3137,13 +3146,13 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth)
|
||||
goto err;
|
||||
#endif
|
||||
|
||||
if (!SSL_CTX_set_ciphersuites(ret, TLS_DEFAULT_CIPHERSUITES))
|
||||
if (!SSL_CTX_set_ciphersuites(ret, OSSL_default_ciphersuites()))
|
||||
goto err;
|
||||
|
||||
if (!ssl_create_cipher_list(ret->method,
|
||||
ret->tls13_ciphersuites,
|
||||
&ret->cipher_list, &ret->cipher_list_by_id,
|
||||
SSL_DEFAULT_CIPHER_LIST, ret->cert)
|
||||
OSSL_default_cipher_list(), ret->cert)
|
||||
|| sk_SSL_CIPHER_num(ret->cipher_list->ciphers) <= 0) {
|
||||
SSLerr(SSL_F_SSL_CTX_NEW, SSL_R_LIBRARY_HAS_NO_CIPHERS);
|
||||
goto err2;
|
||||
|
||||
+39
-27
@@ -557,7 +557,6 @@ struct ssl_session_st {
|
||||
const SSL_CIPHER *cipher;
|
||||
unsigned long cipher_id; /* when ASN.1 loaded, this needs to be used to
|
||||
* load the 'cipher' structure */
|
||||
STACK_OF(SSL_CIPHER) *ciphers; /* ciphers offered by the client */
|
||||
CRYPTO_EX_DATA ex_data; /* application specific data */
|
||||
/*
|
||||
* These are used to make removal of session-ids more efficient and to
|
||||
@@ -567,13 +566,7 @@ struct ssl_session_st {
|
||||
|
||||
struct {
|
||||
char *hostname;
|
||||
# ifndef OPENSSL_NO_EC
|
||||
size_t ecpointformats_len;
|
||||
unsigned char *ecpointformats; /* peer's list */
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
size_t supportedgroups_len;
|
||||
uint16_t *supportedgroups; /* peer's list */
|
||||
/* RFC4507 info */
|
||||
/* RFC4507 info */
|
||||
unsigned char *tick; /* Session ticket */
|
||||
size_t ticklen; /* Session ticket length */
|
||||
/* Session lifetime hint in seconds */
|
||||
@@ -998,9 +991,10 @@ struct ssl_ctx_st {
|
||||
/* EC extension values inherited by SSL structure */
|
||||
size_t ecpointformats_len;
|
||||
unsigned char *ecpointformats;
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
|
||||
size_t supportedgroups_len;
|
||||
uint16_t *supportedgroups;
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
|
||||
/*
|
||||
* ALPN information (we are in the process of transitioning from NPN to
|
||||
@@ -1358,6 +1352,7 @@ struct ssl_st {
|
||||
/* Per connection DANE state */
|
||||
SSL_DANE dane;
|
||||
/* crypto */
|
||||
STACK_OF(SSL_CIPHER) *peer_ciphers;
|
||||
struct ssl_cipher_preference_list_st *cipher_list;
|
||||
STACK_OF(SSL_CIPHER) *cipher_list_by_id;
|
||||
/* TLSv1.3 specific ciphersuites */
|
||||
@@ -1521,10 +1516,19 @@ struct ssl_st {
|
||||
size_t ecpointformats_len;
|
||||
/* our list */
|
||||
unsigned char *ecpointformats;
|
||||
|
||||
size_t peer_ecpointformats_len;
|
||||
/* peer's list */
|
||||
unsigned char *peer_ecpointformats;
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
size_t supportedgroups_len;
|
||||
/* our list */
|
||||
uint16_t *supportedgroups;
|
||||
|
||||
size_t peer_supportedgroups_len;
|
||||
/* peer's list */
|
||||
uint16_t *peer_supportedgroups;
|
||||
|
||||
/* TLS Session Ticket extension override */
|
||||
TLS_SESSION_TICKET_EXT *session_ticket;
|
||||
/* TLS Session Ticket extension callback */
|
||||
@@ -1696,6 +1700,13 @@ struct ssl_st {
|
||||
/* Callback for SSL async handling */
|
||||
SSL_async_callback_fn async_cb;
|
||||
void *async_cb_arg;
|
||||
|
||||
/*
|
||||
* Signature algorithms shared by client and server: cached because these
|
||||
* are used most often.
|
||||
*/
|
||||
const struct sigalg_lookup_st **shared_sigalgs;
|
||||
size_t shared_sigalgslen;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1724,14 +1735,19 @@ typedef struct sigalg_lookup_st {
|
||||
typedef struct tls_group_info_st {
|
||||
int nid; /* Curve NID */
|
||||
int secbits; /* Bits of security (from SP800-57) */
|
||||
uint16_t flags; /* Flags: currently just group type */
|
||||
uint32_t flags; /* For group type and applicable TLS versions */
|
||||
uint16_t group_id; /* Group ID */
|
||||
} TLS_GROUP_INFO;
|
||||
|
||||
/* flags values */
|
||||
# define TLS_CURVE_TYPE 0x3 /* Mask for group type */
|
||||
# define TLS_CURVE_PRIME 0x0
|
||||
# define TLS_CURVE_CHAR2 0x1
|
||||
# define TLS_CURVE_CUSTOM 0x2
|
||||
# define TLS_GROUP_TYPE 0x0000000FU /* Mask for group type */
|
||||
# define TLS_GROUP_CURVE_PRIME 0x00000001U
|
||||
# define TLS_GROUP_CURVE_CHAR2 0x00000002U
|
||||
# define TLS_GROUP_CURVE_CUSTOM 0x00000004U
|
||||
# define TLS_GROUP_FFDHE 0x00000008U
|
||||
# define TLS_GROUP_ONLY_FOR_TLS1_3 0x00000010U
|
||||
|
||||
# define TLS_GROUP_FFDHE_FOR_TLS1_3 (TLS_GROUP_FFDHE|TLS_GROUP_ONLY_FOR_TLS1_3)
|
||||
|
||||
/*
|
||||
* Structure containing table entry of certificate info corresponding to
|
||||
@@ -1955,12 +1971,6 @@ typedef struct cert_st {
|
||||
uint16_t *client_sigalgs;
|
||||
/* Size of above array */
|
||||
size_t client_sigalgslen;
|
||||
/*
|
||||
* Signature algorithms shared by client and server: cached because these
|
||||
* are used most often.
|
||||
*/
|
||||
const SIGALG_LOOKUP **shared_sigalgs;
|
||||
size_t shared_sigalgslen;
|
||||
/*
|
||||
* Certificate setup callback: if set is called whenever a certificate
|
||||
* may be required (client or server). the callback can then examine any
|
||||
@@ -2291,8 +2301,8 @@ static ossl_inline int ssl_has_cert(const SSL *s, int idx)
|
||||
static ossl_inline void tls1_get_peer_groups(SSL *s, const uint16_t **pgroups,
|
||||
size_t *pgroupslen)
|
||||
{
|
||||
*pgroups = s->session->ext.supportedgroups;
|
||||
*pgroupslen = s->session->ext.supportedgroups_len;
|
||||
*pgroups = s->ext.peer_supportedgroups;
|
||||
*pgroupslen = s->ext.peer_supportedgroups_len;
|
||||
}
|
||||
|
||||
# ifndef OPENSSL_UNIT_TEST
|
||||
@@ -2408,6 +2418,8 @@ __owur int ssl3_num_ciphers(void);
|
||||
__owur const SSL_CIPHER *ssl3_get_cipher(unsigned int u);
|
||||
int ssl3_renegotiate(SSL *ssl);
|
||||
int ssl3_renegotiate_check(SSL *ssl, int initok);
|
||||
void ssl3_digest_master_key_set_params(const SSL_SESSION *session,
|
||||
OSSL_PARAM params[]);
|
||||
__owur int ssl3_dispatch_alert(SSL *s);
|
||||
__owur size_t ssl3_final_finish_mac(SSL *s, const char *sender, size_t slen,
|
||||
unsigned char *p);
|
||||
@@ -2564,8 +2576,6 @@ __owur int ssl_check_srvr_ecc_cert_and_alg(X509 *x, SSL *s);
|
||||
|
||||
SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n);
|
||||
|
||||
# ifndef OPENSSL_NO_EC
|
||||
|
||||
__owur const TLS_GROUP_INFO *tls1_group_id_lookup(uint16_t curve_id);
|
||||
__owur int tls1_check_group_id(SSL *s, uint16_t group_id, int check_own_curves);
|
||||
__owur uint16_t tls1_shared_group(SSL *s, int nmatch);
|
||||
@@ -2573,14 +2583,16 @@ __owur int tls1_set_groups(uint16_t **pext, size_t *pextlen,
|
||||
int *curves, size_t ncurves);
|
||||
__owur int tls1_set_groups_list(uint16_t **pext, size_t *pextlen,
|
||||
const char *str);
|
||||
__owur EVP_PKEY *ssl_generate_pkey_group(SSL *s, uint16_t id);
|
||||
__owur int tls_valid_group(SSL *s, uint16_t group_id, int version);
|
||||
__owur EVP_PKEY *ssl_generate_param_group(uint16_t id);
|
||||
# ifndef OPENSSL_NO_EC
|
||||
void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
|
||||
size_t *num_formats);
|
||||
__owur int tls1_check_ec_tmp_key(SSL *s, unsigned long id);
|
||||
__owur EVP_PKEY *ssl_generate_pkey_group(SSL *s, uint16_t id);
|
||||
__owur EVP_PKEY *ssl_generate_param_group(uint16_t id);
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
|
||||
__owur int tls_curve_allowed(SSL *s, uint16_t curve, int op);
|
||||
__owur int tls_group_allowed(SSL *s, uint16_t curve, int op);
|
||||
void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups,
|
||||
size_t *pgroupslen);
|
||||
|
||||
|
||||
@@ -121,12 +121,7 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
|
||||
dest->psk_identity_hint = NULL;
|
||||
dest->psk_identity = NULL;
|
||||
#endif
|
||||
dest->ciphers = NULL;
|
||||
dest->ext.hostname = NULL;
|
||||
#ifndef OPENSSL_NO_EC
|
||||
dest->ext.ecpointformats = NULL;
|
||||
dest->ext.supportedgroups = NULL;
|
||||
#endif
|
||||
dest->ext.tick = NULL;
|
||||
dest->ext.alpn_selected = NULL;
|
||||
#ifndef OPENSSL_NO_SRP
|
||||
@@ -176,12 +171,6 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (src->ciphers != NULL) {
|
||||
dest->ciphers = sk_SSL_CIPHER_dup(src->ciphers);
|
||||
if (dest->ciphers == NULL)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL_SESSION,
|
||||
&dest->ex_data, &src->ex_data)) {
|
||||
goto err;
|
||||
@@ -193,23 +182,6 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
#ifndef OPENSSL_NO_EC
|
||||
if (src->ext.ecpointformats) {
|
||||
dest->ext.ecpointformats =
|
||||
OPENSSL_memdup(src->ext.ecpointformats,
|
||||
src->ext.ecpointformats_len);
|
||||
if (dest->ext.ecpointformats == NULL)
|
||||
goto err;
|
||||
}
|
||||
if (src->ext.supportedgroups) {
|
||||
dest->ext.supportedgroups =
|
||||
OPENSSL_memdup(src->ext.supportedgroups,
|
||||
src->ext.supportedgroups_len
|
||||
* sizeof(*src->ext.supportedgroups));
|
||||
if (dest->ext.supportedgroups == NULL)
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ticket != 0 && src->ext.tick != NULL) {
|
||||
dest->ext.tick =
|
||||
@@ -793,17 +765,8 @@ void SSL_SESSION_free(SSL_SESSION *ss)
|
||||
OPENSSL_cleanse(ss->session_id, sizeof(ss->session_id));
|
||||
X509_free(ss->peer);
|
||||
sk_X509_pop_free(ss->peer_chain, X509_free);
|
||||
sk_SSL_CIPHER_free(ss->ciphers);
|
||||
OPENSSL_free(ss->ext.hostname);
|
||||
OPENSSL_free(ss->ext.tick);
|
||||
#ifndef OPENSSL_NO_EC
|
||||
OPENSSL_free(ss->ext.ecpointformats);
|
||||
ss->ext.ecpointformats = NULL;
|
||||
ss->ext.ecpointformats_len = 0;
|
||||
OPENSSL_free(ss->ext.supportedgroups);
|
||||
ss->ext.supportedgroups = NULL;
|
||||
ss->ext.supportedgroups_len = 0;
|
||||
#endif /* OPENSSL_NO_EC */
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
OPENSSL_free(ss->psk_identity_hint);
|
||||
OPENSSL_free(ss->psk_identity);
|
||||
|
||||
+11
-13
@@ -46,9 +46,7 @@ static int init_etm(SSL *s, unsigned int context);
|
||||
static int init_ems(SSL *s, unsigned int context);
|
||||
static int final_ems(SSL *s, unsigned int context, int sent);
|
||||
static int init_psk_kex_modes(SSL *s, unsigned int context);
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static int final_key_share(SSL *s, unsigned int context, int sent);
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_SRTP
|
||||
static int init_srtp(SSL *s, unsigned int context);
|
||||
#endif
|
||||
@@ -162,6 +160,10 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
tls_construct_stoc_ec_pt_formats, tls_construct_ctos_ec_pt_formats,
|
||||
final_ec_pt_formats
|
||||
},
|
||||
#else
|
||||
INVALID_EXTENSION,
|
||||
#endif
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
{
|
||||
/*
|
||||
* "supported_groups" is spread across several specifications.
|
||||
@@ -197,7 +199,6 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
},
|
||||
#else
|
||||
INVALID_EXTENSION,
|
||||
INVALID_EXTENSION,
|
||||
#endif
|
||||
{
|
||||
TLSEXT_TYPE_session_ticket,
|
||||
@@ -322,7 +323,6 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
init_psk_kex_modes, tls_parse_ctos_psk_kex_modes, NULL, NULL,
|
||||
tls_construct_ctos_psk_kex_modes, NULL
|
||||
},
|
||||
#ifndef OPENSSL_NO_EC
|
||||
{
|
||||
/*
|
||||
* Must be in this list after supported_groups. We need that to have
|
||||
@@ -336,7 +336,6 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
tls_construct_stoc_key_share, tls_construct_ctos_key_share,
|
||||
final_key_share
|
||||
},
|
||||
#endif
|
||||
{
|
||||
/* Must be after key_share */
|
||||
TLSEXT_TYPE_cookie,
|
||||
@@ -1040,18 +1039,18 @@ static int final_ec_pt_formats(SSL *s, unsigned int context, int sent)
|
||||
*/
|
||||
if (s->ext.ecpointformats != NULL
|
||||
&& s->ext.ecpointformats_len > 0
|
||||
&& s->session->ext.ecpointformats != NULL
|
||||
&& s->session->ext.ecpointformats_len > 0
|
||||
&& s->ext.peer_ecpointformats != NULL
|
||||
&& s->ext.peer_ecpointformats_len > 0
|
||||
&& ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
|
||||
/* we are using an ECC cipher */
|
||||
size_t i;
|
||||
unsigned char *list = s->session->ext.ecpointformats;
|
||||
unsigned char *list = s->ext.peer_ecpointformats;
|
||||
|
||||
for (i = 0; i < s->session->ext.ecpointformats_len; i++) {
|
||||
for (i = 0; i < s->ext.peer_ecpointformats_len; i++) {
|
||||
if (*list++ == TLSEXT_ECPOINTFORMAT_uncompressed)
|
||||
break;
|
||||
}
|
||||
if (i == s->session->ext.ecpointformats_len) {
|
||||
if (i == s->ext.peer_ecpointformats_len) {
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_FINAL_EC_PT_FORMATS,
|
||||
SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
|
||||
return 0;
|
||||
@@ -1266,9 +1265,9 @@ static int final_sig_algs(SSL *s, unsigned int context, int sent)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static int final_key_share(SSL *s, unsigned int context, int sent)
|
||||
{
|
||||
#if !defined(OPENSSL_NO_TLS1_3)
|
||||
if (!SSL_IS_TLS13(s))
|
||||
return 1;
|
||||
|
||||
@@ -1426,10 +1425,9 @@ static int final_key_share(SSL *s, unsigned int context, int sent)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !defined(OPENSSL_NO_TLS1_3) */
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int init_psk_kex_modes(SSL *s, unsigned int context)
|
||||
{
|
||||
|
||||
@@ -113,11 +113,13 @@ EXT_RETURN tls_construct_ctos_srp(SSL *s, WPACKET *pkt, unsigned int context,
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static int use_ecc(SSL *s)
|
||||
static int use_ecc(SSL *s, int max_version)
|
||||
{
|
||||
int i, end, ret = 0;
|
||||
unsigned long alg_k, alg_a;
|
||||
STACK_OF(SSL_CIPHER) *cipher_stack = NULL;
|
||||
const uint16_t *pgroups = NULL;
|
||||
size_t num_groups, j;
|
||||
|
||||
/* See if we support any ECC ciphersuites */
|
||||
if (s->version == SSL3_VERSION)
|
||||
@@ -137,9 +139,21 @@ static int use_ecc(SSL *s)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sk_SSL_CIPHER_free(cipher_stack);
|
||||
return ret;
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
/* Check we have at least one EC supported group */
|
||||
tls1_get_supported_groups(s, &pgroups, &num_groups);
|
||||
for (j = 0; j < num_groups; j++) {
|
||||
uint16_t ctmp = pgroups[j];
|
||||
|
||||
if (tls_valid_group(s, ctmp, max_version)
|
||||
&& tls_group_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
@@ -148,8 +162,15 @@ EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
{
|
||||
const unsigned char *pformats;
|
||||
size_t num_formats;
|
||||
int reason, min_version, max_version;
|
||||
|
||||
if (!use_ecc(s))
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
|
||||
if (reason != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS, reason);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
if (!use_ecc(s, max_version))
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
|
||||
/* Add TLS extension ECPointFormats to the ClientHello message */
|
||||
@@ -167,43 +188,59 @@ EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
|
||||
return EXT_RETURN_SENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
EXT_RETURN tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx)
|
||||
{
|
||||
const uint16_t *pgroups = NULL;
|
||||
size_t num_groups = 0, i;
|
||||
int min_version, max_version, reason;
|
||||
|
||||
if (!use_ecc(s))
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
|
||||
if (reason != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS, reason);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
#if defined(OPENSSL_NO_EC)
|
||||
if (max_version < TLS1_3_VERSION)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
#else
|
||||
if (!use_ecc(s, max_version) && max_version < TLS1_3_VERSION)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Add TLS extension supported_groups to the ClientHello message
|
||||
*/
|
||||
/* TODO(TLS1.3): Add support for DHE groups */
|
||||
tls1_get_supported_groups(s, &pgroups, &num_groups);
|
||||
|
||||
if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups)
|
||||
/* Sub-packet for supported_groups extension */
|
||||
|| !WPACKET_start_sub_packet_u16(pkt)
|
||||
|| !WPACKET_start_sub_packet_u16(pkt)) {
|
||||
|| !WPACKET_start_sub_packet_u16(pkt)
|
||||
|| !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
/* Copy curve ID if supported */
|
||||
/* Copy group ID if supported */
|
||||
for (i = 0; i < num_groups; i++) {
|
||||
uint16_t ctmp = pgroups[i];
|
||||
|
||||
if (tls_curve_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
if (tls_valid_group(s, ctmp, max_version)
|
||||
&& tls_group_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
if (!WPACKET_put_bytes_u16(pkt, ctmp)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) {
|
||||
@@ -674,7 +711,7 @@ EXT_RETURN tls_construct_ctos_key_share(SSL *s, WPACKET *pkt,
|
||||
} else {
|
||||
for (i = 0; i < num_groups; i++) {
|
||||
|
||||
if (!tls_curve_allowed(s, pgroups[i], SSL_SECOP_CURVE_SUPPORTED))
|
||||
if (!tls_group_allowed(s, pgroups[i], SSL_SECOP_CURVE_SUPPORTED))
|
||||
continue;
|
||||
|
||||
curve_id = pgroups[i];
|
||||
@@ -1374,19 +1411,19 @@ int tls_parse_stoc_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
|
||||
return 0;
|
||||
}
|
||||
|
||||
s->session->ext.ecpointformats_len = 0;
|
||||
OPENSSL_free(s->session->ext.ecpointformats);
|
||||
s->session->ext.ecpointformats = OPENSSL_malloc(ecpointformats_len);
|
||||
if (s->session->ext.ecpointformats == NULL) {
|
||||
s->ext.peer_ecpointformats_len = 0;
|
||||
OPENSSL_free(s->ext.peer_ecpointformats);
|
||||
s->ext.peer_ecpointformats = OPENSSL_malloc(ecpointformats_len);
|
||||
if (s->ext.peer_ecpointformats == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
s->session->ext.ecpointformats_len = ecpointformats_len;
|
||||
s->ext.peer_ecpointformats_len = ecpointformats_len;
|
||||
|
||||
if (!PACKET_copy_bytes(&ecptformatlist,
|
||||
s->session->ext.ecpointformats,
|
||||
s->ext.peer_ecpointformats,
|
||||
ecpointformats_len)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
|
||||
@@ -1834,7 +1871,7 @@ int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
break;
|
||||
}
|
||||
if (i >= num_groups
|
||||
|| !tls_curve_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
|| !tls_group_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
|
||||
SSL_F_TLS_PARSE_STOC_KEY_SHARE, SSL_R_BAD_KEY_SHARE);
|
||||
return 0;
|
||||
|
||||
@@ -254,8 +254,8 @@ int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
|
||||
|
||||
if (!s->hit) {
|
||||
if (!PACKET_memdup(&ec_point_format_list,
|
||||
&s->session->ext.ecpointformats,
|
||||
&s->session->ext.ecpointformats_len)) {
|
||||
&s->ext.peer_ecpointformats,
|
||||
&s->ext.peer_ecpointformats_len)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -946,7 +946,7 @@ int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context,
|
||||
X509 *x, size_t chainidx)
|
||||
{
|
||||
@@ -962,12 +962,12 @@ int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context,
|
||||
}
|
||||
|
||||
if (!s->hit || SSL_IS_TLS13(s)) {
|
||||
OPENSSL_free(s->session->ext.supportedgroups);
|
||||
s->session->ext.supportedgroups = NULL;
|
||||
s->session->ext.supportedgroups_len = 0;
|
||||
OPENSSL_free(s->ext.peer_supportedgroups);
|
||||
s->ext.peer_supportedgroups = NULL;
|
||||
s->ext.peer_supportedgroups_len = 0;
|
||||
if (!tls1_save_u16(&supported_groups_list,
|
||||
&s->session->ext.supportedgroups,
|
||||
&s->session->ext.supportedgroups_len)) {
|
||||
&s->ext.peer_supportedgroups,
|
||||
&s->ext.peer_supportedgroups_len)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
@@ -1379,7 +1379,7 @@ EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
unsigned long alg_k = s->s3.tmp.new_cipher->algorithm_mkey;
|
||||
unsigned long alg_a = s->s3.tmp.new_cipher->algorithm_auth;
|
||||
int using_ecc = ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))
|
||||
&& (s->session->ext.ecpointformats != NULL);
|
||||
&& (s->ext.peer_ecpointformats != NULL);
|
||||
const unsigned char *plist;
|
||||
size_t plistlen;
|
||||
|
||||
@@ -1400,7 +1400,7 @@ EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx)
|
||||
@@ -1424,7 +1424,8 @@ EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt,
|
||||
for (i = 0; i < numgroups; i++) {
|
||||
uint16_t group = groups[i];
|
||||
|
||||
if (tls_curve_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
if (tls_valid_group(s, group, SSL_version(s))
|
||||
&& tls_group_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) {
|
||||
if (first) {
|
||||
/*
|
||||
* Check if the client is already using our preferred group. If
|
||||
|
||||
@@ -474,12 +474,6 @@ static WRITE_TRAN ossl_statem_client13_write_transition(SSL *s)
|
||||
return WRITE_TRAN_CONTINUE;
|
||||
|
||||
case TLS_ST_CR_KEY_UPDATE:
|
||||
if (s->key_update != SSL_KEY_UPDATE_NONE) {
|
||||
st->hand_state = TLS_ST_CW_KEY_UPDATE;
|
||||
return WRITE_TRAN_CONTINUE;
|
||||
}
|
||||
/* Fall through */
|
||||
|
||||
case TLS_ST_CW_KEY_UPDATE:
|
||||
case TLS_ST_CR_SESSION_TICKET:
|
||||
case TLS_ST_CW_FINISHED:
|
||||
|
||||
+17
-14
@@ -286,9 +286,13 @@ int tls_construct_cert_verify(SSL *s, WPACKET *pkt)
|
||||
}
|
||||
if (s->version == SSL3_VERSION) {
|
||||
if (EVP_DigestSignUpdate(mctx, hdata, hdatalen) <= 0
|
||||
|| !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
|
||||
(int)s->session->master_key_length,
|
||||
s->session->master_key)
|
||||
/*
|
||||
* TODO(3.0) Replace this when EVP_MD_CTX_ctrl() is deprecated
|
||||
* with a call to ssl3_digest_master_key_set_params()
|
||||
*/
|
||||
|| EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
|
||||
(int)s->session->master_key_length,
|
||||
s->session->master_key) <= 0
|
||||
|| EVP_DigestSignFinal(mctx, sig, &siglen) <= 0) {
|
||||
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CERT_VERIFY,
|
||||
@@ -473,10 +477,14 @@ MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt)
|
||||
}
|
||||
}
|
||||
if (s->version == SSL3_VERSION) {
|
||||
/*
|
||||
* TODO(3.0) Replace this when EVP_MD_CTX_ctrl() is deprecated
|
||||
* with a call to ssl3_digest_master_key_set_params()
|
||||
*/
|
||||
if (EVP_DigestVerifyUpdate(mctx, hdata, hdatalen) <= 0
|
||||
|| !EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
|
||||
(int)s->session->master_key_length,
|
||||
s->session->master_key)) {
|
||||
|| EVP_MD_CTX_ctrl(mctx, EVP_CTRL_SSL3_MASTER_SECRET,
|
||||
(int)s->session->master_key_length,
|
||||
s->session->master_key) <= 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PROCESS_CERT_VERIFY,
|
||||
ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
@@ -643,12 +651,9 @@ MSG_PROCESS_RETURN tls_process_key_update(SSL *s, PACKET *pkt)
|
||||
/*
|
||||
* If we get a request for us to update our sending keys too then, we need
|
||||
* to additionally send a KeyUpdate message. However that message should
|
||||
* not also request an update (otherwise we get into an infinite loop). We
|
||||
* ignore a request for us to update our sending keys too if we already
|
||||
* sent close_notify.
|
||||
* not also request an update (otherwise we get into an infinite loop).
|
||||
*/
|
||||
if (updatetype == SSL_KEY_UPDATE_REQUESTED
|
||||
&& (s->shutdown & SSL_SENT_SHUTDOWN) == 0)
|
||||
if (updatetype == SSL_KEY_UPDATE_REQUESTED)
|
||||
s->key_update = SSL_KEY_UPDATE_NOT_REQUESTED;
|
||||
|
||||
if (!tls13_update_key(s, 0)) {
|
||||
@@ -2132,7 +2137,6 @@ int ssl_set_client_hello_version(SSL *s)
|
||||
* used. Returns 1 if the group is in the list (and allowed if |checkallow| is
|
||||
* 1) or 0 otherwise.
|
||||
*/
|
||||
#ifndef OPENSSL_NO_EC
|
||||
int check_in_list(SSL *s, uint16_t group_id, const uint16_t *groups,
|
||||
size_t num_groups, int checkallow)
|
||||
{
|
||||
@@ -2146,14 +2150,13 @@ int check_in_list(SSL *s, uint16_t group_id, const uint16_t *groups,
|
||||
|
||||
if (group_id == group
|
||||
&& (!checkallow
|
||||
|| tls_curve_allowed(s, group, SSL_SECOP_CURVE_CHECK))) {
|
||||
|| tls_group_allowed(s, group, SSL_SECOP_CURVE_CHECK))) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Replace ClientHello1 in the transcript hash with a synthetic message */
|
||||
int create_synthetic_message_hash(SSL *s, const unsigned char *hashval,
|
||||
|
||||
@@ -199,9 +199,9 @@ int tls_parse_ctos_early_data(SSL *s, PACKET *pkt, unsigned int context,
|
||||
#ifndef OPENSSL_NO_EC
|
||||
int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context,
|
||||
X509 *x, size_t chainidx);
|
||||
#endif
|
||||
int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context,
|
||||
X509 *x, size_t chainidxl);
|
||||
#endif
|
||||
int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, unsigned int context,
|
||||
X509 *x, size_t chainidx);
|
||||
int tls_parse_ctos_sig_algs_cert(SSL *s, PACKET *pkt, unsigned int context,
|
||||
@@ -314,10 +314,11 @@ EXT_RETURN tls_construct_ctos_srp(SSL *s, WPACKET *pkt, unsigned int context, X5
|
||||
EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx);
|
||||
#endif
|
||||
EXT_RETURN tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx);
|
||||
#endif
|
||||
|
||||
EXT_RETURN tls_construct_ctos_early_data(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx);
|
||||
|
||||
+23
-31
@@ -503,12 +503,6 @@ static WRITE_TRAN ossl_statem_server13_write_transition(SSL *s)
|
||||
return WRITE_TRAN_CONTINUE;
|
||||
|
||||
case TLS_ST_SR_KEY_UPDATE:
|
||||
if (s->key_update != SSL_KEY_UPDATE_NONE) {
|
||||
st->hand_state = TLS_ST_SW_KEY_UPDATE;
|
||||
return WRITE_TRAN_CONTINUE;
|
||||
}
|
||||
/* Fall through */
|
||||
|
||||
case TLS_ST_SW_KEY_UPDATE:
|
||||
st->hand_state = TLS_ST_OK;
|
||||
return WRITE_TRAN_CONTINUE;
|
||||
@@ -1930,14 +1924,14 @@ static int tls_early_post_process_client_hello(SSL *s)
|
||||
&& master_key_length > 0) {
|
||||
s->session->master_key_length = master_key_length;
|
||||
s->hit = 1;
|
||||
s->session->ciphers = ciphers;
|
||||
s->peer_ciphers = ciphers;
|
||||
s->session->verify_result = X509_V_OK;
|
||||
|
||||
ciphers = NULL;
|
||||
|
||||
/* check if some cipher was preferred by call back */
|
||||
if (pref_cipher == NULL)
|
||||
pref_cipher = ssl3_choose_cipher(s, s->session->ciphers,
|
||||
pref_cipher = ssl3_choose_cipher(s, s->peer_ciphers,
|
||||
ssl_get_cipher_preferences(s));
|
||||
if (pref_cipher == NULL) {
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
@@ -1949,9 +1943,9 @@ static int tls_early_post_process_client_hello(SSL *s)
|
||||
s->session->cipher = pref_cipher;
|
||||
ssl_cipher_preference_list_free(s->cipher_list);
|
||||
s->cipher_list = ssl_cipher_preference_list_from_ciphers(
|
||||
s->session->ciphers);
|
||||
s->peer_ciphers);
|
||||
sk_SSL_CIPHER_free(s->cipher_list_by_id);
|
||||
s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->session->ciphers);
|
||||
s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->peer_ciphers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2051,12 +2045,12 @@ static int tls_early_post_process_client_hello(SSL *s)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Given s->session->ciphers and SSL_get_ciphers, we must pick a cipher
|
||||
* Given s->peer_ciphers and SSL_get_ciphers, we must pick a cipher
|
||||
*/
|
||||
|
||||
if (!s->hit || SSL_IS_TLS13(s)) {
|
||||
sk_SSL_CIPHER_free(s->session->ciphers);
|
||||
s->session->ciphers = ciphers;
|
||||
sk_SSL_CIPHER_free(s->peer_ciphers);
|
||||
s->peer_ciphers = ciphers;
|
||||
if (ciphers == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_EARLY_POST_PROCESS_CLIENT_HELLO,
|
||||
@@ -2072,6 +2066,10 @@ static int tls_early_post_process_client_hello(SSL *s)
|
||||
#else
|
||||
s->session->compress_meth = (comp == NULL) ? 0 : comp->id;
|
||||
#endif
|
||||
if (!tls1_set_server_sigalgs(s)) {
|
||||
/* SSLfatal() already called */
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
sk_SSL_CIPHER_free(ciphers);
|
||||
@@ -2239,31 +2237,25 @@ WORK_STATE tls_post_process_client_hello(SSL *s, WORK_STATE wst)
|
||||
if (wst == WORK_MORE_B) {
|
||||
if (!s->hit || SSL_IS_TLS13(s)) {
|
||||
/* Let cert callback update server certificates if required */
|
||||
if (!s->hit) {
|
||||
if (s->cert->cert_cb != NULL) {
|
||||
int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg);
|
||||
if (rv == 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_POST_PROCESS_CLIENT_HELLO,
|
||||
SSL_R_CERT_CB_ERROR);
|
||||
goto err;
|
||||
}
|
||||
if (rv < 0) {
|
||||
s->rwstate = SSL_X509_LOOKUP;
|
||||
return WORK_MORE_B;
|
||||
}
|
||||
s->rwstate = SSL_NOTHING;
|
||||
}
|
||||
if (!tls1_set_server_sigalgs(s)) {
|
||||
/* SSLfatal already called */
|
||||
if (!s->hit && s->cert->cert_cb != NULL) {
|
||||
int rv = s->cert->cert_cb(s, s->cert->cert_cb_arg);
|
||||
if (rv == 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_POST_PROCESS_CLIENT_HELLO,
|
||||
SSL_R_CERT_CB_ERROR);
|
||||
goto err;
|
||||
}
|
||||
if (rv < 0) {
|
||||
s->rwstate = SSL_X509_LOOKUP;
|
||||
return WORK_MORE_B;
|
||||
}
|
||||
s->rwstate = SSL_NOTHING;
|
||||
}
|
||||
|
||||
/* In TLSv1.3 we selected the ciphersuite before resumption */
|
||||
if (!SSL_IS_TLS13(s)) {
|
||||
cipher =
|
||||
ssl3_choose_cipher(s, s->session->ciphers, ssl_get_cipher_preferences(s));
|
||||
ssl3_choose_cipher(s, s->peer_ciphers, ssl_get_cipher_preferences(s));
|
||||
|
||||
if (cipher == NULL) {
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
|
||||
+251
-181
@@ -128,83 +128,115 @@ int tls1_clear(SSL *s)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
|
||||
/*
|
||||
* Table of curve information.
|
||||
* Do not delete entries or reorder this array! It is used as a lookup
|
||||
* table: the index of each entry is one less than the TLS curve id.
|
||||
* Table of group information.
|
||||
*/
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
static const TLS_GROUP_INFO nid_list[] = {
|
||||
{NID_sect163k1, 80, TLS_CURVE_CHAR2}, /* sect163k1 (1) */
|
||||
{NID_sect163r1, 80, TLS_CURVE_CHAR2}, /* sect163r1 (2) */
|
||||
{NID_sect163r2, 80, TLS_CURVE_CHAR2}, /* sect163r2 (3) */
|
||||
{NID_sect193r1, 80, TLS_CURVE_CHAR2}, /* sect193r1 (4) */
|
||||
{NID_sect193r2, 80, TLS_CURVE_CHAR2}, /* sect193r2 (5) */
|
||||
{NID_sect233k1, 112, TLS_CURVE_CHAR2}, /* sect233k1 (6) */
|
||||
{NID_sect233r1, 112, TLS_CURVE_CHAR2}, /* sect233r1 (7) */
|
||||
{NID_sect239k1, 112, TLS_CURVE_CHAR2}, /* sect239k1 (8) */
|
||||
{NID_sect283k1, 128, TLS_CURVE_CHAR2}, /* sect283k1 (9) */
|
||||
{NID_sect283r1, 128, TLS_CURVE_CHAR2}, /* sect283r1 (10) */
|
||||
{NID_sect409k1, 192, TLS_CURVE_CHAR2}, /* sect409k1 (11) */
|
||||
{NID_sect409r1, 192, TLS_CURVE_CHAR2}, /* sect409r1 (12) */
|
||||
{NID_sect571k1, 256, TLS_CURVE_CHAR2}, /* sect571k1 (13) */
|
||||
{NID_sect571r1, 256, TLS_CURVE_CHAR2}, /* sect571r1 (14) */
|
||||
{NID_secp160k1, 80, TLS_CURVE_PRIME}, /* secp160k1 (15) */
|
||||
{NID_secp160r1, 80, TLS_CURVE_PRIME}, /* secp160r1 (16) */
|
||||
{NID_secp160r2, 80, TLS_CURVE_PRIME}, /* secp160r2 (17) */
|
||||
{NID_secp192k1, 80, TLS_CURVE_PRIME}, /* secp192k1 (18) */
|
||||
{NID_X9_62_prime192v1, 80, TLS_CURVE_PRIME}, /* secp192r1 (19) */
|
||||
{NID_secp224k1, 112, TLS_CURVE_PRIME}, /* secp224k1 (20) */
|
||||
{NID_secp224r1, 112, TLS_CURVE_PRIME}, /* secp224r1 (21) */
|
||||
{NID_secp256k1, 128, TLS_CURVE_PRIME}, /* secp256k1 (22) */
|
||||
{NID_X9_62_prime256v1, 128, TLS_CURVE_PRIME}, /* secp256r1 (23) */
|
||||
{NID_secp384r1, 192, TLS_CURVE_PRIME}, /* secp384r1 (24) */
|
||||
{NID_secp521r1, 256, TLS_CURVE_PRIME}, /* secp521r1 (25) */
|
||||
{NID_brainpoolP256r1, 128, TLS_CURVE_PRIME}, /* brainpoolP256r1 (26) */
|
||||
{NID_brainpoolP384r1, 192, TLS_CURVE_PRIME}, /* brainpoolP384r1 (27) */
|
||||
{NID_brainpoolP512r1, 256, TLS_CURVE_PRIME}, /* brainpool512r1 (28) */
|
||||
{EVP_PKEY_X25519, 128, TLS_CURVE_CUSTOM}, /* X25519 (29) */
|
||||
{EVP_PKEY_X448, 224, TLS_CURVE_CUSTOM}, /* X448 (30) */
|
||||
# ifndef OPENSSL_NO_EC
|
||||
{NID_sect163k1, 80, TLS_GROUP_CURVE_CHAR2, 0x0001}, /* sect163k1 (1) */
|
||||
{NID_sect163r1, 80, TLS_GROUP_CURVE_CHAR2, 0x0002}, /* sect163r1 (2) */
|
||||
{NID_sect163r2, 80, TLS_GROUP_CURVE_CHAR2, 0x0003}, /* sect163r2 (3) */
|
||||
{NID_sect193r1, 80, TLS_GROUP_CURVE_CHAR2, 0x0004}, /* sect193r1 (4) */
|
||||
{NID_sect193r2, 80, TLS_GROUP_CURVE_CHAR2, 0x0005}, /* sect193r2 (5) */
|
||||
{NID_sect233k1, 112, TLS_GROUP_CURVE_CHAR2, 0x0006}, /* sect233k1 (6) */
|
||||
{NID_sect233r1, 112, TLS_GROUP_CURVE_CHAR2, 0x0007}, /* sect233r1 (7) */
|
||||
{NID_sect239k1, 112, TLS_GROUP_CURVE_CHAR2, 0x0008}, /* sect239k1 (8) */
|
||||
{NID_sect283k1, 128, TLS_GROUP_CURVE_CHAR2, 0x0009}, /* sect283k1 (9) */
|
||||
{NID_sect283r1, 128, TLS_GROUP_CURVE_CHAR2, 0x000A}, /* sect283r1 (10) */
|
||||
{NID_sect409k1, 192, TLS_GROUP_CURVE_CHAR2, 0x000B}, /* sect409k1 (11) */
|
||||
{NID_sect409r1, 192, TLS_GROUP_CURVE_CHAR2, 0x000C}, /* sect409r1 (12) */
|
||||
{NID_sect571k1, 256, TLS_GROUP_CURVE_CHAR2, 0x000D}, /* sect571k1 (13) */
|
||||
{NID_sect571r1, 256, TLS_GROUP_CURVE_CHAR2, 0x000E}, /* sect571r1 (14) */
|
||||
{NID_secp160k1, 80, TLS_GROUP_CURVE_PRIME, 0x000F}, /* secp160k1 (15) */
|
||||
{NID_secp160r1, 80, TLS_GROUP_CURVE_PRIME, 0x0010}, /* secp160r1 (16) */
|
||||
{NID_secp160r2, 80, TLS_GROUP_CURVE_PRIME, 0x0011}, /* secp160r2 (17) */
|
||||
{NID_secp192k1, 80, TLS_GROUP_CURVE_PRIME, 0x0012}, /* secp192k1 (18) */
|
||||
{NID_X9_62_prime192v1, 80, TLS_GROUP_CURVE_PRIME, 0x0013}, /* secp192r1 (19) */
|
||||
{NID_secp224k1, 112, TLS_GROUP_CURVE_PRIME, 0x0014}, /* secp224k1 (20) */
|
||||
{NID_secp224r1, 112, TLS_GROUP_CURVE_PRIME, 0x0015}, /* secp224r1 (21) */
|
||||
{NID_secp256k1, 128, TLS_GROUP_CURVE_PRIME, 0x0016}, /* secp256k1 (22) */
|
||||
{NID_X9_62_prime256v1, 128, TLS_GROUP_CURVE_PRIME, 0x0017}, /* secp256r1 (23) */
|
||||
{NID_secp384r1, 192, TLS_GROUP_CURVE_PRIME, 0x0018}, /* secp384r1 (24) */
|
||||
{NID_secp521r1, 256, TLS_GROUP_CURVE_PRIME, 0x0019}, /* secp521r1 (25) */
|
||||
{NID_brainpoolP256r1, 128, TLS_GROUP_CURVE_PRIME, 0x001A}, /* brainpoolP256r1 (26) */
|
||||
{NID_brainpoolP384r1, 192, TLS_GROUP_CURVE_PRIME, 0x001B}, /* brainpoolP384r1 (27) */
|
||||
{NID_brainpoolP512r1, 256, TLS_GROUP_CURVE_PRIME, 0x001C}, /* brainpool512r1 (28) */
|
||||
{EVP_PKEY_X25519, 128, TLS_GROUP_CURVE_CUSTOM, 0x001D}, /* X25519 (29) */
|
||||
{EVP_PKEY_X448, 224, TLS_GROUP_CURVE_CUSTOM, 0x001E}, /* X448 (30) */
|
||||
# endif /* OPENSSL_NO_EC */
|
||||
# ifndef OPENSSL_NO_DH
|
||||
/* Security bit values for FFDHE groups are updated as per RFC 7919 */
|
||||
{NID_ffdhe2048, 103, TLS_GROUP_FFDHE_FOR_TLS1_3, 0x0100}, /* ffdhe2048 (0x0100) */
|
||||
{NID_ffdhe3072, 125, TLS_GROUP_FFDHE_FOR_TLS1_3, 0x0101}, /* ffdhe3072 (0x0101) */
|
||||
{NID_ffdhe4096, 150, TLS_GROUP_FFDHE_FOR_TLS1_3, 0x0102}, /* ffdhe4096 (0x0102) */
|
||||
{NID_ffdhe6144, 175, TLS_GROUP_FFDHE_FOR_TLS1_3, 0x0103}, /* ffdhe6144 (0x0103) */
|
||||
{NID_ffdhe8192, 192, TLS_GROUP_FFDHE_FOR_TLS1_3, 0x0104}, /* ffdhe8192 (0x0104) */
|
||||
# endif /* OPENSSL_NO_DH */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static const unsigned char ecformats_default[] = {
|
||||
TLSEXT_ECPOINTFORMAT_uncompressed,
|
||||
TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime,
|
||||
TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2
|
||||
};
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
/* The default curves */
|
||||
static const uint16_t eccurves_default[] = {
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
static const uint16_t supported_groups_default[] = {
|
||||
# ifndef OPENSSL_NO_EC
|
||||
29, /* X25519 (29) */
|
||||
23, /* secp256r1 (23) */
|
||||
30, /* X448 (30) */
|
||||
25, /* secp521r1 (25) */
|
||||
24, /* secp384r1 (24) */
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_DH
|
||||
0x100, /* ffdhe2048 (0x100) */
|
||||
0x101, /* ffdhe3072 (0x101) */
|
||||
0x102, /* ffdhe4096 (0x102) */
|
||||
0x103, /* ffdhe6144 (0x103) */
|
||||
0x104, /* ffdhe8192 (0x104) */
|
||||
# endif
|
||||
};
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
static const uint16_t suiteb_curves[] = {
|
||||
TLSEXT_curve_P_256,
|
||||
TLSEXT_curve_P_384
|
||||
};
|
||||
#endif
|
||||
|
||||
const TLS_GROUP_INFO *tls1_group_id_lookup(uint16_t group_id)
|
||||
{
|
||||
/* ECC curves from RFC 4492 and RFC 7027 */
|
||||
if (group_id < 1 || group_id > OSSL_NELEM(nid_list))
|
||||
return NULL;
|
||||
return &nid_list[group_id - 1];
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
size_t i;
|
||||
|
||||
/* ECC curves from RFC 4492 and RFC 7027 FFDHE group from RFC 8446 */
|
||||
for (i = 0; i < OSSL_NELEM(nid_list); i++) {
|
||||
if (nid_list[i].group_id == group_id)
|
||||
return &nid_list[i];
|
||||
}
|
||||
#endif /* !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC) */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC)
|
||||
static uint16_t tls1_nid2group_id(int nid)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < OSSL_NELEM(nid_list); i++) {
|
||||
if (nid_list[i].nid == nid)
|
||||
return (uint16_t)(i + 1);
|
||||
return nid_list[i].group_id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
/*
|
||||
* Set *pgroups to the supported groups list and *pgroupslen to
|
||||
@@ -213,9 +245,10 @@ static uint16_t tls1_nid2group_id(int nid)
|
||||
void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups,
|
||||
size_t *pgroupslen)
|
||||
{
|
||||
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
/* For Suite B mode only include P-256, P-384 */
|
||||
switch (tls1_suiteb(s)) {
|
||||
# ifndef OPENSSL_NO_EC
|
||||
case SSL_CERT_FLAG_SUITEB_128_LOS:
|
||||
*pgroups = suiteb_curves;
|
||||
*pgroupslen = OSSL_NELEM(suiteb_curves);
|
||||
@@ -230,34 +263,54 @@ void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups,
|
||||
*pgroups = suiteb_curves + 1;
|
||||
*pgroupslen = 1;
|
||||
break;
|
||||
# endif
|
||||
|
||||
default:
|
||||
if (s->ext.supportedgroups == NULL) {
|
||||
*pgroups = eccurves_default;
|
||||
*pgroupslen = OSSL_NELEM(eccurves_default);
|
||||
*pgroups = supported_groups_default;
|
||||
*pgroupslen = OSSL_NELEM(supported_groups_default);
|
||||
} else {
|
||||
*pgroups = s->ext.supportedgroups;
|
||||
*pgroupslen = s->ext.supportedgroups_len;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#else
|
||||
*pgroups = NULL;
|
||||
*pgroupslen = 0;
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
}
|
||||
|
||||
/* See if curve is allowed by security callback */
|
||||
int tls_curve_allowed(SSL *s, uint16_t curve, int op)
|
||||
int tls_valid_group(SSL *s, uint16_t group_id, int version)
|
||||
{
|
||||
const TLS_GROUP_INFO *cinfo = tls1_group_id_lookup(curve);
|
||||
unsigned char ctmp[2];
|
||||
const TLS_GROUP_INFO *ginfo = tls1_group_id_lookup(group_id);
|
||||
|
||||
if (cinfo == NULL)
|
||||
if (version < TLS1_3_VERSION) {
|
||||
if ((ginfo->flags & TLS_GROUP_ONLY_FOR_TLS1_3) != 0)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* See if group is allowed by security callback */
|
||||
int tls_group_allowed(SSL *s, uint16_t group, int op)
|
||||
{
|
||||
const TLS_GROUP_INFO *ginfo = tls1_group_id_lookup(group);
|
||||
unsigned char gtmp[2];
|
||||
|
||||
if (ginfo == NULL)
|
||||
return 0;
|
||||
# ifdef OPENSSL_NO_EC2M
|
||||
if (cinfo->flags & TLS_CURVE_CHAR2)
|
||||
#ifdef OPENSSL_NO_EC2M
|
||||
if (ginfo->flags & TLS_GROUP_CURVE_CHAR2)
|
||||
return 0;
|
||||
# endif
|
||||
ctmp[0] = curve >> 8;
|
||||
ctmp[1] = curve & 0xff;
|
||||
return ssl_security(s, op, cinfo->secbits, cinfo->nid, (void *)ctmp);
|
||||
#endif
|
||||
#ifdef OPENSSL_NO_DH
|
||||
if (ginfo->flags & TLS_GROUP_FFDHE)
|
||||
return 0;
|
||||
#endif
|
||||
gtmp[0] = group >> 8;
|
||||
gtmp[1] = group & 0xff;
|
||||
return ssl_security(s, op, ginfo->secbits, ginfo->nid, (void *)gtmp);
|
||||
}
|
||||
|
||||
/* Return 1 if "id" is in "list" */
|
||||
@@ -320,7 +373,7 @@ uint16_t tls1_shared_group(SSL *s, int nmatch)
|
||||
uint16_t id = pref[i];
|
||||
|
||||
if (!tls1_in_list(id, supp, num_supp)
|
||||
|| !tls_curve_allowed(s, id, SSL_SECOP_CURVE_SHARED))
|
||||
|| !tls_group_allowed(s, id, SSL_SECOP_CURVE_SHARED))
|
||||
continue;
|
||||
if (nmatch == k)
|
||||
return id;
|
||||
@@ -335,13 +388,16 @@ uint16_t tls1_shared_group(SSL *s, int nmatch)
|
||||
int tls1_set_groups(uint16_t **pext, size_t *pextlen,
|
||||
int *groups, size_t ngroups)
|
||||
{
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
uint16_t *glist;
|
||||
size_t i;
|
||||
/*
|
||||
* Bitmap of groups included to detect duplicates: only works while group
|
||||
* ids < 32
|
||||
* Bitmap of groups included to detect duplicates: two variables are added
|
||||
* to detect duplicates as some values are more than 32.
|
||||
*/
|
||||
unsigned long dup_list = 0;
|
||||
unsigned long *dup_list = NULL;
|
||||
unsigned long dup_list_egrp = 0;
|
||||
unsigned long dup_list_dhgrp = 0;
|
||||
|
||||
if (ngroups == 0) {
|
||||
SSLerr(SSL_F_TLS1_SET_GROUPS, SSL_R_BAD_LENGTH);
|
||||
@@ -354,44 +410,53 @@ int tls1_set_groups(uint16_t **pext, size_t *pextlen,
|
||||
for (i = 0; i < ngroups; i++) {
|
||||
unsigned long idmask;
|
||||
uint16_t id;
|
||||
/* TODO(TLS1.3): Convert for DH groups */
|
||||
id = tls1_nid2group_id(groups[i]);
|
||||
idmask = 1L << id;
|
||||
if (!id || (dup_list & idmask)) {
|
||||
OPENSSL_free(glist);
|
||||
return 0;
|
||||
}
|
||||
dup_list |= idmask;
|
||||
if ((id & 0x00FF) >= (sizeof(unsigned long) * 8))
|
||||
goto err;
|
||||
idmask = 1L << (id & 0x00FF);
|
||||
dup_list = (id < 0x100) ? &dup_list_egrp : &dup_list_dhgrp;
|
||||
if (!id || ((*dup_list) & idmask))
|
||||
goto err;
|
||||
*dup_list |= idmask;
|
||||
glist[i] = id;
|
||||
}
|
||||
OPENSSL_free(*pext);
|
||||
*pext = glist;
|
||||
*pextlen = ngroups;
|
||||
return 1;
|
||||
err:
|
||||
OPENSSL_free(glist);
|
||||
return 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
}
|
||||
|
||||
# define MAX_CURVELIST OSSL_NELEM(nid_list)
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
# define MAX_GROUPLIST OSSL_NELEM(nid_list)
|
||||
|
||||
typedef struct {
|
||||
size_t nidcnt;
|
||||
int nid_arr[MAX_CURVELIST];
|
||||
int nid_arr[MAX_GROUPLIST];
|
||||
} nid_cb_st;
|
||||
|
||||
static int nid_cb(const char *elem, int len, void *arg)
|
||||
{
|
||||
nid_cb_st *narg = arg;
|
||||
size_t i;
|
||||
int nid;
|
||||
int nid = NID_undef;
|
||||
char etmp[20];
|
||||
if (elem == NULL)
|
||||
return 0;
|
||||
if (narg->nidcnt == MAX_CURVELIST)
|
||||
if (narg->nidcnt == MAX_GROUPLIST)
|
||||
return 0;
|
||||
if (len > (int)(sizeof(etmp) - 1))
|
||||
return 0;
|
||||
memcpy(etmp, elem, len);
|
||||
etmp[len] = 0;
|
||||
# ifndef OPENSSL_NO_EC
|
||||
nid = EC_curve_nist2nid(etmp);
|
||||
# endif
|
||||
if (nid == NID_undef)
|
||||
nid = OBJ_sn2nid(etmp);
|
||||
if (nid == NID_undef)
|
||||
@@ -404,10 +469,12 @@ static int nid_cb(const char *elem, int len, void *arg)
|
||||
narg->nid_arr[narg->nidcnt++] = nid;
|
||||
return 1;
|
||||
}
|
||||
#endif /* !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH) */
|
||||
|
||||
/* Set groups based on a colon separate list */
|
||||
int tls1_set_groups_list(uint16_t **pext, size_t *pextlen, const char *str)
|
||||
{
|
||||
#if !defined(OPENSSL_NO_EC) || !defined(OPENSSL_NO_DH)
|
||||
nid_cb_st ncb;
|
||||
ncb.nidcnt = 0;
|
||||
if (!CONF_parse_list(str, ':', 1, nid_cb, &ncb))
|
||||
@@ -415,17 +482,82 @@ int tls1_set_groups_list(uint16_t **pext, size_t *pextlen, const char *str)
|
||||
if (pext == NULL)
|
||||
return 1;
|
||||
return tls1_set_groups(pext, pextlen, ncb.nid_arr, ncb.nidcnt);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
/* Return group id of a key */
|
||||
static uint16_t tls1_get_group_id(EVP_PKEY *pkey)
|
||||
{
|
||||
EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
|
||||
const EC_GROUP *grp;
|
||||
|
||||
if (ec == NULL)
|
||||
/* Check a group id matches preferences */
|
||||
int tls1_check_group_id(SSL *s, uint16_t group_id, int check_own_groups)
|
||||
{
|
||||
const uint16_t *groups;
|
||||
size_t groups_len;
|
||||
|
||||
if (group_id == 0)
|
||||
return 0;
|
||||
grp = EC_KEY_get0_group(ec);
|
||||
return tls1_nid2group_id(EC_GROUP_get_curve_name(grp));
|
||||
|
||||
/* Check for Suite B compliance */
|
||||
if (tls1_suiteb(s) && s->s3.tmp.new_cipher != NULL) {
|
||||
unsigned long cid = s->s3.tmp.new_cipher->id;
|
||||
|
||||
if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) {
|
||||
if (group_id != TLSEXT_curve_P_256)
|
||||
return 0;
|
||||
} else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) {
|
||||
if (group_id != TLSEXT_curve_P_384)
|
||||
return 0;
|
||||
} else {
|
||||
/* Should never happen */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (check_own_groups) {
|
||||
/* Check group is one of our preferences */
|
||||
tls1_get_supported_groups(s, &groups, &groups_len);
|
||||
if (!tls1_in_list(group_id, groups, groups_len))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!tls_group_allowed(s, group_id, SSL_SECOP_CURVE_CHECK))
|
||||
return 0;
|
||||
|
||||
/* For clients, nothing more to check */
|
||||
if (!s->server)
|
||||
return 1;
|
||||
|
||||
/* Check group is one of peers preferences */
|
||||
tls1_get_peer_groups(s, &groups, &groups_len);
|
||||
|
||||
/*
|
||||
* RFC 4492 does not require the supported elliptic curves extension
|
||||
* so if it is not sent we can just choose any curve.
|
||||
* It is invalid to send an empty list in the supported groups
|
||||
* extension, so groups_len == 0 always means no extension.
|
||||
*/
|
||||
if (groups_len == 0)
|
||||
return 1;
|
||||
return tls1_in_list(group_id, groups, groups_len);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
|
||||
size_t *num_formats)
|
||||
{
|
||||
/*
|
||||
* If we have a custom point format list use it otherwise use default
|
||||
*/
|
||||
if (s->ext.ecpointformats) {
|
||||
*pformats = s->ext.ecpointformats;
|
||||
*num_formats = s->ext.ecpointformats_len;
|
||||
} else {
|
||||
*pformats = ecformats_default;
|
||||
/* For Suite B we don't support char2 fields */
|
||||
if (tls1_suiteb(s))
|
||||
*num_formats = sizeof(ecformats_default) - 1;
|
||||
else
|
||||
*num_formats = sizeof(ecformats_default);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check a key is compatible with compression extension */
|
||||
@@ -465,86 +597,26 @@ static int tls1_check_pkey_comp(SSL *s, EVP_PKEY *pkey)
|
||||
* If point formats extension present check it, otherwise everything is
|
||||
* supported (see RFC4492).
|
||||
*/
|
||||
if (s->session->ext.ecpointformats == NULL)
|
||||
if (s->ext.peer_ecpointformats == NULL)
|
||||
return 1;
|
||||
|
||||
for (i = 0; i < s->session->ext.ecpointformats_len; i++) {
|
||||
if (s->session->ext.ecpointformats[i] == comp_id)
|
||||
for (i = 0; i < s->ext.peer_ecpointformats_len; i++) {
|
||||
if (s->ext.peer_ecpointformats[i] == comp_id)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check a group id matches preferences */
|
||||
int tls1_check_group_id(SSL *s, uint16_t group_id, int check_own_groups)
|
||||
{
|
||||
const uint16_t *groups;
|
||||
size_t groups_len;
|
||||
|
||||
if (group_id == 0)
|
||||
return 0;
|
||||
|
||||
/* Check for Suite B compliance */
|
||||
if (tls1_suiteb(s) && s->s3.tmp.new_cipher != NULL) {
|
||||
unsigned long cid = s->s3.tmp.new_cipher->id;
|
||||
|
||||
if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) {
|
||||
if (group_id != TLSEXT_curve_P_256)
|
||||
return 0;
|
||||
} else if (cid == TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384) {
|
||||
if (group_id != TLSEXT_curve_P_384)
|
||||
return 0;
|
||||
} else {
|
||||
/* Should never happen */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (check_own_groups) {
|
||||
/* Check group is one of our preferences */
|
||||
tls1_get_supported_groups(s, &groups, &groups_len);
|
||||
if (!tls1_in_list(group_id, groups, groups_len))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!tls_curve_allowed(s, group_id, SSL_SECOP_CURVE_CHECK))
|
||||
return 0;
|
||||
|
||||
/* For clients, nothing more to check */
|
||||
if (!s->server)
|
||||
return 1;
|
||||
|
||||
/* Check group is one of peers preferences */
|
||||
tls1_get_peer_groups(s, &groups, &groups_len);
|
||||
|
||||
/*
|
||||
* RFC 4492 does not require the supported elliptic curves extension
|
||||
* so if it is not sent we can just choose any curve.
|
||||
* It is invalid to send an empty list in the supported groups
|
||||
* extension, so groups_len == 0 always means no extension.
|
||||
*/
|
||||
if (groups_len == 0)
|
||||
return 1;
|
||||
return tls1_in_list(group_id, groups, groups_len);
|
||||
}
|
||||
|
||||
void tls1_get_formatlist(SSL *s, const unsigned char **pformats,
|
||||
size_t *num_formats)
|
||||
/* Return group id of a key */
|
||||
static uint16_t tls1_get_group_id(EVP_PKEY *pkey)
|
||||
{
|
||||
/*
|
||||
* If we have a custom point format list use it otherwise use default
|
||||
*/
|
||||
if (s->ext.ecpointformats) {
|
||||
*pformats = s->ext.ecpointformats;
|
||||
*num_formats = s->ext.ecpointformats_len;
|
||||
} else {
|
||||
*pformats = ecformats_default;
|
||||
/* For Suite B we don't support char2 fields */
|
||||
if (tls1_suiteb(s))
|
||||
*num_formats = sizeof(ecformats_default) - 1;
|
||||
else
|
||||
*num_formats = sizeof(ecformats_default);
|
||||
}
|
||||
EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
|
||||
const EC_GROUP *grp;
|
||||
|
||||
if (ec == NULL)
|
||||
return 0;
|
||||
grp = EC_KEY_get0_group(ec);
|
||||
return tls1_nid2group_id(EC_GROUP_get_curve_name(grp));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -578,7 +650,6 @@ static int tls1_check_cert_param(SSL *s, X509 *x, int check_ee_md)
|
||||
if (check_ee_md && tls1_suiteb(s)) {
|
||||
int check_md;
|
||||
size_t i;
|
||||
CERT *c = s->cert;
|
||||
|
||||
/* Check to see we have necessary signing algorithm */
|
||||
if (group_id == TLSEXT_curve_P_256)
|
||||
@@ -587,8 +658,8 @@ static int tls1_check_cert_param(SSL *s, X509 *x, int check_ee_md)
|
||||
check_md = NID_ecdsa_with_SHA384;
|
||||
else
|
||||
return 0; /* Should never happen */
|
||||
for (i = 0; i < c->shared_sigalgslen; i++) {
|
||||
if (check_md == c->shared_sigalgs[i]->sigandhash)
|
||||
for (i = 0; i < s->shared_sigalgslen; i++) {
|
||||
if (check_md == s->shared_sigalgs[i]->sigandhash)
|
||||
return 1;;
|
||||
}
|
||||
return 0;
|
||||
@@ -1215,9 +1286,9 @@ int tls1_set_server_sigalgs(SSL *s)
|
||||
size_t i;
|
||||
|
||||
/* Clear any shared signature algorithms */
|
||||
OPENSSL_free(s->cert->shared_sigalgs);
|
||||
s->cert->shared_sigalgs = NULL;
|
||||
s->cert->shared_sigalgslen = 0;
|
||||
OPENSSL_free(s->shared_sigalgs);
|
||||
s->shared_sigalgs = NULL;
|
||||
s->shared_sigalgslen = 0;
|
||||
/* Clear certificate validity flags */
|
||||
for (i = 0; i < SSL_PKEY_NUM; i++)
|
||||
s->s3.tmp.valid_flags[i] = 0;
|
||||
@@ -1252,7 +1323,7 @@ int tls1_set_server_sigalgs(SSL *s)
|
||||
SSL_F_TLS1_SET_SERVER_SIGALGS, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
if (s->cert->shared_sigalgs != NULL)
|
||||
if (s->shared_sigalgs != NULL)
|
||||
return 1;
|
||||
|
||||
/* Fatal error if no shared signature algorithms */
|
||||
@@ -1724,9 +1795,9 @@ static int tls1_set_shared_sigalgs(SSL *s)
|
||||
CERT *c = s->cert;
|
||||
unsigned int is_suiteb = tls1_suiteb(s);
|
||||
|
||||
OPENSSL_free(c->shared_sigalgs);
|
||||
c->shared_sigalgs = NULL;
|
||||
c->shared_sigalgslen = 0;
|
||||
OPENSSL_free(s->shared_sigalgs);
|
||||
s->shared_sigalgs = NULL;
|
||||
s->shared_sigalgslen = 0;
|
||||
/* If client use client signature algorithms if not NULL */
|
||||
if (!s->server && c->client_sigalgs && !is_suiteb) {
|
||||
conf = c->client_sigalgs;
|
||||
@@ -1757,8 +1828,8 @@ static int tls1_set_shared_sigalgs(SSL *s)
|
||||
} else {
|
||||
salgs = NULL;
|
||||
}
|
||||
c->shared_sigalgs = salgs;
|
||||
c->shared_sigalgslen = nmatch;
|
||||
s->shared_sigalgs = salgs;
|
||||
s->shared_sigalgslen = nmatch;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1819,7 +1890,6 @@ int tls1_process_sigalgs(SSL *s)
|
||||
{
|
||||
size_t i;
|
||||
uint32_t *pvalid = s->s3.tmp.valid_flags;
|
||||
CERT *c = s->cert;
|
||||
|
||||
if (!tls1_set_shared_sigalgs(s))
|
||||
return 0;
|
||||
@@ -1827,8 +1897,8 @@ int tls1_process_sigalgs(SSL *s)
|
||||
for (i = 0; i < SSL_PKEY_NUM; i++)
|
||||
pvalid[i] = 0;
|
||||
|
||||
for (i = 0; i < c->shared_sigalgslen; i++) {
|
||||
const SIGALG_LOOKUP *sigptr = c->shared_sigalgs[i];
|
||||
for (i = 0; i < s->shared_sigalgslen; i++) {
|
||||
const SIGALG_LOOKUP *sigptr = s->shared_sigalgs[i];
|
||||
int idx = sigptr->sig_idx;
|
||||
|
||||
/* Ignore PKCS1 based sig algs in TLSv1.3 */
|
||||
@@ -1875,12 +1945,12 @@ int SSL_get_shared_sigalgs(SSL *s, int idx,
|
||||
unsigned char *rsig, unsigned char *rhash)
|
||||
{
|
||||
const SIGALG_LOOKUP *shsigalgs;
|
||||
if (s->cert->shared_sigalgs == NULL
|
||||
if (s->shared_sigalgs == NULL
|
||||
|| idx < 0
|
||||
|| idx >= (int)s->cert->shared_sigalgslen
|
||||
|| s->cert->shared_sigalgslen > INT_MAX)
|
||||
|| idx >= (int)s->shared_sigalgslen
|
||||
|| s->shared_sigalgslen > INT_MAX)
|
||||
return 0;
|
||||
shsigalgs = s->cert->shared_sigalgs[idx];
|
||||
shsigalgs = s->shared_sigalgs[idx];
|
||||
if (phash != NULL)
|
||||
*phash = shsigalgs->hash;
|
||||
if (psign != NULL)
|
||||
@@ -1891,7 +1961,7 @@ int SSL_get_shared_sigalgs(SSL *s, int idx,
|
||||
*rsig = (unsigned char)(shsigalgs->sigalg & 0xff);
|
||||
if (rhash != NULL)
|
||||
*rhash = (unsigned char)((shsigalgs->sigalg >> 8) & 0xff);
|
||||
return (int)s->cert->shared_sigalgslen;
|
||||
return (int)s->shared_sigalgslen;
|
||||
}
|
||||
|
||||
/* Maximum possible number of unique entries in sigalgs array */
|
||||
@@ -2072,7 +2142,7 @@ int tls1_set_sigalgs(CERT *c, const int *psig_nids, size_t salglen, int client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
|
||||
static int tls1_check_sig_alg(SSL *s, X509 *x, int default_nid)
|
||||
{
|
||||
int sig_nid;
|
||||
size_t i;
|
||||
@@ -2081,8 +2151,8 @@ static int tls1_check_sig_alg(CERT *c, X509 *x, int default_nid)
|
||||
sig_nid = X509_get_signature_nid(x);
|
||||
if (default_nid)
|
||||
return sig_nid == default_nid ? 1 : 0;
|
||||
for (i = 0; i < c->shared_sigalgslen; i++)
|
||||
if (sig_nid == c->shared_sigalgs[i]->sigandhash)
|
||||
for (i = 0; i < s->shared_sigalgslen; i++)
|
||||
if (sig_nid == s->shared_sigalgs[i]->sigandhash)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -2240,14 +2310,14 @@ int tls1_check_chain(SSL *s, X509 *x, EVP_PKEY *pk, STACK_OF(X509) *chain,
|
||||
}
|
||||
}
|
||||
/* Check signature algorithm of each cert in chain */
|
||||
if (!tls1_check_sig_alg(c, x, default_nid)) {
|
||||
if (!tls1_check_sig_alg(s, x, default_nid)) {
|
||||
if (!check_flags)
|
||||
goto end;
|
||||
} else
|
||||
rv |= CERT_PKEY_EE_SIGNATURE;
|
||||
rv |= CERT_PKEY_CA_SIGNATURE;
|
||||
for (i = 0; i < sk_X509_num(chain); i++) {
|
||||
if (!tls1_check_sig_alg(c, sk_X509_value(chain, i), default_nid)) {
|
||||
if (!tls1_check_sig_alg(s, sk_X509_value(chain, i), default_nid)) {
|
||||
if (check_flags) {
|
||||
rv &= ~CERT_PKEY_CA_SIGNATURE;
|
||||
break;
|
||||
@@ -2612,8 +2682,8 @@ int tls_choose_sigalg(SSL *s, int fatalerrs)
|
||||
#endif
|
||||
|
||||
/* Look for a certificate matching shared sigalgs */
|
||||
for (i = 0; i < s->cert->shared_sigalgslen; i++) {
|
||||
lu = s->cert->shared_sigalgs[i];
|
||||
for (i = 0; i < s->shared_sigalgslen; i++) {
|
||||
lu = s->shared_sigalgs[i];
|
||||
sig_idx = -1;
|
||||
|
||||
/* Skip SHA1, SHA224, DSA and RSA if not PSS */
|
||||
@@ -2647,7 +2717,7 @@ int tls_choose_sigalg(SSL *s, int fatalerrs)
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (i == s->cert->shared_sigalgslen) {
|
||||
if (i == s->shared_sigalgslen) {
|
||||
if (!fatalerrs)
|
||||
return 1;
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_CHOOSE_SIGALG,
|
||||
@@ -2680,8 +2750,8 @@ int tls_choose_sigalg(SSL *s, int fatalerrs)
|
||||
* Find highest preference signature algorithm matching
|
||||
* cert type
|
||||
*/
|
||||
for (i = 0; i < s->cert->shared_sigalgslen; i++) {
|
||||
lu = s->cert->shared_sigalgs[i];
|
||||
for (i = 0; i < s->shared_sigalgslen; i++) {
|
||||
lu = s->shared_sigalgs[i];
|
||||
|
||||
if (s->server) {
|
||||
if ((sig_idx = tls12_get_cert_sigalg_idx(s, lu)) == -1)
|
||||
@@ -2708,7 +2778,7 @@ int tls_choose_sigalg(SSL *s, int fatalerrs)
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if (i == s->cert->shared_sigalgslen) {
|
||||
if (i == s->shared_sigalgslen) {
|
||||
if (!fatalerrs)
|
||||
return 1;
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
|
||||
@@ -170,6 +170,7 @@ int tls13_generate_secret(SSL *s, const EVP_MD *md,
|
||||
if (!ossl_assert(mdleni >= 0)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_GENERATE_SECRET,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
EVP_KDF_CTX_free(kctx);
|
||||
return 0;
|
||||
}
|
||||
mdlen = (size_t)mdleni;
|
||||
|
||||
Reference in New Issue
Block a user