diff options
author | Matt Caswell <matt@openssl.org> | 2022-10-13 16:44:22 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2022-10-20 14:39:33 +0100 |
commit | b9e37f8f573de1951655f6d8684f2f65ffc6905b (patch) | |
tree | 4c9de2b8edeb44e20ff40bc09e0ad388f668af98 /ssl/statem | |
parent | 248a9bf21ad5a61d911765964e2758e0da3c554c (diff) |
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.c | 47 |
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; |