summaryrefslogtreecommitdiff
path: root/ssl/statem
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2022-10-13 16:44:22 +0100
committerMatt Caswell <matt@openssl.org>2022-10-20 14:39:33 +0100
commitb9e37f8f573de1951655f6d8684f2f65ffc6905b (patch)
tree4c9de2b8edeb44e20ff40bc09e0ad388f668af98 /ssl/statem
parent248a9bf21ad5a61d911765964e2758e0da3c554c (diff)
downloadopenssl-new-b9e37f8f573de1951655f6d8684f2f65ffc6905b.tar.gz
Convert dtls_write_records to use standard record layer functions
We have standard functions for most of the work that dtls_write_records does - so we convert it to use those functions instead. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Hugo Landau <hlandau@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19424)
Diffstat (limited to 'ssl/statem')
-rw-r--r--ssl/statem/statem_dtls.c47
1 files changed, 21 insertions, 26 deletions
diff --git a/ssl/statem/statem_dtls.c b/ssl/statem/statem_dtls.c
index 93c49011a2..b673c860ab 100644
--- a/ssl/statem/statem_dtls.c
+++ b/ssl/statem/statem_dtls.c
@@ -94,9 +94,12 @@ void dtls1_hm_fragment_free(hm_fragment *frag)
if (!frag)
return;
if (frag->msg_header.is_ccs) {
- EVP_CIPHER_CTX_free(frag->msg_header.
- saved_retransmit_state.enc_write_ctx);
- EVP_MD_CTX_free(frag->msg_header.saved_retransmit_state.write_hash);
+ /*
+ * If we're freeing the CCS then we're done with the old wrl and it
+ * can bee freed
+ */
+ if (frag->msg_header.saved_retransmit_state.wrlmethod != NULL)
+ frag->msg_header.saved_retransmit_state.wrlmethod->free(frag->msg_header.saved_retransmit_state.wrl);
}
OPENSSL_free(frag->fragment);
OPENSSL_free(frag->reassembly);
@@ -1161,12 +1164,9 @@ int dtls1_buffer_message(SSL_CONNECTION *s, int is_ccs)
frag->msg_header.is_ccs = is_ccs;
/* save current state */
- frag->msg_header.saved_retransmit_state.enc_write_ctx = s->enc_write_ctx;
- frag->msg_header.saved_retransmit_state.write_hash = s->write_hash;
- frag->msg_header.saved_retransmit_state.compress = s->compress;
- frag->msg_header.saved_retransmit_state.session = s->session;
- frag->msg_header.saved_retransmit_state.epoch =
- DTLS_RECORD_LAYER_get_w_epoch(&s->rlayer);
+ frag->msg_header.saved_retransmit_state.wrlmethod = s->rlayer.wrlmethod;
+ frag->msg_header.saved_retransmit_state.wrl = s->rlayer.wrl;
+
memset(seq64be, 0, sizeof(seq64be));
seq64be[6] =
@@ -1228,32 +1228,27 @@ int dtls1_retransmit_message(SSL_CONNECTION *s, unsigned short seq, int *found)
frag->msg_header.frag_len);
/* save current state */
- saved_state.enc_write_ctx = s->enc_write_ctx;
- saved_state.write_hash = s->write_hash;
- saved_state.compress = s->compress;
- saved_state.session = s->session;
- saved_state.epoch = DTLS_RECORD_LAYER_get_w_epoch(&s->rlayer);
+ saved_state.wrlmethod = s->rlayer.wrlmethod;
+ saved_state.wrl = s->rlayer.wrl;
s->d1->retransmitting = 1;
/* restore state in which the message was originally sent */
- s->enc_write_ctx = frag->msg_header.saved_retransmit_state.enc_write_ctx;
- s->write_hash = frag->msg_header.saved_retransmit_state.write_hash;
- s->compress = frag->msg_header.saved_retransmit_state.compress;
- s->session = frag->msg_header.saved_retransmit_state.session;
- DTLS_RECORD_LAYER_set_saved_w_epoch(&s->rlayer,
- frag->msg_header.
- saved_retransmit_state.epoch);
+ s->rlayer.wrlmethod = frag->msg_header.saved_retransmit_state.wrlmethod;
+ s->rlayer.wrl = frag->msg_header.saved_retransmit_state.wrl;
+
+ /*
+ * The old wrl may be still pointing at an old BIO. Update it to what we're
+ * using now.
+ */
+ s->rlayer.wrlmethod->set1_bio(s->rlayer.wrl, s->wbio);
ret = dtls1_do_write(s, frag->msg_header.is_ccs ?
SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE);
/* restore current state */
- s->enc_write_ctx = saved_state.enc_write_ctx;
- s->write_hash = saved_state.write_hash;
- s->compress = saved_state.compress;
- s->session = saved_state.session;
- DTLS_RECORD_LAYER_set_saved_w_epoch(&s->rlayer, saved_state.epoch);
+ s->rlayer.wrlmethod = saved_state.wrlmethod;
+ s->rlayer.wrl = saved_state.wrl;
s->d1->retransmitting = 0;