Skip to content

Commit a83514b

Browse files
committed
dtls.c: add check for valid handshake message type when version is 1.0.
Fixes issue #209. Signed-off-by: Achim Kraus <achim.kraus@cloudcoap.net>
1 parent 8c55636 commit a83514b

1 file changed

Lines changed: 26 additions & 10 deletions

File tree

dtls.c

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,12 @@ memarray_t dtlscontext_storage;
8282

8383
#define dtls_set_version(H,V) dtls_int_to_uint16((H)->version, (V))
8484
#define dtls_set_content_type(H,V) ((H)->content_type = (V) & 0xff)
85-
#define dtls_set_length(H,V) ((H)->length = (V))
85+
#define dtls_set_length(H,V) dtls_int_to_uint16(&((H)->length), (V))
8686

8787
#define dtls_get_content_type(H) ((H)->content_type & 0xff)
8888
#define dtls_get_version(H) dtls_uint16_to_int((H)->version)
8989
#define dtls_get_epoch(H) dtls_uint16_to_int((H)->epoch)
90+
#define dtls_get_length(H) dtls_uint16_to_int((H)->length)
9091
#define dtls_get_sequence_number(H) dtls_uint48_to_ulong((H)->sequence_number)
9192
#define dtls_get_fragment_length(H) dtls_uint24_to_int((H)->fragment_length)
9293

@@ -563,15 +564,30 @@ is_record(uint8 *msg, size_t msglen) {
563564
unsigned int rlen = 0;
564565

565566
if (msglen >= DTLS_RH_LENGTH) { /* FIXME allow empty records? */
566-
uint16_t version = dtls_uint16_to_int(msg + 1);
567-
if ((((version == DTLS_VERSION) || (version == DTLS10_VERSION))
568-
&& known_content_type(msg))) {
569-
rlen = DTLS_RH_LENGTH +
570-
dtls_uint16_to_int(DTLS_RECORD_HEADER(msg)->length);
571-
572-
/* we do not accept wrong length field in record header */
573-
if (rlen > msglen)
574-
rlen = 0;
567+
uint16_t version = dtls_get_version(DTLS_RECORD_HEADER(msg));
568+
569+
if (DTLS_VERSION == version) {
570+
if (!known_content_type(msg)) {
571+
return 0;
572+
}
573+
} else if (DTLS10_VERSION == version) {
574+
if (DTLS_CT_HANDSHAKE != msg[0] || DTLS_RH_LENGTH == msglen) {
575+
return 0;
576+
} else {
577+
uint8_t handshake_type = msg[DTLS_RH_LENGTH];
578+
if (DTLS_HT_CLIENT_HELLO != handshake_type &&
579+
DTLS_HT_HELLO_VERIFY_REQUEST != handshake_type) {
580+
return 0;
581+
}
582+
}
583+
} else {
584+
return 0;
585+
}
586+
rlen = DTLS_RH_LENGTH + dtls_uint16_to_int(DTLS_RECORD_HEADER(msg)->length);
587+
588+
/* we do not accept wrong length field in record header */
589+
if (rlen > msglen) {
590+
rlen = 0;
575591
}
576592
}
577593

0 commit comments

Comments
 (0)