return 1;
if (!s->new_session && s->session != NULL
- && s->session->ext.tick != NULL) {
+ && s->session->ext.tick != NULL
+ && s->session->ssl_version != TLS1_3_VERSION) {
ticklen = s->session->ext.ticklen;
} else if (s->session && s->ext.session_ticket != NULL
&& s->ext.session_ticket->data != NULL) {
SSLerr(SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES, ERR_R_INTERNAL_ERROR);
return 0;
}
+
+ s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_KE | TLSEXT_KEX_MODE_FLAG_KE_DHE;
#endif
return 1;
s->session->ext.tick_identity = TLSEXT_PSK_BAD_IDENTITY;
/*
- * If this is a new session then we have nothing to resume so don't add
- * this extension.
+ * If this is an incompatible or new session then we have nothing to resume
+ * so don't add this extension.
*/
- if (s->session->ext.ticklen == 0)
+ if (s->session->ssl_version != TLS1_3_VERSION
+ || s->session->ext.ticklen == 0)
+ return 1;
+
+ md = ssl_md(s->session->cipher->algorithm2);
+ if (md == NULL) {
+ /* Don't recognise this cipher so we can't use the session. Ignore it */
return 1;
+ }
/*
* Technically the C standard just says time() returns a time_t and says
*/
agems += s->session->ext.tick_age_add;
- md = ssl_cipher_get_handshake_md(s->session->cipher_id);
- if (md == NULL) {
- /* Don't recognise this cipher so we can't use the session. Ignore it */
- return 1;
+ if (s->session->cipher == NULL) {
+ SSLerr(SSL_F_TLS_CONSTRUCT_CTOS_PSK, ERR_R_INTERNAL_ERROR);
+ goto err;
}
hashsize = EVP_MD_size(md);