Version bump
This commit is contained in:
@@ -167,6 +167,7 @@ int ssl3_change_cipher_state(SSL *s, int which)
|
||||
*/
|
||||
EVP_CIPHER_CTX_reset(s->enc_write_ctx);
|
||||
}
|
||||
EVP_CIPHER_CTX_ctrl(s->enc_write_ctx, EVP_CTRL_SET_DRBG, 0, s->drbg);
|
||||
dd = s->enc_write_ctx;
|
||||
if (ssl_replace_hash(&s->write_hash, m) == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_CHANGE_CIPHER_STATE,
|
||||
|
||||
+4
-3
@@ -4200,10 +4200,11 @@ const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
|
||||
s->version != DTLS1_VERSION))
|
||||
ok = 0;
|
||||
|
||||
/* Not use weak cipher after TLSv1.0 */
|
||||
if ((alg_a & SSL_aRSA) &&
|
||||
/* not use ECDSA under TLS v1.2 */
|
||||
// if ((alg_a & SSL_aECDSA) && s->version != TLS1_2_VERSION) ok = 0;
|
||||
if ((alg_a & SSL_aRSA) &&
|
||||
(alg_k & SSL_kRSA) &&
|
||||
(s->version != TLS1_VERSION)) ok = 0;
|
||||
(s->version != TLS1_VERSION)) ok = 0;
|
||||
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
/* with PSK there must be server callback set */
|
||||
|
||||
+19
-1
@@ -43,6 +43,7 @@ typedef struct {
|
||||
ASN1_OCTET_STRING *alpn_selected;
|
||||
ASN1_OCTET_STRING *tick_nonce;
|
||||
uint32_t tlsext_max_fragment_len_mode;
|
||||
ASN1_OCTET_STRING *ticket_appdata;
|
||||
} SSL_SESSION_ASN1;
|
||||
|
||||
ASN1_SEQUENCE(SSL_SESSION_ASN1) = {
|
||||
@@ -73,7 +74,8 @@ ASN1_SEQUENCE(SSL_SESSION_ASN1) = {
|
||||
ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, max_early_data, ZUINT32, 15),
|
||||
ASN1_EXP_OPT(SSL_SESSION_ASN1, alpn_selected, ASN1_OCTET_STRING, 16),
|
||||
ASN1_EXP_OPT(SSL_SESSION_ASN1, tick_nonce, ASN1_OCTET_STRING, 17),
|
||||
ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, tlsext_max_fragment_len_mode, ZUINT32, 18)
|
||||
ASN1_EXP_OPT_EMBED(SSL_SESSION_ASN1, tlsext_max_fragment_len_mode, ZUINT32, 18),
|
||||
ASN1_EXP_OPT(SSL_SESSION_ASN1, ticket_appdata, ASN1_OCTET_STRING, 19)
|
||||
} static_ASN1_SEQUENCE_END(SSL_SESSION_ASN1)
|
||||
|
||||
IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(SSL_SESSION_ASN1)
|
||||
@@ -123,6 +125,7 @@ int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
|
||||
#endif
|
||||
ASN1_OCTET_STRING alpn_selected;
|
||||
ASN1_OCTET_STRING tick_nonce;
|
||||
ASN1_OCTET_STRING ticket_appdata;
|
||||
|
||||
long l;
|
||||
|
||||
@@ -200,6 +203,12 @@ int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
|
||||
|
||||
as.tlsext_max_fragment_len_mode = in->ext.max_fragment_len_mode;
|
||||
|
||||
if (in->ticket_appdata == NULL)
|
||||
as.ticket_appdata = NULL;
|
||||
else
|
||||
ssl_session_oinit(&as.ticket_appdata, &ticket_appdata,
|
||||
in->ticket_appdata, in->ticket_appdata_len);
|
||||
|
||||
return i2d_SSL_SESSION_ASN1(&as, pp);
|
||||
|
||||
}
|
||||
@@ -376,6 +385,15 @@ SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
|
||||
|
||||
ret->ext.max_fragment_len_mode = as->tlsext_max_fragment_len_mode;
|
||||
|
||||
if (as->ticket_appdata != NULL) {
|
||||
ret->ticket_appdata = as->ticket_appdata->data;
|
||||
ret->ticket_appdata_len = as->ticket_appdata->length;
|
||||
as->ticket_appdata->data = NULL;
|
||||
} else {
|
||||
ret->ticket_appdata = NULL;
|
||||
ret->ticket_appdata_len = 0;
|
||||
}
|
||||
|
||||
M_ASN1_free_of(as, SSL_SESSION_ASN1);
|
||||
|
||||
if ((a != NULL) && (*a == NULL))
|
||||
|
||||
@@ -18,5 +18,6 @@ static const SSL_CERT_LOOKUP ssl_cert_info [] = {
|
||||
{NID_id_GostR3410_2001, SSL_aGOST01}, /* SSL_PKEY_GOST01 */
|
||||
{NID_id_GostR3410_2012_256, SSL_aGOST12}, /* SSL_PKEY_GOST12_256 */
|
||||
{NID_id_GostR3410_2012_512, SSL_aGOST12}, /* SSL_PKEY_GOST12_512 */
|
||||
{EVP_PKEY_ED25519, SSL_aECDSA} /* SSL_PKEY_ED25519 */
|
||||
{EVP_PKEY_ED25519, SSL_aECDSA}, /* SSL_PKEY_ED25519 */
|
||||
{EVP_PKEY_ED448, SSL_aECDSA} /* SSL_PKEY_ED448 */
|
||||
};
|
||||
@@ -306,6 +306,8 @@ static const ERR_STRING_DATA SSL_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_SSL, SSL_F_SSL_SET_ALPN_PROTOS, 0),
|
||||
"SSL_set_alpn_protos"},
|
||||
{ERR_PACK(ERR_LIB_SSL, SSL_F_SSL_SET_CERT, 0), "ssl_set_cert"},
|
||||
{ERR_PACK(ERR_LIB_SSL, SSL_F_SSL_SET_CERT_AND_KEY, 0),
|
||||
"ssl_set_cert_and_key"},
|
||||
{ERR_PACK(ERR_LIB_SSL, SSL_F_SSL_SET_CIPHER_LIST, 0),
|
||||
"SSL_set_cipher_list"},
|
||||
{ERR_PACK(ERR_LIB_SSL, SSL_F_SSL_SET_CT_VALIDATION_CALLBACK, 0),
|
||||
@@ -914,6 +916,7 @@ static const ERR_STRING_DATA SSL_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_ECDSA_SIGNING_CERT),
|
||||
"missing ecdsa signing cert"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_FATAL), "missing fatal"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_PARAMETERS), "missing parameters"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_RSA_CERTIFICATE),
|
||||
"missing rsa certificate"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_MISSING_RSA_ENCRYPTING_CERT),
|
||||
@@ -936,6 +939,8 @@ static const ERR_STRING_DATA SSL_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NESTED_GROUP), "nested group"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NOT_ON_RECORD_BOUNDARY),
|
||||
"not on record boundary"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NOT_REPLACING_CERTIFICATE),
|
||||
"not replacing certificate"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NOT_SERVER), "not server"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NO_APPLICATION_PROTOCOL),
|
||||
"no application protocol"},
|
||||
@@ -955,6 +960,8 @@ static const ERR_STRING_DATA SSL_str_reasons[] = {
|
||||
"no client cert method"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NO_COMPRESSION_SPECIFIED),
|
||||
"no compression specified"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NO_COOKIE_CALLBACK_SET),
|
||||
"no cookie callback set"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER),
|
||||
"Peer haven't sent GOST certificate, required for selected ciphersuite"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_NO_METHOD_SPECIFIED),
|
||||
@@ -998,6 +1005,8 @@ static const ERR_STRING_DATA SSL_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_PIPELINE_FAILURE), "pipeline failure"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR),
|
||||
"post handshake auth encoding err"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_PRIVATE_KEY_MISMATCH),
|
||||
"private key mismatch"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_PROTOCOL_IS_SHUTDOWN),
|
||||
"protocol is shutdown"},
|
||||
{ERR_PACK(ERR_LIB_SSL, 0, SSL_R_PSK_IDENTITY_NOT_FOUND),
|
||||
|
||||
+36
-4
@@ -3068,10 +3068,22 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth)
|
||||
ret->ext.status_type = TLSEXT_STATUSTYPE_nothing;
|
||||
|
||||
/*
|
||||
* Default max early data is a fully loaded single record. Could be split
|
||||
* across multiple records in practice
|
||||
* We cannot usefully set a default max_early_data here (which gets
|
||||
* propagated in SSL_new(), for the following reason: setting the
|
||||
* SSL field causes tls_construct_stoc_early_data() to tell the
|
||||
* client that early data will be accepted when constructing a TLS 1.3
|
||||
* session ticket, and the client will accordingly send us early data
|
||||
* when using that ticket (if the client has early data to send).
|
||||
* However, in order for the early data to actually be consumed by
|
||||
* the application, the application must also have calls to
|
||||
* SSL_read_early_data(); otherwise we'll just skip past the early data
|
||||
* and ignore it. So, since the application must add calls to
|
||||
* SSL_read_early_data(), we also require them to add
|
||||
* calls to SSL_CTX_set_max_early_data() in order to use early data,
|
||||
* eliminating the bandwidth-wasting early data in the case described
|
||||
* above.
|
||||
*/
|
||||
ret->max_early_data = SSL3_RT_MAX_PLAIN_LENGTH;
|
||||
ret->max_early_data = 0;
|
||||
|
||||
return ret;
|
||||
err:
|
||||
@@ -3312,6 +3324,12 @@ void ssl_set_masks(SSL *s)
|
||||
&& pvalid[SSL_PKEY_ED25519] & CERT_PKEY_EXPLICIT_SIGN
|
||||
&& TLS1_get_version(s) == TLS1_2_VERSION)
|
||||
mask_a |= SSL_aECDSA;
|
||||
|
||||
/* Allow Ed448 for TLS 1.2 if peer supports it */
|
||||
if (!(mask_a & SSL_aECDSA) && ssl_has_cert(s, SSL_PKEY_ED448)
|
||||
&& pvalid[SSL_PKEY_ED448] & CERT_PKEY_EXPLICIT_SIGN
|
||||
&& TLS1_get_version(s) == TLS1_2_VERSION)
|
||||
mask_a |= SSL_aECDSA;
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
@@ -5402,7 +5420,10 @@ int SSL_stateless(SSL *s)
|
||||
if (ret > 0 && s->ext.cookieok)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
if (s->hello_retry_request == SSL_HRR_PENDING && !ossl_statem_in_error(s))
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void SSL_force_post_handshake_auth(SSL *ssl)
|
||||
@@ -5456,3 +5477,14 @@ int SSL_verify_client_post_handshake(SSL *ssl)
|
||||
ossl_statem_set_in_init(ssl, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx,
|
||||
SSL_CTX_generate_session_ticket_fn gen_cb,
|
||||
SSL_CTX_decrypt_session_ticket_fn dec_cb,
|
||||
void *arg)
|
||||
{
|
||||
ctx->generate_ticket_cb = gen_cb;
|
||||
ctx->decrypt_ticket_cb = dec_cb;
|
||||
ctx->ticket_cb_data = arg;
|
||||
return 1;
|
||||
}
|
||||
+24
-25
@@ -381,7 +381,8 @@
|
||||
# define SSL_PKEY_GOST12_256 5
|
||||
# define SSL_PKEY_GOST12_512 6
|
||||
# define SSL_PKEY_ED25519 7
|
||||
# define SSL_PKEY_NUM 8
|
||||
# define SSL_PKEY_ED448 8
|
||||
# define SSL_PKEY_NUM 9
|
||||
/*
|
||||
* Pseudo-constant. GOST cipher suites can use different certs for 1
|
||||
* SSL_CIPHER. So let's see which one we have in fact.
|
||||
@@ -590,6 +591,8 @@ struct ssl_session_st {
|
||||
# ifndef OPENSSL_NO_SRP
|
||||
char *srp_username;
|
||||
# endif
|
||||
unsigned char *ticket_appdata;
|
||||
size_t ticket_appdata_len;
|
||||
uint32_t flags;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
};
|
||||
@@ -854,6 +857,14 @@ struct ssl_ctx_st {
|
||||
int (*app_verify_cookie_cb) (SSL *ssl, const unsigned char *cookie,
|
||||
unsigned int cookie_len);
|
||||
|
||||
/* TLS1.3 app-controlled cookie generate callback */
|
||||
int (*gen_stateless_cookie_cb) (SSL *ssl, unsigned char *cookie,
|
||||
size_t *cookie_len);
|
||||
|
||||
/* TLS1.3 verify app-controlled cookie callback */
|
||||
int (*verify_stateless_cookie_cb) (SSL *ssl, const unsigned char *cookie,
|
||||
size_t cookie_len);
|
||||
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
|
||||
const EVP_MD *md5; /* For SSLv3/TLSv1 'ssl3-md5' */
|
||||
@@ -1061,6 +1072,11 @@ struct ssl_ctx_st {
|
||||
size_t (*record_padding_cb)(SSL *s, int type, size_t len, void *arg);
|
||||
void *record_padding_arg;
|
||||
size_t block_padding;
|
||||
|
||||
/* Session ticket appdata */
|
||||
SSL_CTX_generate_session_ticket_fn generate_ticket_cb;
|
||||
SSL_CTX_decrypt_session_ticket_fn decrypt_ticket_cb;
|
||||
void *ticket_cb_data;
|
||||
};
|
||||
|
||||
struct ssl_st {
|
||||
@@ -1999,6 +2015,7 @@ typedef enum downgrade_en {
|
||||
#define TLSEXT_SIGALG_gostr34102001_gostr3411 0xeded
|
||||
|
||||
#define TLSEXT_SIGALG_ed25519 0x0807
|
||||
#define TLSEXT_SIGALG_ed448 0x0808
|
||||
|
||||
/* Known PSK key exchange modes */
|
||||
#define TLSEXT_KEX_MODE_KE 0x00
|
||||
@@ -2487,30 +2504,12 @@ void tls1_get_supported_groups(SSL *s, const uint16_t **pgroups,
|
||||
|
||||
__owur int tls1_set_server_sigalgs(SSL *s);
|
||||
|
||||
/* Return codes for tls_get_ticket_from_client() and tls_decrypt_ticket() */
|
||||
typedef enum ticket_en {
|
||||
/* fatal error, malloc failure */
|
||||
TICKET_FATAL_ERR_MALLOC,
|
||||
/* fatal error, either from parsing or decrypting the ticket */
|
||||
TICKET_FATAL_ERR_OTHER,
|
||||
/* No ticket present */
|
||||
TICKET_NONE,
|
||||
/* Empty ticket present */
|
||||
TICKET_EMPTY,
|
||||
/* the ticket couldn't be decrypted */
|
||||
TICKET_NO_DECRYPT,
|
||||
/* a ticket was successfully decrypted */
|
||||
TICKET_SUCCESS,
|
||||
/* same as above but the ticket needs to be renewed */
|
||||
TICKET_SUCCESS_RENEW
|
||||
} TICKET_RETURN;
|
||||
|
||||
__owur TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
SSL_SESSION **ret);
|
||||
__owur TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
size_t eticklen,
|
||||
const unsigned char *sess_id,
|
||||
size_t sesslen, SSL_SESSION **psess);
|
||||
__owur SSL_TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
SSL_SESSION **ret);
|
||||
__owur SSL_TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
size_t eticklen,
|
||||
const unsigned char *sess_id,
|
||||
size_t sesslen, SSL_SESSION **psess);
|
||||
|
||||
__owur int tls_use_ticket(SSL *s);
|
||||
|
||||
|
||||
+111
@@ -1035,3 +1035,114 @@ int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file)
|
||||
BIO_free(bin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ssl_set_cert_and_key(SSL *ssl, SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
int ret = 0;
|
||||
size_t i;
|
||||
int j;
|
||||
int rv;
|
||||
CERT *c = ssl != NULL ? ssl->cert : ctx->cert;
|
||||
STACK_OF(X509) *dup_chain = NULL;
|
||||
EVP_PKEY *pubkey = NULL;
|
||||
|
||||
/* Do all security checks before anything else */
|
||||
rv = ssl_security_cert(ssl, ctx, x509, 0, 1);
|
||||
if (rv != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, rv);
|
||||
goto out;
|
||||
}
|
||||
for (j = 0; j < sk_X509_num(chain); j++) {
|
||||
rv = ssl_security_cert(ssl, ctx, sk_X509_value(chain, j), 0, 0);
|
||||
if (rv != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, rv);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
pubkey = X509_get_pubkey(x509); /* bumps reference */
|
||||
if (pubkey == NULL)
|
||||
goto out;
|
||||
if (privatekey == NULL) {
|
||||
privatekey = pubkey;
|
||||
} else {
|
||||
/* For RSA, which has no parameters, missing returns 0 */
|
||||
if (EVP_PKEY_missing_parameters(privatekey)) {
|
||||
if (EVP_PKEY_missing_parameters(pubkey)) {
|
||||
/* nobody has parameters? - error */
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_MISSING_PARAMETERS);
|
||||
goto out;
|
||||
} else {
|
||||
/* copy to privatekey from pubkey */
|
||||
EVP_PKEY_copy_parameters(privatekey, pubkey);
|
||||
}
|
||||
} else if (EVP_PKEY_missing_parameters(pubkey)) {
|
||||
/* copy to pubkey from privatekey */
|
||||
EVP_PKEY_copy_parameters(pubkey, privatekey);
|
||||
} /* else both have parameters */
|
||||
|
||||
/* Copied from ssl_set_cert/pkey */
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
if ((EVP_PKEY_id(privatekey) == EVP_PKEY_RSA) &&
|
||||
((RSA_flags(EVP_PKEY_get0_RSA(privatekey)) & RSA_METHOD_FLAG_NO_CHECK)))
|
||||
/* no-op */ ;
|
||||
else
|
||||
#endif
|
||||
/* check that key <-> cert match */
|
||||
if (EVP_PKEY_cmp(pubkey, privatekey) != 1) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_PRIVATE_KEY_MISMATCH);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (ssl_cert_lookup_by_pkey(pubkey, &i) == NULL) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_UNKNOWN_CERTIFICATE_TYPE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!override && (c->pkeys[i].x509 != NULL
|
||||
|| c->pkeys[i].privatekey != NULL
|
||||
|| c->pkeys[i].chain != NULL)) {
|
||||
/* No override, and something already there */
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, SSL_R_NOT_REPLACING_CERTIFICATE);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (chain != NULL) {
|
||||
dup_chain = X509_chain_up_ref(chain);
|
||||
if (dup_chain == NULL) {
|
||||
SSLerr(SSL_F_SSL_SET_CERT_AND_KEY, ERR_R_MALLOC_FAILURE);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
sk_X509_pop_free(c->pkeys[i].chain, X509_free);
|
||||
c->pkeys[i].chain = dup_chain;
|
||||
|
||||
X509_free(c->pkeys[i].x509);
|
||||
X509_up_ref(x509);
|
||||
c->pkeys[i].x509 = x509;
|
||||
|
||||
EVP_PKEY_free(c->pkeys[i].privatekey);
|
||||
EVP_PKEY_up_ref(privatekey);
|
||||
c->pkeys[i].privatekey = privatekey;
|
||||
|
||||
c->key = &(c->pkeys[i]);
|
||||
|
||||
ret = 1;
|
||||
out:
|
||||
EVP_PKEY_free(pubkey);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
return ssl_set_cert_and_key(ssl, NULL, x509, privatekey, chain, override);
|
||||
}
|
||||
|
||||
int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey,
|
||||
STACK_OF(X509) *chain, int override)
|
||||
{
|
||||
return ssl_set_cert_and_key(NULL, ctx, x509, privatekey, chain, override);
|
||||
}
|
||||
+58
-8
@@ -134,6 +134,7 @@ SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
|
||||
dest->peer_chain = NULL;
|
||||
dest->peer = NULL;
|
||||
dest->ext.tick_nonce = NULL;
|
||||
dest->ticket_appdata = NULL;
|
||||
memset(&dest->ex_data, 0, sizeof(dest->ex_data));
|
||||
|
||||
/* We deliberately don't copy the prev and next pointers */
|
||||
@@ -244,6 +245,13 @@ SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (src->ticket_appdata != NULL) {
|
||||
dest->ticket_appdata =
|
||||
OPENSSL_memdup(src->ticket_appdata, src->ticket_appdata_len);
|
||||
if (dest->ticket_appdata == NULL)
|
||||
goto err;
|
||||
}
|
||||
|
||||
return dest;
|
||||
err:
|
||||
SSLerr(SSL_F_SSL_SESSION_DUP, ERR_R_MALLOC_FAILURE);
|
||||
@@ -471,7 +479,7 @@ int ssl_get_prev_session(SSL *s, CLIENTHELLO_MSG *hello)
|
||||
SSL_SESSION *ret = NULL;
|
||||
int fatal = 0, discard;
|
||||
int try_session_cache = 0;
|
||||
TICKET_RETURN r;
|
||||
SSL_TICKET_RETURN r;
|
||||
|
||||
if (SSL_IS_TLS13(s)) {
|
||||
if (!tls_parse_extension(s, TLSEXT_IDX_psk_kex_modes,
|
||||
@@ -486,20 +494,20 @@ int ssl_get_prev_session(SSL *s, CLIENTHELLO_MSG *hello)
|
||||
/* sets s->ext.ticket_expected */
|
||||
r = tls_get_ticket_from_client(s, hello, &ret);
|
||||
switch (r) {
|
||||
case TICKET_FATAL_ERR_MALLOC:
|
||||
case TICKET_FATAL_ERR_OTHER:
|
||||
case SSL_TICKET_FATAL_ERR_MALLOC:
|
||||
case SSL_TICKET_FATAL_ERR_OTHER:
|
||||
fatal = 1;
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL_GET_PREV_SESSION,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
case TICKET_NONE:
|
||||
case TICKET_EMPTY:
|
||||
case SSL_TICKET_NONE:
|
||||
case SSL_TICKET_EMPTY:
|
||||
if (hello->session_id_len > 0)
|
||||
try_session_cache = 1;
|
||||
break;
|
||||
case TICKET_NO_DECRYPT:
|
||||
case TICKET_SUCCESS:
|
||||
case TICKET_SUCCESS_RENEW:
|
||||
case SSL_TICKET_NO_DECRYPT:
|
||||
case SSL_TICKET_SUCCESS:
|
||||
case SSL_TICKET_SUCCESS_RENEW:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -806,6 +814,7 @@ void SSL_SESSION_free(SSL_SESSION *ss)
|
||||
#endif
|
||||
OPENSSL_free(ss->ext.alpn_selected);
|
||||
OPENSSL_free(ss->ext.tick_nonce);
|
||||
OPENSSL_free(ss->ticket_appdata);
|
||||
CRYPTO_THREAD_lock_free(ss->lock);
|
||||
OPENSSL_clear_free(ss, sizeof(*ss));
|
||||
}
|
||||
@@ -1269,4 +1278,45 @@ void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx,
|
||||
ctx->app_verify_cookie_cb = cb;
|
||||
}
|
||||
|
||||
int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len)
|
||||
{
|
||||
OPENSSL_free(ss->ticket_appdata);
|
||||
ss->ticket_appdata_len = 0;
|
||||
if (data == NULL || len == 0) {
|
||||
ss->ticket_appdata = NULL;
|
||||
return 1;
|
||||
}
|
||||
ss->ticket_appdata = OPENSSL_memdup(data, len);
|
||||
if (ss->ticket_appdata != NULL) {
|
||||
ss->ticket_appdata_len = len;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len)
|
||||
{
|
||||
*data = ss->ticket_appdata;
|
||||
*len = ss->ticket_appdata_len;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void SSL_CTX_set_stateless_cookie_generate_cb(
|
||||
SSL_CTX *ctx,
|
||||
int (*cb) (SSL *ssl,
|
||||
unsigned char *cookie,
|
||||
size_t *cookie_len))
|
||||
{
|
||||
ctx->gen_stateless_cookie_cb = cb;
|
||||
}
|
||||
|
||||
void SSL_CTX_set_stateless_cookie_verify_cb(
|
||||
SSL_CTX *ctx,
|
||||
int (*cb) (SSL *ssl,
|
||||
const unsigned char *cookie,
|
||||
size_t cookie_len))
|
||||
{
|
||||
ctx->verify_stateless_cookie_cb = cb;
|
||||
}
|
||||
|
||||
IMPLEMENT_PEM_rw(SSL_SESSION, SSL_SESSION, PEM_STRING_SSL_SESSION, SSL_SESSION)
|
||||
+18
-20
@@ -211,7 +211,7 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
{
|
||||
TLSEXT_TYPE_status_request,
|
||||
SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_2_SERVER_HELLO
|
||||
| SSL_EXT_TLS1_3_CERTIFICATE,
|
||||
| SSL_EXT_TLS1_3_CERTIFICATE | SSL_EXT_TLS1_3_CERTIFICATE_REQUEST,
|
||||
init_status_request, tls_parse_ctos_status_request,
|
||||
tls_parse_stoc_status_request, tls_construct_stoc_status_request,
|
||||
tls_construct_ctos_status_request, NULL
|
||||
@@ -263,7 +263,7 @@ static const EXTENSION_DEFINITION ext_defs[] = {
|
||||
{
|
||||
TLSEXT_TYPE_signed_certificate_timestamp,
|
||||
SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_2_SERVER_HELLO
|
||||
| SSL_EXT_TLS1_3_CERTIFICATE,
|
||||
| SSL_EXT_TLS1_3_CERTIFICATE | SSL_EXT_TLS1_3_CERTIFICATE_REQUEST,
|
||||
NULL,
|
||||
/*
|
||||
* No server side support for this, but can be provided by a custom
|
||||
@@ -516,11 +516,20 @@ int extension_is_relevant(SSL *s, unsigned int extctx, unsigned int thisctx)
|
||||
&& (extctx & SSL_EXT_TLS_IMPLEMENTATION_ONLY) != 0)
|
||||
|| (s->version == SSL3_VERSION
|
||||
&& (extctx & SSL_EXT_SSL3_ALLOWED) == 0)
|
||||
/*
|
||||
* Note that SSL_IS_TLS13() means "TLS 1.3 has been negotiated",
|
||||
* which is never true when generating the ClientHello.
|
||||
* However, version negotiation *has* occurred by the time the
|
||||
* ClientHello extensions are being parsed.
|
||||
* Be careful to allow TLS 1.3-only extensions when generating
|
||||
* the ClientHello.
|
||||
*/
|
||||
|| (is_tls13 && (extctx & SSL_EXT_TLS1_2_AND_BELOW_ONLY) != 0)
|
||||
|| (!is_tls13 && (extctx & SSL_EXT_TLS1_3_ONLY) != 0)
|
||||
|| (!is_tls13 && (extctx & SSL_EXT_TLS1_3_ONLY) != 0
|
||||
&& (thisctx & SSL_EXT_CLIENT_HELLO) == 0)
|
||||
|| (s->server && !is_tls13 && (extctx & SSL_EXT_TLS1_3_ONLY) != 0)
|
||||
|| (s->hit && (extctx & SSL_EXT_IGNORE_ON_RESUMPTION) != 0))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -762,14 +771,7 @@ int should_add_extension(SSL *s, unsigned int extctx, unsigned int thisctx,
|
||||
return 0;
|
||||
|
||||
/* Check if this extension is defined for our protocol. If not, skip */
|
||||
if ((SSL_IS_DTLS(s) && (extctx & SSL_EXT_TLS_IMPLEMENTATION_ONLY) != 0)
|
||||
|| (s->version == SSL3_VERSION
|
||||
&& (extctx & SSL_EXT_SSL3_ALLOWED) == 0)
|
||||
|| (SSL_IS_TLS13(s)
|
||||
&& (extctx & SSL_EXT_TLS1_2_AND_BELOW_ONLY) != 0)
|
||||
|| (!SSL_IS_TLS13(s)
|
||||
&& (extctx & SSL_EXT_TLS1_3_ONLY) != 0
|
||||
&& (thisctx & SSL_EXT_CLIENT_HELLO) == 0)
|
||||
if (!extension_is_relevant(s, extctx, thisctx)
|
||||
|| ((extctx & SSL_EXT_TLS1_3_ONLY) != 0
|
||||
&& (thisctx & SSL_EXT_CLIENT_HELLO) != 0
|
||||
&& (SSL_IS_DTLS(s) || max_version < TLS1_3_VERSION)))
|
||||
@@ -1426,7 +1428,7 @@ int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
|
||||
const char external_label[] = "ext binder";
|
||||
const char nonce_label[] = "resumption";
|
||||
const char *label;
|
||||
size_t bindersize, labelsize, hashsize = EVP_MD_size(md);
|
||||
size_t bindersize, labelsize, psklen, hashsize = EVP_MD_size(md);
|
||||
int ret = -1;
|
||||
int usepskfored = 0;
|
||||
|
||||
@@ -1444,16 +1446,12 @@ int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
|
||||
labelsize = sizeof(resumption_label) - 1;
|
||||
}
|
||||
|
||||
if (sess->master_key_length != hashsize) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PSK_DO_BINDER,
|
||||
SSL_R_BAD_PSK);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (external) {
|
||||
psk = sess->master_key;
|
||||
psklen = sess->master_key_length;
|
||||
} else {
|
||||
psk = tmppsk;
|
||||
psklen = hashsize;
|
||||
if (!tls13_hkdf_expand(s, md, sess->master_key,
|
||||
(const unsigned char *)nonce_label,
|
||||
sizeof(nonce_label) - 1, sess->ext.tick_nonce,
|
||||
@@ -1475,7 +1473,7 @@ int tls_psk_do_binder(SSL *s, const EVP_MD *md, const unsigned char *msgstart,
|
||||
early_secret = (unsigned char *)s->early_secret;
|
||||
else
|
||||
early_secret = (unsigned char *)sess->early_secret;
|
||||
if (!tls13_generate_secret(s, md, NULL, psk, hashsize, early_secret)) {
|
||||
if (!tls13_generate_secret(s, md, NULL, psk, psklen, early_secret)) {
|
||||
/* SSLfatal() already called */
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -705,9 +705,10 @@ EXT_RETURN tls_construct_ctos_key_share(SSL *s, WPACKET *pkt,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return EXT_RETURN_SENT;
|
||||
#else
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
#endif
|
||||
}
|
||||
|
||||
EXT_RETURN tls_construct_ctos_cookie(SSL *s, WPACKET *pkt, unsigned int context,
|
||||
@@ -743,6 +744,7 @@ EXT_RETURN tls_construct_ctos_early_data(SSL *s, WPACKET *pkt,
|
||||
unsigned int context, X509 *x,
|
||||
size_t chainidx)
|
||||
{
|
||||
char identity[PSK_MAX_IDENTITY_LEN + 1];
|
||||
const unsigned char *id = NULL;
|
||||
size_t idlen = 0;
|
||||
SSL_SESSION *psksess = NULL;
|
||||
@@ -762,6 +764,58 @@ EXT_RETURN tls_construct_ctos_early_data(SSL *s, WPACKET *pkt,
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
if (psksess == NULL && s->psk_client_callback != NULL) {
|
||||
unsigned char psk[PSK_MAX_PSK_LEN];
|
||||
size_t psklen = 0;
|
||||
|
||||
memset(identity, 0, sizeof(identity));
|
||||
psklen = s->psk_client_callback(s, NULL, identity, sizeof(identity) - 1,
|
||||
psk, sizeof(psk));
|
||||
|
||||
if (psklen > PSK_MAX_PSK_LEN) {
|
||||
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
} else if (psklen > 0) {
|
||||
const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
|
||||
const SSL_CIPHER *cipher;
|
||||
|
||||
idlen = strlen(identity);
|
||||
if (idlen > PSK_MAX_IDENTITY_LEN) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
id = (unsigned char *)identity;
|
||||
|
||||
/*
|
||||
* We found a PSK using an old style callback. We don't know
|
||||
* the digest so we default to SHA256 as per the TLSv1.3 spec
|
||||
*/
|
||||
cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
|
||||
if (cipher == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
psksess = SSL_SESSION_new();
|
||||
if (psksess == NULL
|
||||
|| !SSL_SESSION_set1_master_key(psksess, psk, psklen)
|
||||
|| !SSL_SESSION_set_cipher(psksess, cipher)
|
||||
|| !SSL_SESSION_set_protocol_version(psksess, TLS1_3_VERSION)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
OPENSSL_cleanse(psk, psklen);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
OPENSSL_cleanse(psk, psklen);
|
||||
}
|
||||
}
|
||||
|
||||
SSL_SESSION_free(s->psksession);
|
||||
s->psksession = psksess;
|
||||
if (psksess != NULL) {
|
||||
@@ -1397,6 +1451,12 @@ int tls_parse_stoc_session_ticket(SSL *s, PACKET *pkt, unsigned int context,
|
||||
int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, unsigned int context,
|
||||
X509 *x, size_t chainidx)
|
||||
{
|
||||
if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
|
||||
/* We ignore this if the server sends a CertificateRequest */
|
||||
/* TODO(TLS1.3): Add support for this */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* MUST only be sent if we've requested a status
|
||||
* request message. In TLS <= 1.2 it must also be empty.
|
||||
@@ -1435,6 +1495,12 @@ int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, unsigned int context,
|
||||
int tls_parse_stoc_sct(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
size_t chainidx)
|
||||
{
|
||||
if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) {
|
||||
/* We ignore this if the server sends it in a CertificateRequest */
|
||||
/* TODO(TLS1.3): Add support for this */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only take it if we asked for it - i.e if there is no CT validation
|
||||
* callback set, then a custom extension MAY be processing it, so we
|
||||
|
||||
@@ -729,7 +729,7 @@ int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
unsigned long tm, now;
|
||||
|
||||
/* Ignore any cookie if we're not set up to verify it */
|
||||
if (s->ctx->app_verify_cookie_cb == NULL
|
||||
if (s->ctx->verify_stateless_cookie_cb == NULL
|
||||
|| (s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
|
||||
return 1;
|
||||
|
||||
@@ -852,7 +852,7 @@ int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
}
|
||||
|
||||
/* Verify the app cookie */
|
||||
if (s->ctx->app_verify_cookie_cb(s, PACKET_data(&appcookie),
|
||||
if (s->ctx->verify_stateless_cookie_cb(s, PACKET_data(&appcookie),
|
||||
PACKET_remaining(&appcookie)) == 0) {
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE,
|
||||
SSL_R_COOKIE_MISMATCH);
|
||||
@@ -1028,6 +1028,7 @@ int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
for (id = 0; PACKET_remaining(&identities) != 0; id++) {
|
||||
PACKET identity;
|
||||
unsigned long ticket_agel;
|
||||
size_t idlen;
|
||||
|
||||
if (!PACKET_get_length_prefixed_2(&identities, &identity)
|
||||
|| !PACKET_get_net_4(&identities, &ticket_agel)) {
|
||||
@@ -1036,15 +1037,66 @@ int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
return 0;
|
||||
}
|
||||
|
||||
idlen = PACKET_remaining(&identity);
|
||||
if (s->psk_find_session_cb != NULL
|
||||
&& !s->psk_find_session_cb(s, PACKET_data(&identity),
|
||||
PACKET_remaining(&identity),
|
||||
&& !s->psk_find_session_cb(s, PACKET_data(&identity), idlen,
|
||||
&sess)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sess == NULL
|
||||
&& s->psk_server_callback != NULL
|
||||
&& idlen <= PSK_MAX_IDENTITY_LEN) {
|
||||
char *pskid = NULL;
|
||||
unsigned char pskdata[PSK_MAX_PSK_LEN];
|
||||
unsigned int pskdatalen;
|
||||
|
||||
if (!PACKET_strndup(&identity, &pskid)) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
pskdatalen = s->psk_server_callback(s, pskid, pskdata,
|
||||
sizeof(pskdata));
|
||||
OPENSSL_free(pskid);
|
||||
if (pskdatalen > PSK_MAX_PSK_LEN) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
} else if (pskdatalen > 0) {
|
||||
const SSL_CIPHER *cipher;
|
||||
const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
|
||||
|
||||
/*
|
||||
* We found a PSK using an old style callback. We don't know
|
||||
* the digest so we default to SHA256 as per the TLSv1.3 spec
|
||||
*/
|
||||
cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
|
||||
if (cipher == NULL) {
|
||||
OPENSSL_cleanse(pskdata, pskdatalen);
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sess = SSL_SESSION_new();
|
||||
if (sess == NULL
|
||||
|| !SSL_SESSION_set1_master_key(sess, pskdata,
|
||||
pskdatalen)
|
||||
|| !SSL_SESSION_set_cipher(sess, cipher)
|
||||
|| !SSL_SESSION_set_protocol_version(sess,
|
||||
TLS1_3_VERSION)) {
|
||||
OPENSSL_cleanse(pskdata, pskdatalen);
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
OPENSSL_cleanse(pskdata, pskdatalen);
|
||||
}
|
||||
}
|
||||
|
||||
if (sess != NULL) {
|
||||
/* We found a PSK */
|
||||
SSL_SESSION *sesstmp = ssl_session_dup(sess, 0);
|
||||
@@ -1072,13 +1124,13 @@ int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
|
||||
PACKET_remaining(&identity), NULL, 0,
|
||||
&sess);
|
||||
|
||||
if (ret == TICKET_FATAL_ERR_MALLOC
|
||||
|| ret == TICKET_FATAL_ERR_OTHER) {
|
||||
if (ret == SSL_TICKET_FATAL_ERR_MALLOC
|
||||
|| ret == SSL_TICKET_FATAL_ERR_OTHER) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
if (ret == TICKET_NO_DECRYPT)
|
||||
if (ret == SSL_TICKET_NO_DECRYPT)
|
||||
continue;
|
||||
|
||||
ticket_age = (uint32_t)ticket_agel;
|
||||
@@ -1624,16 +1676,20 @@ EXT_RETURN tls_construct_stoc_cookie(SSL *s, WPACKET *pkt, unsigned int context,
|
||||
{
|
||||
unsigned char *hashval1, *hashval2, *appcookie1, *appcookie2, *cookie;
|
||||
unsigned char *hmac, *hmac2;
|
||||
size_t startlen, ciphlen, totcookielen, hashlen, hmaclen;
|
||||
unsigned int appcookielen;
|
||||
size_t startlen, ciphlen, totcookielen, hashlen, hmaclen, appcookielen;
|
||||
EVP_MD_CTX *hctx;
|
||||
EVP_PKEY *pkey;
|
||||
int ret = EXT_RETURN_FAIL;
|
||||
|
||||
if (s->ctx->app_gen_cookie_cb == NULL
|
||||
|| (s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
|
||||
if ((s->s3->flags & TLS1_FLAGS_STATELESS) == 0)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
|
||||
if (s->ctx->gen_stateless_cookie_cb == NULL) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
|
||||
SSL_R_NO_COOKIE_CALLBACK_SET);
|
||||
return EXT_RETURN_FAIL;
|
||||
}
|
||||
|
||||
if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie)
|
||||
|| !WPACKET_start_sub_packet_u16(pkt)
|
||||
|| !WPACKET_start_sub_packet_u16(pkt)
|
||||
@@ -1676,7 +1732,7 @@ EXT_RETURN tls_construct_stoc_cookie(SSL *s, WPACKET *pkt, unsigned int context,
|
||||
}
|
||||
|
||||
/* Generate the application cookie */
|
||||
if (s->ctx->app_gen_cookie_cb(s, appcookie1, &appcookielen) == 0) {
|
||||
if (s->ctx->gen_stateless_cookie_cb(s, appcookie1, &appcookielen) == 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE,
|
||||
SSL_R_COOKIE_GEN_CALLBACK_FAILURE);
|
||||
return EXT_RETURN_FAIL;
|
||||
|
||||
@@ -3729,6 +3729,10 @@ int tls_construct_new_session_ticket(SSL *s, WPACKET *pkt)
|
||||
s->session->ext.max_early_data = s->max_early_data;
|
||||
}
|
||||
|
||||
if (tctx->generate_ticket_cb != NULL &&
|
||||
tctx->generate_ticket_cb(s, tctx->ticket_cb_data) == 0)
|
||||
goto err;
|
||||
|
||||
/* get session encoding length */
|
||||
slen_full = i2d_SSL_SESSION(s->session, NULL);
|
||||
/*
|
||||
@@ -3754,6 +3758,7 @@ int tls_construct_new_session_ticket(SSL *s, WPACKET *pkt)
|
||||
SSL_F_TLS_CONSTRUCT_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_DRBG, 0, s->drbg);
|
||||
|
||||
p = senc;
|
||||
if (!i2d_SSL_SESSION(s->session, &p)) {
|
||||
|
||||
@@ -170,6 +170,7 @@ int tls1_change_cipher_state(SSL *s, int which)
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
EVP_CIPHER_CTX_ctrl(s->enc_write_ctx, EVP_CTRL_SET_DRBG, 0, s->drbg);
|
||||
dd = s->enc_write_ctx;
|
||||
if (SSL_IS_DTLS(s)) {
|
||||
mac_ctx = EVP_MD_CTX_new();
|
||||
|
||||
+63
-31
@@ -165,6 +165,7 @@ static const TLS_GROUP_INFO nid_list[] = {
|
||||
{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) */
|
||||
};
|
||||
|
||||
static const unsigned char ecformats_default[] = {
|
||||
@@ -177,6 +178,7 @@ static const unsigned char ecformats_default[] = {
|
||||
static const uint16_t eccurves_default[] = {
|
||||
29, /* X25519 (29) */
|
||||
23, /* secp256r1 (23) */
|
||||
30, /* X448 (30) */
|
||||
25, /* secp521r1 (25) */
|
||||
24, /* secp384r1 (24) */
|
||||
};
|
||||
@@ -622,6 +624,7 @@ static const uint16_t tls12_sigalgs[] = {
|
||||
TLSEXT_SIGALG_ecdsa_secp384r1_sha384,
|
||||
TLSEXT_SIGALG_ecdsa_secp521r1_sha512,
|
||||
TLSEXT_SIGALG_ed25519,
|
||||
TLSEXT_SIGALG_ed448,
|
||||
#endif
|
||||
|
||||
TLSEXT_SIGALG_rsa_pss_pss_sha256,
|
||||
@@ -672,6 +675,9 @@ static const SIGALG_LOOKUP sigalg_lookup_tbl[] = {
|
||||
{"ed25519", TLSEXT_SIGALG_ed25519,
|
||||
NID_undef, -1, EVP_PKEY_ED25519, SSL_PKEY_ED25519,
|
||||
NID_undef, NID_undef},
|
||||
{"ed448", TLSEXT_SIGALG_ed448,
|
||||
NID_undef, -1, EVP_PKEY_ED448, SSL_PKEY_ED448,
|
||||
NID_undef, NID_undef},
|
||||
{NULL, TLSEXT_SIGALG_ecdsa_sha224,
|
||||
NID_sha224, SSL_MD_SHA224_IDX, EVP_PKEY_EC, SSL_PKEY_ECC,
|
||||
NID_ecdsa_with_SHA224, NID_undef},
|
||||
@@ -764,7 +770,8 @@ static const uint16_t tls_default_sigalg[] = {
|
||||
TLSEXT_SIGALG_gostr34102001_gostr3411, /* SSL_PKEY_GOST01 */
|
||||
TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, /* SSL_PKEY_GOST12_256 */
|
||||
TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, /* SSL_PKEY_GOST12_512 */
|
||||
0 /* SSL_PKEY_ED25519 */
|
||||
0, /* SSL_PKEY_ED25519 */
|
||||
0, /* SSL_PKEY_ED448 */
|
||||
};
|
||||
|
||||
/* Lookup TLS signature algorithm */
|
||||
@@ -1198,8 +1205,8 @@ int tls1_set_server_sigalgs(SSL *s)
|
||||
* s->ctx->ext.ticket_key_cb asked to renew the client's ticket.
|
||||
* Otherwise, s->ext.ticket_expected is set to 0.
|
||||
*/
|
||||
TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
SSL_SESSION **ret)
|
||||
SSL_TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
SSL_SESSION **ret)
|
||||
{
|
||||
int retv;
|
||||
size_t size;
|
||||
@@ -1214,11 +1221,11 @@ TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
* resumption.
|
||||
*/
|
||||
if (s->version <= SSL3_VERSION || !tls_use_ticket(s))
|
||||
return TICKET_NONE;
|
||||
return SSL_TICKET_NONE;
|
||||
|
||||
ticketext = &hello->pre_proc_exts[TLSEXT_IDX_session_ticket];
|
||||
if (!ticketext->present)
|
||||
return TICKET_NONE;
|
||||
return SSL_TICKET_NONE;
|
||||
|
||||
size = PACKET_remaining(&ticketext->data);
|
||||
if (size == 0) {
|
||||
@@ -1227,7 +1234,7 @@ TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
* one.
|
||||
*/
|
||||
s->ext.ticket_expected = 1;
|
||||
return TICKET_EMPTY;
|
||||
return SSL_TICKET_EMPTY;
|
||||
}
|
||||
if (s->ext.session_secret_cb) {
|
||||
/*
|
||||
@@ -1236,25 +1243,49 @@ TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
* abbreviated handshake based on external mechanism to
|
||||
* calculate the master secret later.
|
||||
*/
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
}
|
||||
|
||||
retv = tls_decrypt_ticket(s, PACKET_data(&ticketext->data), size,
|
||||
hello->session_id, hello->session_id_len, ret);
|
||||
|
||||
/*
|
||||
* If set, the decrypt_ticket_cb() is always called regardless of the
|
||||
* return from tls_decrypt_ticket(). The callback is responsible for
|
||||
* checking |retv| before it performs any action
|
||||
*/
|
||||
if (s->session_ctx->decrypt_ticket_cb != NULL) {
|
||||
size_t keyname_len = size;
|
||||
|
||||
if (keyname_len > TLSEXT_KEYNAME_LENGTH)
|
||||
keyname_len = TLSEXT_KEYNAME_LENGTH;
|
||||
retv = s->session_ctx->decrypt_ticket_cb(s, *ret,
|
||||
PACKET_data(&ticketext->data),
|
||||
keyname_len,
|
||||
retv, s->session_ctx->ticket_cb_data);
|
||||
}
|
||||
|
||||
switch (retv) {
|
||||
case TICKET_NO_DECRYPT:
|
||||
case SSL_TICKET_NO_DECRYPT:
|
||||
s->ext.ticket_expected = 1;
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
|
||||
case TICKET_SUCCESS:
|
||||
return TICKET_SUCCESS;
|
||||
case SSL_TICKET_SUCCESS:
|
||||
return SSL_TICKET_SUCCESS;
|
||||
|
||||
case TICKET_SUCCESS_RENEW:
|
||||
case SSL_TICKET_SUCCESS_RENEW:
|
||||
s->ext.ticket_expected = 1;
|
||||
return TICKET_SUCCESS;
|
||||
return SSL_TICKET_SUCCESS;
|
||||
|
||||
case SSL_TICKET_EMPTY:
|
||||
s->ext.ticket_expected = 1;
|
||||
return SSL_TICKET_EMPTY;
|
||||
|
||||
case SSL_TICKET_NONE:
|
||||
return SSL_TICKET_NONE;
|
||||
|
||||
default:
|
||||
return TICKET_FATAL_ERR_OTHER;
|
||||
return SSL_TICKET_FATAL_ERR_OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1268,15 +1299,15 @@ TICKET_RETURN tls_get_ticket_from_client(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
* psess: (output) on return, if a ticket was decrypted, then this is set to
|
||||
* point to the resulting session.
|
||||
*/
|
||||
TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
size_t eticklen, const unsigned char *sess_id,
|
||||
size_t sesslen, SSL_SESSION **psess)
|
||||
SSL_TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
size_t eticklen, const unsigned char *sess_id,
|
||||
size_t sesslen, SSL_SESSION **psess)
|
||||
{
|
||||
SSL_SESSION *sess;
|
||||
unsigned char *sdec;
|
||||
const unsigned char *p;
|
||||
int slen, renew_ticket = 0, declen;
|
||||
TICKET_RETURN ret = TICKET_FATAL_ERR_OTHER;
|
||||
SSL_TICKET_RETURN ret = SSL_TICKET_FATAL_ERR_OTHER;
|
||||
size_t mlen;
|
||||
unsigned char tick_hmac[EVP_MAX_MD_SIZE];
|
||||
HMAC_CTX *hctx = NULL;
|
||||
@@ -1285,17 +1316,17 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
|
||||
/* Need at least keyname + iv */
|
||||
if (eticklen < TLSEXT_KEYNAME_LENGTH + EVP_MAX_IV_LENGTH) {
|
||||
ret = TICKET_NO_DECRYPT;
|
||||
ret = SSL_TICKET_NO_DECRYPT;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Initialize session ticket encryption and HMAC contexts */
|
||||
hctx = HMAC_CTX_new();
|
||||
if (hctx == NULL)
|
||||
return TICKET_FATAL_ERR_MALLOC;
|
||||
return SSL_TICKET_FATAL_ERR_MALLOC;
|
||||
ctx = EVP_CIPHER_CTX_new();
|
||||
if (ctx == NULL) {
|
||||
ret = TICKET_FATAL_ERR_MALLOC;
|
||||
ret = SSL_TICKET_FATAL_ERR_MALLOC;
|
||||
goto err;
|
||||
}
|
||||
if (tctx->ext.ticket_key_cb) {
|
||||
@@ -1306,7 +1337,7 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
if (rv < 0)
|
||||
goto err;
|
||||
if (rv == 0) {
|
||||
ret = TICKET_NO_DECRYPT;
|
||||
ret = SSL_TICKET_NO_DECRYPT;
|
||||
goto err;
|
||||
}
|
||||
if (rv == 2)
|
||||
@@ -1315,7 +1346,7 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
/* Check key name matches */
|
||||
if (memcmp(etick, tctx->ext.tick_key_name,
|
||||
TLSEXT_KEYNAME_LENGTH) != 0) {
|
||||
ret = TICKET_NO_DECRYPT;
|
||||
ret = SSL_TICKET_NO_DECRYPT;
|
||||
goto err;
|
||||
}
|
||||
if (HMAC_Init_ex(hctx, tctx->ext.tick_hmac_key,
|
||||
@@ -1338,7 +1369,7 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
/* Sanity check ticket length: must exceed keyname + IV + HMAC */
|
||||
if (eticklen <=
|
||||
TLSEXT_KEYNAME_LENGTH + EVP_CIPHER_CTX_iv_length(ctx) + mlen) {
|
||||
ret = TICKET_NO_DECRYPT;
|
||||
ret = SSL_TICKET_NO_DECRYPT;
|
||||
goto err;
|
||||
}
|
||||
eticklen -= mlen;
|
||||
@@ -1350,7 +1381,7 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
HMAC_CTX_free(hctx);
|
||||
if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
}
|
||||
/* Attempt to decrypt session data */
|
||||
/* Move p after IV to start of encrypted ticket, update length */
|
||||
@@ -1361,12 +1392,12 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
(int)eticklen) <= 0) {
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
OPENSSL_free(sdec);
|
||||
return TICKET_FATAL_ERR_OTHER;
|
||||
return SSL_TICKET_FATAL_ERR_OTHER;
|
||||
}
|
||||
if (EVP_DecryptFinal(ctx, sdec + slen, &declen) <= 0) {
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
OPENSSL_free(sdec);
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
}
|
||||
slen += declen;
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
@@ -1380,7 +1411,7 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
/* Some additional consistency checks */
|
||||
if (slen != 0 || sess->session_id_length != 0) {
|
||||
SSL_SESSION_free(sess);
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
}
|
||||
/*
|
||||
* The session ID, if non-empty, is used by some clients to detect
|
||||
@@ -1393,15 +1424,15 @@ TICKET_RETURN tls_decrypt_ticket(SSL *s, const unsigned char *etick,
|
||||
sess->session_id_length = sesslen;
|
||||
*psess = sess;
|
||||
if (renew_ticket)
|
||||
return TICKET_SUCCESS_RENEW;
|
||||
return SSL_TICKET_SUCCESS_RENEW;
|
||||
else
|
||||
return TICKET_SUCCESS;
|
||||
return SSL_TICKET_SUCCESS;
|
||||
}
|
||||
ERR_clear_error();
|
||||
/*
|
||||
* For session parse failure, indicate that we need to send a new ticket.
|
||||
*/
|
||||
return TICKET_NO_DECRYPT;
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
err:
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
HMAC_CTX_free(hctx);
|
||||
@@ -2180,6 +2211,7 @@ void tls1_set_cert_validity(SSL *s)
|
||||
tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_256);
|
||||
tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_GOST12_512);
|
||||
tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ED25519);
|
||||
tls1_check_chain(s, NULL, NULL, NULL, SSL_PKEY_ED448);
|
||||
}
|
||||
|
||||
/* User level utility function to check a chain is suitable */
|
||||
|
||||
+20
-14
@@ -79,7 +79,7 @@ static const ssl_trace_tbl ssl_content_tbl[] = {
|
||||
{SSL3_RT_APPLICATION_DATA, "ApplicationData"},
|
||||
};
|
||||
|
||||
/* Handshake types */
|
||||
/* Handshake types, sorted by ascending id */
|
||||
static const ssl_trace_tbl ssl_handshake_tbl[] = {
|
||||
{SSL3_MT_HELLO_REQUEST, "HelloRequest"},
|
||||
{SSL3_MT_CLIENT_HELLO, "ClientHello"},
|
||||
@@ -94,10 +94,10 @@ static const ssl_trace_tbl ssl_handshake_tbl[] = {
|
||||
{SSL3_MT_SERVER_DONE, "ServerHelloDone"},
|
||||
{SSL3_MT_CERTIFICATE_VERIFY, "CertificateVerify"},
|
||||
{SSL3_MT_CLIENT_KEY_EXCHANGE, "ClientKeyExchange"},
|
||||
{SSL3_MT_CERTIFICATE_STATUS, "CertificateStatus"},
|
||||
{SSL3_MT_CLIENT_KEY_EXCHANGE, "ClientKeyExchange"},
|
||||
{SSL3_MT_FINISHED, "Finished"},
|
||||
{SSL3_MT_CERTIFICATE_URL, "CertificateUrl"},
|
||||
{SSL3_MT_CERTIFICATE_STATUS, "CertificateStatus"},
|
||||
{SSL3_MT_SUPPLEMENTAL_DATA, "SupplementalData"},
|
||||
{SSL3_MT_KEY_UPDATE, "KeyUpdate"},
|
||||
# ifndef OPENSSL_NO_NEXTPROTONEG
|
||||
{SSL3_MT_NEXT_PROTO, "NextProto"},
|
||||
@@ -449,7 +449,7 @@ static const ssl_trace_tbl ssl_comp_tbl[] = {
|
||||
{0x0001, "Zlib Compression"}
|
||||
};
|
||||
|
||||
/* Extensions */
|
||||
/* Extensions sorted by ascending id */
|
||||
static const ssl_trace_tbl ssl_exts_tbl[] = {
|
||||
{TLSEXT_TYPE_server_name, "server_name"},
|
||||
{TLSEXT_TYPE_max_fragment_length, "max_fragment_length"},
|
||||
@@ -461,28 +461,32 @@ static const ssl_trace_tbl ssl_exts_tbl[] = {
|
||||
{TLSEXT_TYPE_client_authz, "client_authz"},
|
||||
{TLSEXT_TYPE_server_authz, "server_authz"},
|
||||
{TLSEXT_TYPE_cert_type, "cert_type"},
|
||||
{TLSEXT_TYPE_key_share, "key_share"},
|
||||
{TLSEXT_TYPE_psk, "psk"},
|
||||
{TLSEXT_TYPE_psk_kex_modes, "psk_key_exchange_modes"},
|
||||
{TLSEXT_TYPE_supported_groups, "supported_groups"},
|
||||
{TLSEXT_TYPE_ec_point_formats, "ec_point_formats"},
|
||||
{TLSEXT_TYPE_srp, "srp"},
|
||||
{TLSEXT_TYPE_signature_algorithms, "signature_algorithms"},
|
||||
{TLSEXT_TYPE_use_srtp, "use_srtp"},
|
||||
{TLSEXT_TYPE_session_ticket, "session_ticket"},
|
||||
{TLSEXT_TYPE_supported_versions, "supported_versions"},
|
||||
{TLSEXT_TYPE_renegotiate, "renegotiate"},
|
||||
# ifndef OPENSSL_NO_NEXTPROTONEG
|
||||
{TLSEXT_TYPE_next_proto_neg, "next_proto_neg"},
|
||||
# endif
|
||||
{TLSEXT_TYPE_heartbeat, "tls_heartbeat"},
|
||||
{TLSEXT_TYPE_application_layer_protocol_negotiation,
|
||||
"application_layer_protocol_negotiation"},
|
||||
{TLSEXT_TYPE_signed_certificate_timestamp, "signed_certificate_timestamps"},
|
||||
{TLSEXT_TYPE_padding, "padding"},
|
||||
{TLSEXT_TYPE_encrypt_then_mac, "encrypt_then_mac"},
|
||||
{TLSEXT_TYPE_extended_master_secret, "extended_master_secret"},
|
||||
{TLSEXT_TYPE_session_ticket, "session_ticket"},
|
||||
{TLSEXT_TYPE_psk, "psk"},
|
||||
{TLSEXT_TYPE_early_data, "early_data"},
|
||||
{TLSEXT_TYPE_post_handshake_auth, "post_handshake_auth"}
|
||||
{TLSEXT_TYPE_supported_versions, "supported_versions"},
|
||||
{TLSEXT_TYPE_cookie, "cookie_ext"},
|
||||
{TLSEXT_TYPE_psk_kex_modes, "psk_key_exchange_modes"},
|
||||
{TLSEXT_TYPE_certificate_authorities, "certificate_authorities"},
|
||||
{TLSEXT_TYPE_post_handshake_auth, "post_handshake_auth"},
|
||||
{TLSEXT_TYPE_signature_algorithms_cert, "signature_algorithms_cert"},
|
||||
{TLSEXT_TYPE_key_share, "key_share"},
|
||||
{TLSEXT_TYPE_renegotiate, "renegotiate"},
|
||||
# ifndef OPENSSL_NO_NEXTPROTONEG
|
||||
{TLSEXT_TYPE_next_proto_neg, "next_proto_neg"},
|
||||
# endif
|
||||
};
|
||||
|
||||
static const ssl_trace_tbl ssl_groups_tbl[] = {
|
||||
@@ -515,6 +519,7 @@ static const ssl_trace_tbl ssl_groups_tbl[] = {
|
||||
{27, "brainpoolP384r1"},
|
||||
{28, "brainpoolP512r1"},
|
||||
{29, "ecdh_x25519"},
|
||||
{30, "ecdh_x448"},
|
||||
{256, "ffdhe2048"},
|
||||
{257, "ffdhe3072"},
|
||||
{258, "ffdhe4096"},
|
||||
@@ -544,6 +549,7 @@ static const ssl_trace_tbl ssl_sigalg_tbl[] = {
|
||||
{TLSEXT_SIGALG_ecdsa_secp521r1_sha512, "ecdsa_secp521r1_sha512"},
|
||||
{TLSEXT_SIGALG_ecdsa_sha224, "ecdsa_sha224"},
|
||||
{TLSEXT_SIGALG_ed25519, "ed25519"},
|
||||
{TLSEXT_SIGALG_ed448, "ed448"},
|
||||
{TLSEXT_SIGALG_ecdsa_sha1, "ecdsa_sha1"},
|
||||
{TLSEXT_SIGALG_rsa_pss_rsae_sha256, "rsa_pss_rsae_sha256"},
|
||||
{TLSEXT_SIGALG_rsa_pss_rsae_sha384, "rsa_pss_rsae_sha384"},
|
||||
|
||||
@@ -406,6 +406,7 @@ int tls13_change_cipher_state(SSL *s, int which)
|
||||
SSL_F_TLS13_CHANGE_CIPHER_STATE, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
EVP_CIPHER_CTX_ctrl(s->enc_write_ctx, EVP_CTRL_SET_DRBG, 0, s->drbg);
|
||||
}
|
||||
ciph_ctx = s->enc_write_ctx;
|
||||
iv = s->write_iv;
|
||||
|
||||
+5
-1
@@ -1,10 +1,14 @@
|
||||
/*
|
||||
* Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2004, EdelKey Project. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*
|
||||
* Originally written by Christophe Renou and Peter Sylvester,
|
||||
* for the EdelKey project.
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
Reference in New Issue
Block a user