Skip to content

Commit 0d9a63c

Browse files
committed
test specified number of tickets are issued and that the last one is useful (we test the first one being usable by the path that tests handshake wo. ticket-requests, so...)
1 parent 061a3ab commit 0d9a63c

File tree

1 file changed

+44
-37
lines changed

1 file changed

+44
-37
lines changed

t/picotls.c

+44-37
Original file line numberDiff line numberDiff line change
@@ -1314,17 +1314,19 @@ static int on_copy_ticket(ptls_encrypt_ticket_t *self, ptls_t *tls, int is_encry
13141314
return 0;
13151315
}
13161316

1317-
static ptls_iovec_t saved_ticket = {NULL};
1317+
static ptls_iovec_t saved_tickets[8] = {{NULL}};
13181318

13191319
static int on_save_ticket(ptls_save_ticket_t *self, ptls_t *tls, ptls_iovec_t src)
13201320
{
1321-
saved_ticket.base = malloc(src.len);
1322-
memcpy(saved_ticket.base, src.base, src.len);
1323-
saved_ticket.len = src.len;
1321+
memmove(saved_tickets + 1, saved_tickets, sizeof(saved_tickets[0]) * (PTLS_ELEMENTSOF(saved_tickets) - 1));
1322+
saved_tickets[0].base = malloc(src.len);
1323+
memcpy(saved_tickets[0].base, src.base, src.len);
1324+
saved_tickets[0].len = src.len;
13241325
return 0;
13251326
}
13261327

