Skip to content

Commit a568dda

Browse files
philljjdanielinux
authored andcommitted
esp: improve oseq overflow handling.
1 parent 930034f commit a568dda

3 files changed

Lines changed: 54 additions & 2 deletions

File tree

src/test/unit/unit_esp.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,53 @@ START_TEST(test_replay_old_seqs_after_jump)
503503
}
504504
END_TEST
505505

506+
/* The transmitted sequence number must never be allowed to overflow. */
507+
START_TEST(test_replay_overflow)
508+
{
509+
static uint8_t buf[LINK_MTU + 256];
510+
uint8_t ref[64];
511+
uint32_t frame_len, i;
512+
uint16_t ip_len;
513+
int ret;
514+
wolfIP_esp_sa * esp_sa = NULL;
515+
struct wolfIP_ip_packet *ip = (struct wolfIP_ip_packet *)buf;
516+
517+
for (i = 0U; i < sizeof(ref); i++) ref[i] = (uint8_t)(i & 0xFFU);
518+
519+
esp_setup();
520+
521+
ret = wolfIP_esp_sa_new_gcm(0, (uint8_t *)spi_rt,
522+
atoip4(T_SRC), atoip4(T_DST),
523+
ESP_ENC_GCM_RFC4543,
524+
(uint8_t *)k_aes256_gcm,
525+
sizeof(k_aes256_gcm));
526+
ck_assert_int_eq(ret, 0);
527+
esp_sa = esp_sa_get(0, (uint8_t *)spi_rt);
528+
ck_assert_ptr_nonnull(esp_sa);
529+
530+
/* Set oseq to 10 before overflow. */
531+
esp_sa->replay.oseq = (ESP_MAX_32_SEQ - 10);
532+
533+
/* all of these should be ok. */
534+
for (i = 0; i < 10; ++i) {
535+
frame_len = build_ip_packet(buf, sizeof(buf), WI_IPPROTO_UDP,
536+
ref, sizeof(ref));
537+
ip_len = (uint16_t)(frame_len - ETH_HEADER_LEN);
538+
539+
ret = esp_transport_wrap(ip, &ip_len);
540+
ck_assert_int_eq(ret, 0);
541+
}
542+
543+
/* oseq overflow is detected, and is rejected. */
544+
frame_len = build_ip_packet(buf, sizeof(buf), WI_IPPROTO_UDP,
545+
ref, sizeof(ref));
546+
ip_len = (uint16_t)(frame_len - ETH_HEADER_LEN);
547+
548+
ret = esp_transport_wrap(ip, &ip_len);
549+
ck_assert_int_eq(ret, -1);
550+
}
551+
END_TEST
552+
506553
/*
507554
* esp_transport_unwrap error paths
508555
*/
@@ -1123,6 +1170,7 @@ static Suite *esp_suite(void)
11231170
tcase_add_test(tc, test_replay_low_hi_seq_accepts_seq_one);
11241171
tcase_add_test(tc, test_replay_jump_resets_bitmap);
11251172
tcase_add_test(tc, test_replay_old_seqs_after_jump);
1173+
tcase_add_test(tc, test_replay_overflow);
11261174
suite_add_tcase(s, tc);
11271175

11281176
/* Unwrap error paths */

src/wolfesp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1489,10 +1489,14 @@ esp_transport_wrap(struct wolfIP_ip_packet *ip, uint16_t * ip_len)
14891489
memcpy(payload, esp_sa->spi, sizeof(esp_sa->spi));
14901490
payload += ESP_SPI_LEN;
14911491

1492+
esp_sa->replay.oseq++;
1493+
if (esp_sa->replay.oseq == 0) {
1494+
ESP_LOG("error: oseq overflow\n");
1495+
return -1;
1496+
}
14921497
seq_n = ee32(esp_sa->replay.oseq);
14931498
memcpy(payload, &seq_n, sizeof(seq_n));
14941499
payload += ESP_SEQ_LEN;
1495-
esp_sa->replay.oseq++;
14961500

14971501
if (iv_len) {
14981502
/* skip iv field, will generate later. */

wolfesp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ typedef struct replay_t replay_t;
6969
do { \
7070
(r).bitmap = 0U; \
7171
(r).hi_seq = ESP_REPLAY_WIN; \
72-
(r).oseq = 1U; \
72+
(r).oseq = 0U; \
7373
} while (0)
7474

7575
/* Minimal ESP Security Association structure.

0 commit comments

Comments
 (0)