diff options
| -rw-r--r-- | src/lib/libssl/d1_both.c | 150 | ||||
| -rw-r--r-- | src/lib/libssl/dtls_local.h | 4 |
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 | ||
| 901 | static int | ||
| 902 | dtls1_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 | |||
| 901 | int | 975 | int |
| 902 | dtls1_retransmit_buffered_messages(SSL *s) | 976 | dtls1_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 | ||
| 982 | int | ||
| 983 | dtls1_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 */ |
| 1057 | void | 1057 | void |
| 1058 | dtls1_clear_record_buffer(SSL *s) | 1058 | dtls1_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 | ||
| 203 | int dtls1_read_failed(SSL *s, int code); | 203 | int dtls1_read_failed(SSL *s, int code); |
| 204 | int dtls1_buffer_message(SSL *s, int ccs); | 204 | int dtls1_buffer_message(SSL *s, int ccs); |
| 205 | int dtls1_retransmit_message(SSL *s, unsigned short seq, | ||
| 206 | unsigned long frag_off, int *found); | ||
| 207 | int dtls1_get_queue_priority(unsigned short seq, int is_ccs); | 205 | int dtls1_get_queue_priority(unsigned short seq, int is_ccs); |
| 208 | int dtls1_retransmit_buffered_messages(SSL *s); | 206 | int dtls1_retransmit_buffered_messages(SSL *s); |
| 209 | void dtls1_clear_record_buffer(SSL *s); | 207 | void dtls1_clear_record_buffer(SSL *s); |
