Fix window handling around word32 boundary

This commit is contained in:
Juliusz Sosinowicz
2022-07-07 17:37:10 +02:00
parent 8f3449ffea
commit e295328436
2 changed files with 17 additions and 10 deletions

View File

@ -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 {

View File

@ -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);
}