diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/d1_both.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/src/lib/libssl/d1_both.c b/src/lib/libssl/d1_both.c index 534db59ee8..5c93af8bd9 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.32 2015/02/09 10:53:28 jsing Exp $ */ | 1 | /* $OpenBSD: d1_both.c,v 1.33 2015/07/18 23:00:23 doug 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. |
| @@ -125,6 +125,7 @@ | |||
| 125 | #include <openssl/x509.h> | 125 | #include <openssl/x509.h> |
| 126 | 126 | ||
| 127 | #include "pqueue.h" | 127 | #include "pqueue.h" |
| 128 | #include "bytestring.h" | ||
| 128 | 129 | ||
| 129 | #define RSMBLY_BITMASK_SIZE(msg_len) (((msg_len) + 7) / 8) | 130 | #define RSMBLY_BITMASK_SIZE(msg_len) (((msg_len) + 7) / 8) |
| 130 | 131 | ||
| @@ -798,16 +799,15 @@ again: | |||
| 798 | return i; | 799 | return i; |
| 799 | } | 800 | } |
| 800 | /* Handshake fails if message header is incomplete */ | 801 | /* Handshake fails if message header is incomplete */ |
| 801 | if (i != DTLS1_HM_HEADER_LENGTH) { | 802 | if (i != DTLS1_HM_HEADER_LENGTH || |
| 803 | /* parse the message fragment header */ | ||
| 804 | dtls1_get_message_header(wire, &msg_hdr) == 0) { | ||
| 802 | al = SSL_AD_UNEXPECTED_MESSAGE; | 805 | al = SSL_AD_UNEXPECTED_MESSAGE; |
| 803 | SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT, | 806 | SSLerr(SSL_F_DTLS1_GET_MESSAGE_FRAGMENT, |
| 804 | SSL_R_UNEXPECTED_MESSAGE); | 807 | SSL_R_UNEXPECTED_MESSAGE); |
| 805 | goto f_err; | 808 | goto f_err; |
| 806 | } | 809 | } |
| 807 | 810 | ||
| 808 | /* parse the message fragment header */ | ||
| 809 | dtls1_get_message_header(wire, &msg_hdr); | ||
| 810 | |||
| 811 | /* | 811 | /* |
| 812 | * if this is a future (or stale) message it gets buffered | 812 | * if this is a future (or stale) message it gets buffered |
| 813 | * (or dropped)--no further processing at this time | 813 | * (or dropped)--no further processing at this time |
| @@ -1372,16 +1372,36 @@ dtls1_guess_mtu(unsigned int curr_mtu) | |||
| 1372 | return curr_mtu; | 1372 | return curr_mtu; |
| 1373 | } | 1373 | } |
| 1374 | 1374 | ||
| 1375 | void | 1375 | int |
| 1376 | dtls1_get_message_header(unsigned char *data, struct hm_header_st *msg_hdr) | 1376 | dtls1_get_message_header(unsigned char *data, struct hm_header_st *msg_hdr) |
| 1377 | { | 1377 | { |
| 1378 | memset(msg_hdr, 0x00, sizeof(struct hm_header_st)); | 1378 | CBS header; |
| 1379 | msg_hdr->type = *(data++); | 1379 | uint32_t msg_len, frag_off, frag_len; |
| 1380 | n2l3(data, msg_hdr->msg_len); | 1380 | uint16_t seq; |
| 1381 | uint8_t type; | ||
| 1382 | |||
| 1383 | CBS_init(&header, data, sizeof(*msg_hdr)); | ||
| 1384 | |||
| 1385 | memset(msg_hdr, 0, sizeof(*msg_hdr)); | ||
| 1386 | |||
| 1387 | if (!CBS_get_u8(&header, &type)) | ||
| 1388 | return 0; | ||
| 1389 | if (!CBS_get_u24(&header, &msg_len)) | ||
| 1390 | return 0; | ||
| 1391 | if (!CBS_get_u16(&header, &seq)) | ||
| 1392 | return 0; | ||
| 1393 | if (!CBS_get_u24(&header, &frag_off)) | ||
| 1394 | return 0; | ||
| 1395 | if (!CBS_get_u24(&header, &frag_len)) | ||
| 1396 | return 0; | ||
| 1381 | 1397 | ||
| 1382 | n2s(data, msg_hdr->seq); | 1398 | msg_hdr->type = type; |
| 1383 | n2l3(data, msg_hdr->frag_off); | 1399 | msg_hdr->msg_len = msg_len; |
| 1384 | n2l3(data, msg_hdr->frag_len); | 1400 | msg_hdr->seq = seq; |
| 1401 | msg_hdr->frag_off = frag_off; | ||
| 1402 | msg_hdr->frag_len = frag_len; | ||
| 1403 | |||
| 1404 | return 1; | ||
| 1385 | } | 1405 | } |
| 1386 | 1406 | ||
| 1387 | void | 1407 | void |
