summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-07-21 08:42:14 +0000
committerjsing <>2021-07-21 08:42:14 +0000
commit24017b25b6aa507cb8684a8f62c86469a7aa2c4d (patch)
treebae082e5c4f00caf24ddf7d2b8bb7f2636f17592
parent79b1c4fd5d0d72bf2e38130064b797ecc99c1cbe (diff)
downloadopenbsd-24017b25b6aa507cb8684a8f62c86469a7aa2c4d.tar.gz
openbsd-24017b25b6aa507cb8684a8f62c86469a7aa2c4d.tar.bz2
openbsd-24017b25b6aa507cb8684a8f62c86469a7aa2c4d.zip
Remove DTLS processed_rcds queue.
When DTLS handshake records are received from the next epoch, we will potentially queue them on the unprocessed_rcds queue - this is usually a Finished message that has been received without the ChangeCipherSuite (CCS) message (which may have been dropped or reordered). After the epoch increments (due to the CCS being received), the current code processes all records on the unprocessed queue and immediate queues them on the processed queue, which dtls1_get_record() then pulls from. This form of processing only adds more complexity and another queue. Instead, once the epoch increments, pull a single record from the unprocessed queue and process it, allowing the contents to be consumed by the caller. We repeat this process until the unprocessed queue is empty, at which point we go back to consuming messages from the wire. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/d1_lib.c10
-rw-r--r--src/lib/libssl/d1_pkt.c57
-rw-r--r--src/lib/libssl/dtls_locl.h5
3 files changed, 22 insertions, 50 deletions
diff --git a/src/lib/libssl/d1_lib.c b/src/lib/libssl/d1_lib.c
index 6d9959ff43..3db5629e23 100644
--- a/src/lib/libssl/d1_lib.c
+++ b/src/lib/libssl/d1_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_lib.c,v 1.57 2021/07/01 17:53:39 jsing Exp $ */ 1/* $OpenBSD: d1_lib.c,v 1.58 2021/07/21 08:42:14 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.
@@ -88,8 +88,6 @@ dtls1_new(SSL *s)
88 88
89 if ((s->d1->internal->unprocessed_rcds.q = pqueue_new()) == NULL) 89 if ((s->d1->internal->unprocessed_rcds.q = pqueue_new()) == NULL)
90 goto err; 90 goto err;
91 if ((s->d1->internal->processed_rcds.q = pqueue_new()) == NULL)
92 goto err;
93 if ((s->d1->internal->buffered_messages = pqueue_new()) == NULL) 91 if ((s->d1->internal->buffered_messages = pqueue_new()) == NULL)
94 goto err; 92 goto err;
95 if ((s->d1->sent_messages = pqueue_new()) == NULL) 93 if ((s->d1->sent_messages = pqueue_new()) == NULL)
@@ -143,7 +141,6 @@ static void
143dtls1_clear_queues(SSL *s) 141dtls1_clear_queues(SSL *s)
144{ 142{
145 dtls1_drain_records(D1I(s)->unprocessed_rcds.q); 143 dtls1_drain_records(D1I(s)->unprocessed_rcds.q);
146 dtls1_drain_records(D1I(s)->processed_rcds.q);
147 dtls1_drain_fragments(D1I(s)->buffered_messages); 144 dtls1_drain_fragments(D1I(s)->buffered_messages);
148 dtls1_drain_fragments(s->d1->sent_messages); 145 dtls1_drain_fragments(s->d1->sent_messages);
149 dtls1_drain_records(D1I(s)->buffered_app_data.q); 146 dtls1_drain_records(D1I(s)->buffered_app_data.q);
@@ -160,7 +157,6 @@ dtls1_free(SSL *s)
160 dtls1_clear_queues(s); 157 dtls1_clear_queues(s);
161 158
162 pqueue_free(D1I(s)->unprocessed_rcds.q); 159 pqueue_free(D1I(s)->unprocessed_rcds.q);
163 pqueue_free(D1I(s)->processed_rcds.q);
164 pqueue_free(D1I(s)->buffered_messages); 160 pqueue_free(D1I(s)->buffered_messages);
165 pqueue_free(s->d1->sent_messages); 161 pqueue_free(s->d1->sent_messages);
166 pqueue_free(D1I(s)->buffered_app_data.q); 162 pqueue_free(D1I(s)->buffered_app_data.q);
@@ -176,7 +172,6 @@ dtls1_clear(SSL *s)
176{ 172{
177 struct dtls1_state_internal_st *internal; 173 struct dtls1_state_internal_st *internal;
178 pqueue unprocessed_rcds; 174 pqueue unprocessed_rcds;
179 pqueue processed_rcds;
180 pqueue buffered_messages; 175 pqueue buffered_messages;
181 pqueue sent_messages; 176 pqueue sent_messages;
182 pqueue buffered_app_data; 177 pqueue buffered_app_data;
@@ -184,7 +179,6 @@ dtls1_clear(SSL *s)
184 179
185 if (s->d1) { 180 if (s->d1) {
186 unprocessed_rcds = D1I(s)->unprocessed_rcds.q; 181 unprocessed_rcds = D1I(s)->unprocessed_rcds.q;
187 processed_rcds = D1I(s)->processed_rcds.q;
188 buffered_messages = D1I(s)->buffered_messages; 182 buffered_messages = D1I(s)->buffered_messages;
189 sent_messages = s->d1->sent_messages; 183 sent_messages = s->d1->sent_messages;
190 buffered_app_data = D1I(s)->buffered_app_data.q; 184 buffered_app_data = D1I(s)->buffered_app_data.q;
@@ -200,7 +194,6 @@ dtls1_clear(SSL *s)
200 D1I(s)->r_epoch = 194 D1I(s)->r_epoch =
201 tls12_record_layer_initial_epoch(s->internal->rl); 195 tls12_record_layer_initial_epoch(s->internal->rl);
202 196
203 D1I(s)->processed_rcds.epoch = D1I(s)->r_epoch;
204 D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1; 197 D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1;
205 198
206 if (s->server) { 199 if (s->server) {
@@ -212,7 +205,6 @@ dtls1_clear(SSL *s)
212 } 205 }
213 206
214 D1I(s)->unprocessed_rcds.q = unprocessed_rcds; 207 D1I(s)->unprocessed_rcds.q = unprocessed_rcds;
215 D1I(s)->processed_rcds.q = processed_rcds;
216 D1I(s)->buffered_messages = buffered_messages; 208 D1I(s)->buffered_messages = buffered_messages;
217 s->d1->sent_messages = sent_messages; 209 s->d1->sent_messages = sent_messages;
218 D1I(s)->buffered_app_data.q = buffered_app_data; 210 D1I(s)->buffered_app_data.q = buffered_app_data;
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c
index 4e773a42bb..0416ee9c59 100644
--- a/src/lib/libssl/d1_pkt.c
+++ b/src/lib/libssl/d1_pkt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_pkt.c,v 1.102 2021/07/21 07:51:12 jsing Exp $ */ 1/* $OpenBSD: d1_pkt.c,v 1.103 2021/07/21 08:42:14 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.
@@ -274,34 +274,23 @@ dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue)
274} 274}
275 275
276static int 276static int
277dtls1_process_buffered_records(SSL *s) 277dtls1_process_buffered_record(SSL *s)
278{ 278{
279 pitem *item; 279 /* Check if epoch is current. */
280 if (D1I(s)->unprocessed_rcds.epoch != D1I(s)->r_epoch)
281 return (0);
280 282
281 item = pqueue_peek(D1I(s)->unprocessed_rcds.q); 283 /* Update epoch once all unprocessed records have been processed. */
282 if (item) { 284 if (pqueue_peek(D1I(s)->unprocessed_rcds.q) == NULL) {
283 /* Check if epoch is current. */ 285 D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1;
284 if (D1I(s)->unprocessed_rcds.epoch != D1I(s)->r_epoch) 286 return (0);
285 return (1);
286 /* Nothing to do. */
287
288 /* Process all the records. */
289 while (pqueue_peek(D1I(s)->unprocessed_rcds.q)) {
290 if (!dtls1_retrieve_buffered_record((s),
291 &((D1I(s))->unprocessed_rcds)))
292 return (0);
293 if (!dtls1_process_record(s))
294 return (0);
295 if (dtls1_buffer_record(s, &(D1I(s)->processed_rcds),
296 S3I(s)->rrec.seq_num) < 0)
297 return (-1);
298 }
299 } 287 }
300 288
301 /* sync epoch numbers once all the unprocessed records 289 /* Process one of the records. */
302 * have been processed */ 290 if (!dtls1_retrieve_buffered_record(s, &D1I(s)->unprocessed_rcds))
303 D1I(s)->processed_rcds.epoch = D1I(s)->r_epoch; 291 return (-1);
304 D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1; 292 if (!dtls1_process_record(s))
293 return (-1);
305 294
306 return (1); 295 return (1);
307} 296}
@@ -365,22 +354,15 @@ dtls1_process_record(SSL *s)
365int 354int
366dtls1_get_record(SSL *s) 355dtls1_get_record(SSL *s)
367{ 356{
368 SSL3_RECORD_INTERNAL *rr; 357 SSL3_RECORD_INTERNAL *rr = &(S3I(s)->rrec);
369 unsigned char *p = NULL; 358 unsigned char *p = NULL;
370 DTLS1_BITMAP *bitmap; 359 DTLS1_BITMAP *bitmap;
371 unsigned int is_next_epoch; 360 unsigned int is_next_epoch;
372 int n; 361 int ret, n;
373 362
374 rr = &(S3I(s)->rrec); 363 /* See if there are pending records that can now be processed. */
375 364 if ((ret = dtls1_process_buffered_record(s)) != 0)
376 /* The epoch may have changed. If so, process all the 365 return (ret);
377 * pending records. This is a non-blocking operation. */
378 if (dtls1_process_buffered_records(s) < 0)
379 return (-1);
380
381 /* if we're renegotiating, then there may be buffered records */
382 if (dtls1_retrieve_buffered_record((s), &((D1I(s))->processed_rcds)))
383 return 1;
384 366
385 /* get something from the wire */ 367 /* get something from the wire */
386 if (0) { 368 if (0) {
@@ -1189,7 +1171,6 @@ dtls1_dispatch_alert(SSL *s)
1189 return (i); 1171 return (i);
1190} 1172}
1191 1173
1192
1193static DTLS1_BITMAP * 1174static DTLS1_BITMAP *
1194dtls1_get_bitmap(SSL *s, SSL3_RECORD_INTERNAL *rr, unsigned int *is_next_epoch) 1175dtls1_get_bitmap(SSL *s, SSL3_RECORD_INTERNAL *rr, unsigned int *is_next_epoch)
1195{ 1176{
diff --git a/src/lib/libssl/dtls_locl.h b/src/lib/libssl/dtls_locl.h
index 9e0699d098..bc28ce8559 100644
--- a/src/lib/libssl/dtls_locl.h
+++ b/src/lib/libssl/dtls_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: dtls_locl.h,v 1.2 2021/07/19 08:42:24 jsing Exp $ */ 1/* $OpenBSD: dtls_locl.h,v 1.3 2021/07/21 08:42:14 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.
@@ -151,9 +151,8 @@ typedef struct dtls1_state_internal_st {
151 151
152 unsigned short handshake_read_seq; 152 unsigned short handshake_read_seq;
153 153
154 /* Received handshake records (processed and unprocessed) */ 154 /* Received handshake records (unprocessed) */
155 record_pqueue unprocessed_rcds; 155 record_pqueue unprocessed_rcds;
156 record_pqueue processed_rcds;
157 156
158 /* Buffered handshake messages */ 157 /* Buffered handshake messages */
159 struct _pqueue *buffered_messages; 158 struct _pqueue *buffered_messages;