Update - OpenSSL 1.1.1-pre7-dev
This commit is contained in:
+211
-175
@@ -18,6 +18,7 @@
|
||||
#include <openssl/rand.h>
|
||||
#include "internal/cryptlib.h"
|
||||
|
||||
#define TLS13_NUM_CIPHERS OSSL_NELEM(tls13_ciphers)
|
||||
#define SSL3_NUM_CIPHERS OSSL_NELEM(ssl3_ciphers)
|
||||
#define SSL3_NUM_SCSVS OSSL_NELEM(ssl3_scsvs)
|
||||
|
||||
@@ -29,6 +30,90 @@ const unsigned char tls12downgrade[] = {
|
||||
0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x01
|
||||
};
|
||||
|
||||
/* The list of available TLSv1.3 ciphers */
|
||||
static SSL_CIPHER tls13_ciphers[] = {
|
||||
{
|
||||
1,
|
||||
TLS1_3_RFC_AES_128_GCM_SHA256,
|
||||
TLS1_3_RFC_AES_128_GCM_SHA256,
|
||||
TLS1_3_CK_AES_128_GCM_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES128GCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
}, {
|
||||
1,
|
||||
TLS1_3_RFC_AES_256_GCM_SHA384,
|
||||
TLS1_3_RFC_AES_256_GCM_SHA384,
|
||||
TLS1_3_CK_AES_256_GCM_SHA384,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES256GCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA384,
|
||||
256,
|
||||
256,
|
||||
},
|
||||
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
|
||||
{
|
||||
1,
|
||||
TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
|
||||
TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
|
||||
TLS1_3_CK_CHACHA20_POLY1305_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_CHACHA20POLY1305,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
256,
|
||||
256,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
1,
|
||||
TLS1_3_RFC_AES_128_CCM_SHA256,
|
||||
TLS1_3_RFC_AES_128_CCM_SHA256,
|
||||
TLS1_3_CK_AES_128_CCM_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES128CCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_NOT_DEFAULT | SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
}, {
|
||||
1,
|
||||
TLS1_3_RFC_AES_128_CCM_8_SHA256,
|
||||
TLS1_3_RFC_AES_128_CCM_8_SHA256,
|
||||
TLS1_3_CK_AES_128_CCM_8_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES128CCM8,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_NOT_DEFAULT | SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* The list of available ciphers, mostly organized into the following
|
||||
* groups:
|
||||
@@ -858,88 +943,6 @@ static SSL_CIPHER ssl3_ciphers[] = {
|
||||
256,
|
||||
256,
|
||||
},
|
||||
{
|
||||
1,
|
||||
TLS1_3_TXT_AES_128_GCM_SHA256,
|
||||
TLS1_3_RFC_AES_128_GCM_SHA256,
|
||||
TLS1_3_CK_AES_128_GCM_SHA256,
|
||||
0, 0,
|
||||
SSL_AES128GCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
},
|
||||
{
|
||||
1,
|
||||
TLS1_3_TXT_AES_256_GCM_SHA384,
|
||||
TLS1_3_RFC_AES_256_GCM_SHA384,
|
||||
TLS1_3_CK_AES_256_GCM_SHA384,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES256GCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA384,
|
||||
256,
|
||||
256,
|
||||
},
|
||||
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
|
||||
{
|
||||
1,
|
||||
TLS1_3_TXT_CHACHA20_POLY1305_SHA256,
|
||||
TLS1_3_RFC_CHACHA20_POLY1305_SHA256,
|
||||
TLS1_3_CK_CHACHA20_POLY1305_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_CHACHA20POLY1305,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
256,
|
||||
256,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
1,
|
||||
TLS1_3_TXT_AES_128_CCM_SHA256,
|
||||
TLS1_3_RFC_AES_128_CCM_SHA256,
|
||||
TLS1_3_CK_AES_128_CCM_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES128CCM,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_NOT_DEFAULT | SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
},
|
||||
{
|
||||
1,
|
||||
TLS1_3_TXT_AES_128_CCM_8_SHA256,
|
||||
TLS1_3_RFC_AES_128_CCM_8_SHA256,
|
||||
TLS1_3_CK_AES_128_CCM_8_SHA256,
|
||||
SSL_kANY,
|
||||
SSL_aANY,
|
||||
SSL_AES128CCM8,
|
||||
SSL_AEAD,
|
||||
TLS1_3_VERSION, TLS1_3_VERSION,
|
||||
0, 0,
|
||||
SSL_NOT_DEFAULT | SSL_HIGH,
|
||||
SSL_HANDSHAKE_MAC_SHA256,
|
||||
128,
|
||||
128,
|
||||
},
|
||||
{
|
||||
1,
|
||||
TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA,
|
||||
@@ -3207,6 +3210,8 @@ static int cipher_compare(const void *a, const void *b)
|
||||
|
||||
void ssl_sort_cipher_list(void)
|
||||
{
|
||||
qsort(tls13_ciphers, TLS13_NUM_CIPHERS, sizeof(tls13_ciphers[0]),
|
||||
cipher_compare);
|
||||
qsort(ssl3_ciphers, SSL3_NUM_CIPHERS, sizeof(ssl3_ciphers[0]),
|
||||
cipher_compare);
|
||||
qsort(ssl3_scsvs, SSL3_NUM_SCSVS, sizeof(ssl3_scsvs[0]), cipher_compare);
|
||||
@@ -3793,8 +3798,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
|
||||
{
|
||||
unsigned char *keys = parg;
|
||||
long tick_keylen = (sizeof(ctx->ext.tick_key_name) +
|
||||
sizeof(ctx->ext.tick_hmac_key) +
|
||||
sizeof(ctx->ext.tick_aes_key));
|
||||
sizeof(ctx->ext.secure->tick_hmac_key) +
|
||||
sizeof(ctx->ext.secure->tick_aes_key));
|
||||
if (keys == NULL)
|
||||
return tick_keylen;
|
||||
if (larg != tick_keylen) {
|
||||
@@ -3804,23 +3809,23 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
|
||||
if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) {
|
||||
memcpy(ctx->ext.tick_key_name, keys,
|
||||
sizeof(ctx->ext.tick_key_name));
|
||||
memcpy(ctx->ext.tick_hmac_key,
|
||||
memcpy(ctx->ext.secure->tick_hmac_key,
|
||||
keys + sizeof(ctx->ext.tick_key_name),
|
||||
sizeof(ctx->ext.tick_hmac_key));
|
||||
memcpy(ctx->ext.tick_aes_key,
|
||||
sizeof(ctx->ext.secure->tick_hmac_key));
|
||||
memcpy(ctx->ext.secure->tick_aes_key,
|
||||
keys + sizeof(ctx->ext.tick_key_name) +
|
||||
sizeof(ctx->ext.tick_hmac_key),
|
||||
sizeof(ctx->ext.tick_aes_key));
|
||||
sizeof(ctx->ext.secure->tick_hmac_key),
|
||||
sizeof(ctx->ext.secure->tick_aes_key));
|
||||
} else {
|
||||
memcpy(keys, ctx->ext.tick_key_name,
|
||||
sizeof(ctx->ext.tick_key_name));
|
||||
memcpy(keys + sizeof(ctx->ext.tick_key_name),
|
||||
ctx->ext.tick_hmac_key,
|
||||
sizeof(ctx->ext.tick_hmac_key));
|
||||
ctx->ext.secure->tick_hmac_key,
|
||||
sizeof(ctx->ext.secure->tick_hmac_key));
|
||||
memcpy(keys + sizeof(ctx->ext.tick_key_name) +
|
||||
sizeof(ctx->ext.tick_hmac_key),
|
||||
ctx->ext.tick_aes_key,
|
||||
sizeof(ctx->ext.tick_aes_key));
|
||||
sizeof(ctx->ext.secure->tick_hmac_key),
|
||||
ctx->ext.secure->tick_aes_key,
|
||||
sizeof(ctx->ext.secure->tick_aes_key));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -4027,6 +4032,9 @@ const SSL_CIPHER *ssl3_get_cipher_by_id(uint32_t id)
|
||||
const SSL_CIPHER *cp;
|
||||
|
||||
c.id = id;
|
||||
cp = OBJ_bsearch_ssl_cipher_id(&c, tls13_ciphers, TLS13_NUM_CIPHERS);
|
||||
if (cp != NULL)
|
||||
return cp;
|
||||
cp = OBJ_bsearch_ssl_cipher_id(&c, ssl3_ciphers, SSL3_NUM_CIPHERS);
|
||||
if (cp != NULL)
|
||||
return cp;
|
||||
@@ -4035,17 +4043,19 @@ const SSL_CIPHER *ssl3_get_cipher_by_id(uint32_t id)
|
||||
|
||||
const SSL_CIPHER *ssl3_get_cipher_by_std_name(const char *stdname)
|
||||
{
|
||||
SSL_CIPHER *c = NULL;
|
||||
SSL_CIPHER *tbl = ssl3_ciphers;
|
||||
size_t i;
|
||||
SSL_CIPHER *c = NULL, *tbl;
|
||||
SSL_CIPHER *alltabs[] = {tls13_ciphers, ssl3_ciphers};
|
||||
size_t i, j, tblsize[] = {TLS13_NUM_CIPHERS, SSL3_NUM_CIPHERS};
|
||||
|
||||
/* this is not efficient, necessary to optimize this? */
|
||||
for (i = 0; i < SSL3_NUM_CIPHERS; i++, tbl++) {
|
||||
if (tbl->stdname == NULL)
|
||||
continue;
|
||||
if (strcmp(stdname, tbl->stdname) == 0) {
|
||||
c = tbl;
|
||||
break;
|
||||
for (j = 0; j < OSSL_NELEM(alltabs); j++) {
|
||||
for (i = 0, tbl = alltabs[j]; i < tblsize[j]; i++, tbl++) {
|
||||
if (tbl->stdname == NULL)
|
||||
continue;
|
||||
if (strcmp(stdname, tbl->stdname) == 0) {
|
||||
c = tbl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (c == NULL) {
|
||||
@@ -4085,17 +4095,6 @@ int ssl3_put_cipher_by_char(const SSL_CIPHER *c, WPACKET *pkt, size_t *len)
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct ssl_cipher_preference_list_st* ssl_get_cipher_preferences(SSL *s)
|
||||
{
|
||||
if (s->cipher_list != NULL)
|
||||
return (s->cipher_list);
|
||||
|
||||
if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL))
|
||||
return (s->ctx->cipher_list);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* ssl3_choose_cipher - choose a cipher from those offered by the client
|
||||
* @s: SSL connection
|
||||
@@ -4105,23 +4104,16 @@ struct ssl_cipher_preference_list_st* ssl_get_cipher_preferences(SSL *s)
|
||||
* Returns the selected cipher or NULL when no common ciphers.
|
||||
*/
|
||||
const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
struct ssl_cipher_preference_list_st
|
||||
*server_pref)
|
||||
STACK_OF(SSL_CIPHER) *srvr)
|
||||
{
|
||||
const SSL_CIPHER *c, *ret = NULL;
|
||||
STACK_OF(SSL_CIPHER) *srvr = server_pref->ciphers, *prio, *allow;
|
||||
int i, ii, ok, safari_ec = 0;
|
||||
STACK_OF(SSL_CIPHER) *prio, *allow;
|
||||
int i, ii, ok, prefer_sha256 = 0;
|
||||
unsigned long alg_k = 0, alg_a = 0, mask_k = 0, mask_a = 0;
|
||||
|
||||
/* in_group_flags will either be NULL, or will point to an array of
|
||||
* bytes which indicate equal-preference groups in the |prio| stack.
|
||||
* See the comment about |in_group_flags| in the
|
||||
* |ssl_cipher_preference_list_st| struct. */
|
||||
const uint8_t *in_group_flags;
|
||||
|
||||
/* group_min contains the minimal index so far found in a group, or -1
|
||||
* if no such value exists yet. */
|
||||
int group_min = -1;
|
||||
const EVP_MD *mdsha256 = EVP_sha256();
|
||||
#ifndef OPENSSL_NO_CHACHA
|
||||
STACK_OF(SSL_CIPHER) *prio_chacha = NULL;
|
||||
#endif
|
||||
|
||||
/* Let's see which ciphers we can support */
|
||||
|
||||
@@ -4148,17 +4140,77 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
#endif
|
||||
|
||||
/* SUITE-B takes precedence over server preference and ChaCha priortiy */
|
||||
if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || tls1_suiteb(s)) {
|
||||
if (tls1_suiteb(s)) {
|
||||
prio = srvr;
|
||||
in_group_flags = server_pref->in_group_flags;
|
||||
allow = clnt;
|
||||
} else if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
|
||||
prio = srvr;
|
||||
allow = clnt;
|
||||
#ifndef OPENSSL_NO_CHACHA
|
||||
/* If ChaCha20 is at the top of the client preference list,
|
||||
and there are ChaCha20 ciphers in the server list, then
|
||||
temporarily prioritize all ChaCha20 ciphers in the servers list. */
|
||||
if (s->options & SSL_OP_PRIORITIZE_CHACHA && sk_SSL_CIPHER_num(clnt) > 0) {
|
||||
c = sk_SSL_CIPHER_value(clnt, 0);
|
||||
if (c->algorithm_enc == SSL_CHACHA20POLY1305) {
|
||||
/* ChaCha20 is client preferred, check server... */
|
||||
int num = sk_SSL_CIPHER_num(srvr);
|
||||
int found = 0;
|
||||
for (i = 0; i < num; i++) {
|
||||
c = sk_SSL_CIPHER_value(srvr, i);
|
||||
if (c->algorithm_enc == SSL_CHACHA20POLY1305) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
prio_chacha = sk_SSL_CIPHER_new_reserve(NULL, num);
|
||||
/* if reserve fails, then there's likely a memory issue */
|
||||
if (prio_chacha != NULL) {
|
||||
/* Put all ChaCha20 at the top, starting with the one we just found */
|
||||
sk_SSL_CIPHER_push(prio_chacha, c);
|
||||
for (i++; i < num; i++) {
|
||||
c = sk_SSL_CIPHER_value(srvr, i);
|
||||
if (c->algorithm_enc == SSL_CHACHA20POLY1305)
|
||||
sk_SSL_CIPHER_push(prio_chacha, c);
|
||||
}
|
||||
/* Pull in the rest */
|
||||
for (i = 0; i < num; i++) {
|
||||
c = sk_SSL_CIPHER_value(srvr, i);
|
||||
if (c->algorithm_enc != SSL_CHACHA20POLY1305)
|
||||
sk_SSL_CIPHER_push(prio_chacha, c);
|
||||
}
|
||||
prio = prio_chacha;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
} else {
|
||||
prio = clnt;
|
||||
in_group_flags = NULL;
|
||||
allow = srvr;
|
||||
}
|
||||
|
||||
if (!SSL_IS_TLS13(s)) {
|
||||
if (SSL_IS_TLS13(s)) {
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
int j;
|
||||
|
||||
/*
|
||||
* If we allow "old" style PSK callbacks, and we have no certificate (so
|
||||
* we're not going to succeed without a PSK anyway), and we're in
|
||||
* TLSv1.3 then the default hash for a PSK is SHA-256 (as per the
|
||||
* TLSv1.3 spec). Therefore we should prioritise ciphersuites using
|
||||
* that.
|
||||
*/
|
||||
if (s->psk_server_callback != NULL) {
|
||||
for (j = 0; j < SSL_PKEY_NUM && !ssl_has_cert(s, j); j++);
|
||||
if (j == SSL_PKEY_NUM) {
|
||||
/* There are no certificates */
|
||||
prefer_sha256 = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
tls1_set_cert_validity(s);
|
||||
ssl_set_masks(s);
|
||||
}
|
||||
@@ -4166,16 +4218,14 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) {
|
||||
c = sk_SSL_CIPHER_value(prio, i);
|
||||
|
||||
ok = 1;
|
||||
|
||||
/* Skip ciphers not supported by the protocol version */
|
||||
if (!SSL_IS_DTLS(s) &&
|
||||
((s->version < c->min_tls) || (s->version > c->max_tls)))
|
||||
ok = 0;
|
||||
continue;
|
||||
if (SSL_IS_DTLS(s) &&
|
||||
(DTLS_VERSION_LT(s->version, c->min_dtls) ||
|
||||
DTLS_VERSION_GT(s->version, c->max_dtls)))
|
||||
ok = 0;
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Since TLS 1.3 ciphersuites can be used with any auth or
|
||||
@@ -4197,10 +4247,10 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
/* with PSK there must be server callback set */
|
||||
if ((alg_k & SSL_PSK) && s->psk_server_callback == NULL)
|
||||
ok = 0;
|
||||
continue;
|
||||
#endif /* OPENSSL_NO_PSK */
|
||||
|
||||
ok = ok && (alg_k & mask_k) && (alg_a & mask_a);
|
||||
ok = (alg_k & mask_k) && (alg_a & mask_a);
|
||||
#ifdef CIPHER_DEBUG
|
||||
fprintf(stderr, "%d:[%08lX:%08lX:%08lX:%08lX]%p:%s\n", ok, alg_k,
|
||||
alg_a, mask_k, mask_a, (void *)c, c->name);
|
||||
@@ -4217,14 +4267,6 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
|
||||
if (!ok)
|
||||
continue;
|
||||
|
||||
safari_ec = 0;
|
||||
#if !defined(OPENSSL_NO_EC)
|
||||
if ((alg_k & SSL_kECDHE) && (alg_a & SSL_aECDSA)) {
|
||||
if (s->s3->is_probably_safari)
|
||||
safari_ec = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
ii = sk_SSL_CIPHER_find(allow, c);
|
||||
if (ii >= 0) {
|
||||
@@ -4232,38 +4274,32 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
if (!ssl_security(s, SSL_SECOP_CIPHER_SHARED,
|
||||
c->strength_bits, 0, (void *)c))
|
||||
continue;
|
||||
|
||||
if (in_group_flags != NULL && in_group_flags[i] == 1) {
|
||||
/* This element of |prio| is in a group. Update
|
||||
* the minimum index found so far and continue
|
||||
* looking. */
|
||||
if (group_min == -1 || group_min > ii)
|
||||
group_min = ii;
|
||||
} else {
|
||||
if (group_min != -1 && group_min < ii)
|
||||
ii = group_min;
|
||||
if (safari_ec) {
|
||||
if (!ret)
|
||||
ret = sk_SSL_CIPHER_value(allow, ii);
|
||||
continue;
|
||||
}
|
||||
ret = sk_SSL_CIPHER_value(allow, ii);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (in_group_flags != NULL && !in_group_flags[i] && group_min != -1) {
|
||||
/* We are about to leave a group, but we found a match
|
||||
* in it, so that's our answer. */
|
||||
if (safari_ec) {
|
||||
#if !defined(OPENSSL_NO_EC)
|
||||
if ((alg_k & SSL_kECDHE) && (alg_a & SSL_aECDSA)
|
||||
&& s->s3->is_probably_safari) {
|
||||
if (!ret)
|
||||
ret = sk_SSL_CIPHER_value(allow, group_min);
|
||||
ret = sk_SSL_CIPHER_value(allow, ii);
|
||||
continue;
|
||||
}
|
||||
ret = sk_SSL_CIPHER_value(allow, group_min);
|
||||
#endif
|
||||
if (prefer_sha256) {
|
||||
const SSL_CIPHER *tmp = sk_SSL_CIPHER_value(allow, ii);
|
||||
|
||||
if (ssl_md(tmp->algorithm2) == mdsha256) {
|
||||
ret = tmp;
|
||||
break;
|
||||
}
|
||||
if (ret == NULL)
|
||||
ret = tmp;
|
||||
continue;
|
||||
}
|
||||
ret = sk_SSL_CIPHER_value(allow, ii);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#ifndef OPENSSL_NO_CHACHA
|
||||
sk_SSL_CIPHER_free(prio_chacha);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4519,12 +4555,12 @@ int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, size_t len,
|
||||
unsigned char *p = result;
|
||||
|
||||
l2n(Time, p);
|
||||
ret = ssl_randbytes(s, p, len - 4);
|
||||
ret = RAND_bytes(p, len - 4);
|
||||
} else {
|
||||
ret = ssl_randbytes(s, result, len);
|
||||
ret = RAND_bytes(result, len);
|
||||
}
|
||||
#ifndef OPENSSL_NO_TLS13DOWNGRADE
|
||||
if (ret) {
|
||||
if (ret > 0) {
|
||||
if (!ossl_assert(sizeof(tls11downgrade) < len)
|
||||
|| !ossl_assert(sizeof(tls12downgrade) < len))
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user