1327-
static void test_resumption_impl(int different_preferred_key_share, int require_client_authentication, int transfer_session)
1328+
static void test_resumption_impl(int different_preferred_key_share, int require_client_authentication, int use_ticket_request,
1329+
int transfer_session)
13281330
{
13291331
assert(ctx->key_exchanges[0]->id == ctx_peer->key_exchanges[0]->id);
13301332
assert(ctx->key_exchanges[1] == NULL);
@@ -1335,6 +1337,10 @@ static void test_resumption_impl(int different_preferred_key_share, int require_
13351337

13361338
if (different_preferred_key_share)
13371339
ctx->key_exchanges = different_key_exchanges;
1340+
if (use_ticket_request) {
1341+
ctx->ticket_requests.client.new_session_count = 3;
1342+
ctx->ticket_requests.client.resumption_count = 2;
1343+
}
13381344

13391345
ptls_encrypt_ticket_t et = {on_copy_ticket};
13401346
ptls_save_ticket_t st = {on_save_ticket};
@@ -1343,66 +1349,66 @@ static void test_resumption_impl(int different_preferred_key_share, int require_
13431349
assert(ctx_peer->max_early_data_size == 0);
13441350
assert(ctx_peer->encrypt_ticket == NULL);
13451351
assert(ctx_peer->save_ticket == NULL);
1346-
saved_ticket = ptls_iovec_init(NULL, 0);
1352+
memset(saved_tickets, 0, sizeof(saved_tickets));
13471353

13481354
ctx_peer->ticket_lifetime = 86400;
13491355
ctx_peer->max_early_data_size = 8192;
13501356
ctx_peer->encrypt_ticket = &et;
13511357
ctx->save_ticket = &st;
13521358

1353-
test_handshake(saved_ticket, different_preferred_key_share ? TEST_HANDSHAKE_2RTT : TEST_HANDSHAKE_1RTT, 1, 0, 0,
1359+
test_handshake(ptls_iovec_init(NULL, 0), different_preferred_key_share ? TEST_HANDSHAKE_2RTT : TEST_HANDSHAKE_1RTT, 1, 0, 0,
13541360
transfer_session);
13551361
ok(server_sc_callcnt == 1);
1356-
ok(saved_ticket.base != NULL);
1362+
if (use_ticket_request) {
1363+
/* should have received 3 tickets */
1364+
ok(saved_tickets[2].base != NULL);
1365+
ok(saved_tickets[3].base == NULL);
1366+
} else {
1367+
ok(saved_tickets[0].base != NULL);
1368+
}
13571369

13581370
/* psk using saved ticket */
1359-
test_handshake(saved_ticket, TEST_HANDSHAKE_1RTT, 1, 0, require_client_authentication, transfer_session);
1371+
test_handshake(saved_tickets[0], TEST_HANDSHAKE_1RTT, 1, 0, require_client_authentication, transfer_session);
13601372
ok(server_sc_callcnt == require_client_authentication); /* client authentication turns off resumption */
13611373
ok(client_sc_callcnt == require_client_authentication);
1374+
if (use_ticket_request && !require_client_authentication) {
1375+
/* should have received 2 tickets */
1376+
ok(saved_tickets[4].base != NULL);
1377+
ok(saved_tickets[5].base == NULL);
1378+
}
13621379

13631380
/* 0-rtt psk using saved ticket */
1364-
test_handshake(saved_ticket, TEST_HANDSHAKE_EARLY_DATA, 1, 0, require_client_authentication, transfer_session);
1381+
test_handshake(saved_tickets[0], TEST_HANDSHAKE_EARLY_DATA, 1, 0, require_client_authentication, transfer_session);
13651382
ok(server_sc_callcnt == require_client_authentication); /* client authentication turns off resumption */
13661383
ok(client_sc_callcnt == require_client_authentication);
13671384

13681385
ctx->require_dhe_on_psk = 1;
13691386

13701387
/* psk-dhe using saved ticket */
1371-
test_handshake(saved_ticket, TEST_HANDSHAKE_1RTT, 1, 0, require_client_authentication, transfer_session);
1388+
test_handshake(saved_tickets[0], TEST_HANDSHAKE_1RTT, 1, 0, require_client_authentication, transfer_session);
13721389
ok(server_sc_callcnt == require_client_authentication); /* client authentication turns off resumption */
13731390
ok(client_sc_callcnt == require_client_authentication);
13741391

13751392
/* 0-rtt psk-dhe using saved ticket */
1376-
test_handshake(saved_ticket, TEST_HANDSHAKE_EARLY_DATA, 1, 0, require_client_authentication, transfer_session);
1393+
test_handshake(saved_tickets[0], TEST_HANDSHAKE_EARLY_DATA, 1, 0, require_client_authentication, transfer_session);
13771394
ok(server_sc_callcnt == require_client_authentication); /* client authentication turns off resumption */
13781395
ok(client_sc_callcnt == require_client_authentication);
13791396

13801397
ctx->require_dhe_on_psk = 0;
1398+
ctx->ticket_requests.client.new_session_count = 0;
1399+
ctx->ticket_requests.client.resumption_count = 0;
13811400
ctx_peer->ticket_lifetime = 0;
13821401
ctx_peer->max_early_data_size = 0;
13831402
ctx_peer->encrypt_ticket = NULL;
13841403
ctx->save_ticket = NULL;
13851404
ctx->key_exchanges = key_exchanges_orig;
13861405
}
13871406

1388-
static void test_resumption(void)
1389-
{
1390-
test_resumption_impl(0, 0, 0);
1391-
test_resumption_impl(0, 0, 1);
1392-
}
1393-
1394-
static void test_resumption_different_preferred_key_share(void)
1395-
{
1396-
if (ctx == ctx_peer)
1397-
return;
1398-
test_resumption_impl(1, 0, 0);
1399-
test_resumption_impl(0, 0, 1);
1400-
}
1401-
1402-
static void test_resumption_with_client_authentication(void)
1407+
static void test_resumption(int different_preferred_key_share, int require_client_authentication)
14031408
{
1404-
test_resumption_impl(0, 0, 0);
1405-
test_resumption_impl(0, 1, 1);
1409+
subtest("basic", test_resumption_impl, different_preferred_key_share, require_client_authentication, 0, 0);
1410+
subtest("transfer-session", test_resumption_impl, different_preferred_key_share, require_client_authentication, 0, 1);
1411+
subtest("ticket-request", test_resumption_impl, different_preferred_key_share, require_client_authentication, 1, 0);
14061412
}
14071413

14081414
static void test_async_sign_certificate(void)
@@ -1844,7 +1850,7 @@ static void test_handshake_api(void)
18441850
ctx_peer->ticket_lifetime = 86400;
18451851
ctx_peer->max_early_data_size = 8192;
18461852

1847-
saved_ticket = ptls_iovec_init(NULL, 0);
1853+
memset(saved_tickets, 0, sizeof(saved_tickets));
18481854

18491855
ptls_buffer_init(&cbuf, "", 0);
18501856
ptls_buffer_init(&sbuf, "", 0);
@@ -1893,7 +1899,7 @@ static void test_handshake_api(void)
18931899

18941900
/* 0-RTT resumption */
18951901
size_t max_early_data_size = 0;
1896-
ptls_handshake_properties_t client_hs_prop = {{{{NULL}, saved_ticket, &max_early_data_size}}};
1902+
ptls_handshake_properties_t client_hs_prop = {{{{NULL}, saved_tickets[0], &max_early_data_size}}};
18971903
client = ptls_new(ctx, 0);
18981904
*ptls_get_data_ptr(client) = &client_secrets;
18991905
server = ptls_new(ctx_peer, 1);
@@ -1935,7 +1941,7 @@ static void test_handshake_api(void)
19351941

19361942
/* 0-RTT rejection */
19371943
ctx_peer->max_early_data_size = 0;
1938-
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_ticket, &max_early_data_size}}};
1944+
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_tickets[0], &max_early_data_size}}};
19391945
client = ptls_new(ctx, 0);
19401946
*ptls_get_data_ptr(client) = &client_secrets;
19411947
server = ptls_new(ctx_peer, 1);
@@ -1973,7 +1979,7 @@ static void test_handshake_api(void)
19731979
ctx_peer->max_early_data_size = 8192;
19741980
ptls_handshake_properties_t server_hs_prop = {{{{NULL}}}};
19751981
server_hs_prop.server.enforce_retry = 1;
1976-
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_ticket, &max_early_data_size}}};
1982+
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_tickets[0], &max_early_data_size}}};
19771983
client = ptls_new(ctx, 0);
19781984
*ptls_get_data_ptr(client) = &client_secrets;
19791985
server = ptls_new(ctx_peer, 1);
@@ -2015,7 +2021,7 @@ static void test_handshake_api(void)
20152021
ctx->omit_end_of_early_data = 0;
20162022
ctx_peer->update_traffic_key = NULL;
20172023
ctx_peer->omit_end_of_early_data = 0;
2018-
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_ticket, &max_early_data_size}}};
2024+
client_hs_prop = (ptls_handshake_properties_t){{{{NULL}, saved_tickets[0], &max_early_data_size}}};
20192025
server_hs_prop = (ptls_handshake_properties_t){{{{NULL}}}};
20202026
server_hs_prop.server.enforce_retry = 1;
20212027
client = ptls_new(ctx, 0);
@@ -2083,9 +2089,10 @@ static void test_all_handshakes_core(void)
20832089
subtest("hrr-handshake", test_hrr_handshake);
20842090
/* resumption does not work when the client offers ECH but the server does not recognize that */
20852091
if (!(can_ech(ctx, 0) && !can_ech(ctx_peer, 1))) {
2086-
subtest("resumption", test_resumption);
2087-
subtest("resumption-different-preferred-key-share", test_resumption_different_preferred_key_share);
2088-
subtest("resumption-with-client-authentication", test_resumption_with_client_authentication);
2092+
subtest("resumption", test_resumption, 0, 0);
2093+
if (ctx != ctx_peer)
2094+
subtest("resumption-different-preferred-key-share", test_resumption, 1, 0);
2095+
subtest("resumption-with-client-authentication", test_resumption, 0, 1);
20892096
}
20902097
subtest("async-sign-certificate", test_async_sign_certificate);
20912098
subtest("enforce-retry-stateful", test_enforce_retry_stateful);

0 commit comments

Comments
 (0)