Skip to content

Commit fd082b3

Browse files
committed
Fix ESP anti-replay window updates
F/779
1 parent c01d51f commit fd082b3

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

src/test/unit/unit_esp.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,16 @@ START_TEST(test_replay_advance_hi_seq)
463463
}
464464
END_TEST
465465

466+
/* The newly advanced hi_seq must be marked as seen immediately. */
467+
START_TEST(test_replay_advanced_hi_seq_duplicate_rejected)
468+
{
469+
replay_t r;
470+
esp_replay_init(r); /* hi_seq=32 */
471+
ck_assert_int_eq(esp_check_replay(&r, 33U), 0);
472+
ck_assert_int_ne(esp_check_replay(&r, 33U), 0);
473+
}
474+
END_TEST
475+
466476
/* A corrupted low hi_seq should not underflow the window floor. */
467477
START_TEST(test_replay_low_hi_seq_accepts_seq_one)
468478
{
@@ -1169,6 +1179,7 @@ static Suite *esp_suite(void)
11691179
tcase_add_test(tc, test_replay_multiple_in_window);
11701180
tcase_add_test(tc, test_replay_below_window_rejected);
11711181
tcase_add_test(tc, test_replay_advance_hi_seq);
1182+
tcase_add_test(tc, test_replay_advanced_hi_seq_duplicate_rejected);
11721183
tcase_add_test(tc, test_replay_low_hi_seq_accepts_seq_one);
11731184
tcase_add_test(tc, test_replay_jump_resets_bitmap);
11741185
tcase_add_test(tc, test_replay_old_seqs_after_jump);

src/wolfesp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,7 +1188,7 @@ esp_check_replay(struct replay_t * replay, uint32_t seq)
11881188
* seq_low - - - - - - - seq - - - - - - hi_seq
11891189
* |<----------- ESP_REPLAY_WIN --------------|
11901190
* */
1191-
if (seq < replay->hi_seq) {
1191+
if (seq <= replay->hi_seq) {
11921192
/* seq number within window. */
11931193
bitn = 1U << (replay->hi_seq - seq);
11941194

@@ -1207,7 +1207,7 @@ esp_check_replay(struct replay_t * replay, uint32_t seq)
12071207
diff = seq - replay->hi_seq;
12081208
if (diff < ESP_REPLAY_WIN) {
12091209
/* within a window width, slide up. */
1210-
replay->bitmap = replay->bitmap << diff;
1210+
replay->bitmap = (replay->bitmap << diff) | 1U;
12111211
}
12121212
else {
12131213
/* reset window. */

0 commit comments

Comments
 (0)