diff --git a/src/internal.c b/src/internal.c index 9f6693882..a586650a8 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15414,23 +15414,24 @@ int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo, else { curLT = cur_hi < *next_hi; if (curLT) { - if (cur_lo > (word32)(0 - DTLS_SEQ_BITS) && - *next_lo < DTLS_SEQ_BITS) { - diff = *next_lo - cur_lo; + if (*next_lo < DTLS_SEQ_BITS && + cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) { + /* diff here can still result in a difference that can not + * be stored in the window. The index is checked against + * WOLFSSL_DTLS_WINDOW_WORDS later. */ + diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1; } else { - _DtlsUpdateWindowGTSeq(0, window); - *next_lo = cur_lo + 1; - if (*next_lo == 0) - *next_hi = cur_hi + 1; - else - *next_hi = cur_hi; + /* Too far back to update */ return 1; } } else { - if (*next_lo > (word32)(0 - DTLS_SEQ_BITS) && + if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) && cur_lo < DTLS_SEQ_BITS) { + /* diff here can still result in a difference that can not + * be stored in the window. The index is checked against + * WOLFSSL_DTLS_WINDOW_WORDS later. */ diff = cur_lo - *next_lo; } else { diff --git a/tests/api.c b/tests/api.c index d54fd3cc4..a267d9610 100644 --- a/tests/api.c +++ b/tests/api.c @@ -55621,10 +55621,16 @@ static void test_wolfSSL_DtlsUpdateWindow(void) DUW_TEST(2, 29, next_hi, next_lo, window, 2, 30, 0, 0x64000015); DUW_TEST(2, 33, next_hi, next_lo, window, 2, 34, 6, 0x40000151); DUW_TEST(2, 60, next_hi, next_lo, window, 2, 61, 0x3200000A, 0x88000001); + DUW_TEST(1, 0xFFFFFFF0, next_hi, next_lo, window, 2, 61, 0x3200000A, 0x88000001); DUW_TEST(2, 0xFFFFFFFD, next_hi, next_lo, window, 2, 0xFFFFFFFE, 0, 0x01); DUW_TEST(3, 1, next_hi, next_lo, window, 3, 2, 0, 0x11); DUW_TEST(99, 66, next_hi, next_lo, window, 99, 67, 0, 0x01); + DUW_TEST(50, 66, next_hi, next_lo, window, 99, 67, 0, 0x01); DUW_TEST(100, 68, next_hi, next_lo, window, 100, 69, 0, 0x01); + DUW_TEST(99, 50, next_hi, next_lo, window, 100, 69, 0, 0x01); + DUW_TEST(99, 0xFFFFFFFF, next_hi, next_lo, window, 100, 69, 0, 0x01); + DUW_TEST(150, 0xFFFFFFFF, next_hi, next_lo, window, 151, 0, 0, 0x01); + DUW_TEST(152, 0xFFFFFFFF, next_hi, next_lo, window, 153, 0, 0, 0x01); printf(resultFmt, passed); }