summaryrefslogtreecommitdiff
path: root/src/lib/libssl
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl')
-rw-r--r--src/lib/libssl/d1_both.c150
-rw-r--r--src/lib/libssl/dtls_local.h4
2 files changed, 76 insertions, 78 deletions
diff --git a/src/lib/libssl/d1_both.c b/src/lib/libssl/d1_both.c
index 61507a2194..7410456452 100644
--- a/src/lib/libssl/d1_both.c
+++ b/src/lib/libssl/d1_both.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_both.c,v 1.87 2026/04/29 14:57:29 jsing Exp $ */ 1/* $OpenBSD: d1_both.c,v 1.88 2026/04/29 14:59:26 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -898,6 +898,80 @@ dtls1_get_queue_priority(unsigned short seq, int is_ccs)
898 return seq * 2 - is_ccs; 898 return seq * 2 - is_ccs;
899} 899}
900 900
901static int
902dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
903 int *found)
904{
905 int ret;
906 /* XDTLS: for now assuming that read/writes are blocking */
907 pitem *item;
908 hm_fragment *frag;
909 unsigned long header_length;
910 unsigned char seq64be[8];
911 struct dtls1_retransmit_state saved_state;
912
913 /*
914 OPENSSL_assert(s->init_num == 0);
915 OPENSSL_assert(s->init_off == 0);
916 */
917
918 /* XDTLS: the requested message ought to be found, otherwise error */
919 memset(seq64be, 0, sizeof(seq64be));
920 seq64be[6] = (unsigned char)(seq >> 8);
921 seq64be[7] = (unsigned char)seq;
922
923 item = pqueue_find(s->d1->sent_messages, seq64be);
924 if (item == NULL) {
925#ifdef DEBUG
926 fprintf(stderr, "retransmit: message %d non-existent\n", seq);
927#endif
928 *found = 0;
929 return 0;
930 }
931
932 *found = 1;
933 frag = (hm_fragment *)item->data;
934
935 if (frag->msg_header.is_ccs)
936 header_length = DTLS1_CCS_HEADER_LENGTH;
937 else
938 header_length = DTLS1_HM_HEADER_LENGTH;
939
940 memcpy(s->init_buf->data, frag->fragment,
941 frag->msg_header.msg_len + header_length);
942 s->init_num = frag->msg_header.msg_len + header_length;
943
944 dtls1_set_message_header_int(s, frag->msg_header.type,
945 frag->msg_header.msg_len, frag->msg_header.seq, 0,
946 frag->msg_header.frag_len);
947
948 /* save current state */
949 saved_state.session = s->session;
950 saved_state.epoch = tls12_record_layer_write_epoch(s->rl);
951
952 s->d1->retransmitting = 1;
953
954 /* restore state in which the message was originally sent */
955 s->session = frag->msg_header.saved_retransmit_state.session;
956 if (!tls12_record_layer_use_write_epoch(s->rl,
957 frag->msg_header.saved_retransmit_state.epoch))
958 return 0;
959
960 ret = dtls1_do_write(s, frag->msg_header.is_ccs ?
961 SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE);
962
963 /* restore current state */
964 s->session = saved_state.session;
965 if (!tls12_record_layer_use_write_epoch(s->rl,
966 saved_state.epoch))
967 return 0;
968
969 s->d1->retransmitting = 0;
970
971 (void)BIO_flush(SSL_get_wbio(s));
972 return ret;
973}
974
901int 975int
902dtls1_retransmit_buffered_messages(SSL *s) 976dtls1_retransmit_buffered_messages(SSL *s)
903{ 977{
@@ -979,80 +1053,6 @@ dtls1_buffer_message(SSL *s, int is_ccs)
979 return 1; 1053 return 1;
980} 1054}
981 1055
982int
983dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
984 int *found)
985{
986 int ret;
987 /* XDTLS: for now assuming that read/writes are blocking */
988 pitem *item;
989 hm_fragment *frag;
990 unsigned long header_length;
991 unsigned char seq64be[8];
992 struct dtls1_retransmit_state saved_state;
993
994 /*
995 OPENSSL_assert(s->init_num == 0);
996 OPENSSL_assert(s->init_off == 0);
997 */
998
999 /* XDTLS: the requested message ought to be found, otherwise error */
1000 memset(seq64be, 0, sizeof(seq64be));
1001 seq64be[6] = (unsigned char)(seq >> 8);
1002 seq64be[7] = (unsigned char)seq;
1003
1004 item = pqueue_find(s->d1->sent_messages, seq64be);
1005 if (item == NULL) {
1006#ifdef DEBUG
1007 fprintf(stderr, "retransmit: message %d non-existent\n", seq);
1008#endif
1009 *found = 0;
1010 return 0;
1011 }
1012
1013 *found = 1;
1014 frag = (hm_fragment *)item->data;
1015
1016 if (frag->msg_header.is_ccs)
1017 header_length = DTLS1_CCS_HEADER_LENGTH;
1018 else
1019 header_length = DTLS1_HM_HEADER_LENGTH;
1020
1021 memcpy(s->init_buf->data, frag->fragment,
1022 frag->msg_header.msg_len + header_length);
1023 s->init_num = frag->msg_header.msg_len + header_length;
1024
1025 dtls1_set_message_header_int(s, frag->msg_header.type,
1026 frag->msg_header.msg_len, frag->msg_header.seq, 0,
1027 frag->msg_header.frag_len);
1028
1029 /* save current state */
1030 saved_state.session = s->session;
1031 saved_state.epoch = tls12_record_layer_write_epoch(s->rl);
1032
1033 s->d1->retransmitting = 1;
1034
1035 /* restore state in which the message was originally sent */
1036 s->session = frag->msg_header.saved_retransmit_state.session;
1037 if (!tls12_record_layer_use_write_epoch(s->rl,
1038 frag->msg_header.saved_retransmit_state.epoch))
1039 return 0;
1040
1041 ret = dtls1_do_write(s, frag->msg_header.is_ccs ?
1042 SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE);
1043
1044 /* restore current state */
1045 s->session = saved_state.session;
1046 if (!tls12_record_layer_use_write_epoch(s->rl,
1047 saved_state.epoch))
1048 return 0;
1049
1050 s->d1->retransmitting = 0;
1051
1052 (void)BIO_flush(SSL_get_wbio(s));
1053 return ret;
1054}
1055
1056/* call this function when the buffered messages are no longer needed */ 1056/* call this function when the buffered messages are no longer needed */
1057void 1057void
1058dtls1_clear_record_buffer(SSL *s) 1058dtls1_clear_record_buffer(SSL *s)
diff --git a/src/lib/libssl/dtls_local.h b/src/lib/libssl/dtls_local.h
index c7c413fef4..3352b31d3c 100644
--- a/src/lib/libssl/dtls_local.h
+++ b/src/lib/libssl/dtls_local.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: dtls_local.h,v 1.2 2022/11/26 17:23:18 tb Exp $ */ 1/* $OpenBSD: dtls_local.h,v 1.3 2026/04/29 14:59:26 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -202,8 +202,6 @@ int dtls1_write_bytes(SSL *s, int type, const void *buf, int len);
202 202
203int dtls1_read_failed(SSL *s, int code); 203int dtls1_read_failed(SSL *s, int code);
204int dtls1_buffer_message(SSL *s, int ccs); 204int dtls1_buffer_message(SSL *s, int ccs);
205int dtls1_retransmit_message(SSL *s, unsigned short seq,
206 unsigned long frag_off, int *found);
207int dtls1_get_queue_priority(unsigned short seq, int is_ccs); 205int dtls1_get_queue_priority(unsigned short seq, int is_ccs);
208int dtls1_retransmit_buffered_messages(SSL *s); 206int dtls1_retransmit_buffered_messages(SSL *s);
209void dtls1_clear_record_buffer(SSL *s); 207void dtls1_clear_record_buffer(SSL *s);