diff options
| author | jsing <> | 2026-06-14 14:33:36 +0000 |
|---|---|---|
| committer | jsing <> | 2026-06-14 14:33:36 +0000 |
| commit | aff99e861ac22e29f303f1540d4783c44cad44f1 (patch) | |
| tree | adf0167b69363944ef3cacc222988d58fdf79c5f /src | |
| parent | 10f1c5f3b1878fc0729a303d0b2257d43206b087 (diff) | |
| download | openbsd-aff99e861ac22e29f303f1540d4783c44cad44f1.tar.gz openbsd-aff99e861ac22e29f303f1540d4783c44cad44f1.tar.bz2 openbsd-aff99e861ac22e29f303f1540d4783c44cad44f1.zip | |
Improve renegotation regress.
Include coverage of Renegotiation Indication and legacy connection
handling.
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libssl/renegotiation/Makefile | 5 | ||||
| -rw-r--r-- | src/regress/lib/libssl/renegotiation/renegotiation_test.c | 124 |
2 files changed, 109 insertions, 20 deletions
diff --git a/src/regress/lib/libssl/renegotiation/Makefile b/src/regress/lib/libssl/renegotiation/Makefile index 55f323e158..935586da62 100644 --- a/src/regress/lib/libssl/renegotiation/Makefile +++ b/src/regress/lib/libssl/renegotiation/Makefile | |||
| @@ -1,10 +1,11 @@ | |||
| 1 | # $OpenBSD: Makefile,v 1.2 2025/02/01 12:26:50 jsing Exp $ | 1 | # $OpenBSD: Makefile,v 1.3 2026/06/14 14:33:36 jsing Exp $ |
| 2 | 2 | ||
| 3 | PROG= renegotiation_test | 3 | PROG= renegotiation_test |
| 4 | LDADD= -lssl -lcrypto | 4 | LDADD= ${SSL_INT} -lcrypto |
| 5 | DPADD= ${LIBSSL} ${LIBCRYPTO} | 5 | DPADD= ${LIBSSL} ${LIBCRYPTO} |
| 6 | WARNINGS= Yes | 6 | WARNINGS= Yes |
| 7 | CFLAGS+= -DLIBRESSL_INTERNAL -Werror | 7 | CFLAGS+= -DLIBRESSL_INTERNAL -Werror |
| 8 | CFLAGS+= -I${.CURDIR}/../../../../lib/libssl | ||
| 8 | 9 | ||
| 9 | REGRESS_TARGETS= \ | 10 | REGRESS_TARGETS= \ |
| 10 | regress-renegotiation-test | 11 | regress-renegotiation-test |
diff --git a/src/regress/lib/libssl/renegotiation/renegotiation_test.c b/src/regress/lib/libssl/renegotiation/renegotiation_test.c index 1c9f35237f..a94da93b9a 100644 --- a/src/regress/lib/libssl/renegotiation/renegotiation_test.c +++ b/src/regress/lib/libssl/renegotiation/renegotiation_test.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: renegotiation_test.c,v 1.3 2025/03/12 14:07:35 jsing Exp $ */ | 1 | /* $OpenBSD: renegotiation_test.c,v 1.4 2026/06/14 14:33:36 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2020,2025 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020,2025 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -21,6 +21,8 @@ | |||
| 21 | #include <openssl/err.h> | 21 | #include <openssl/err.h> |
| 22 | #include <openssl/ssl.h> | 22 | #include <openssl/ssl.h> |
| 23 | 23 | ||
| 24 | #include "ssl_local.h" | ||
| 25 | |||
| 24 | const char *server_ca_file; | 26 | const char *server_ca_file; |
| 25 | const char *server_cert_file; | 27 | const char *server_cert_file; |
| 26 | const char *server_key_file; | 28 | const char *server_key_file; |
| @@ -28,7 +30,13 @@ const char *server_key_file; | |||
| 28 | int debug = 0; | 30 | int debug = 0; |
| 29 | 31 | ||
| 30 | int tls_client_alert; | 32 | int tls_client_alert; |
| 33 | int tls_client_error; | ||
| 34 | |||
| 31 | int tls_server_alert; | 35 | int tls_server_alert; |
| 36 | int tls_server_error; | ||
| 37 | |||
| 38 | int tls_client_disable_ri; | ||
| 39 | int tls_server_disable_ri; | ||
| 32 | 40 | ||
| 33 | static void | 41 | static void |
| 34 | hexdump(const unsigned char *buf, size_t len) | 42 | hexdump(const unsigned char *buf, size_t len) |
| @@ -101,7 +109,7 @@ tls_server(BIO *rbio, BIO *wbio) | |||
| 101 | } | 109 | } |
| 102 | 110 | ||
| 103 | static int | 111 | static int |
| 104 | ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret) | 112 | ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret, int *error) |
| 105 | { | 113 | { |
| 106 | int ssl_err; | 114 | int ssl_err; |
| 107 | 115 | ||
| @@ -122,10 +130,11 @@ ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret) | |||
| 122 | if (tls_client_alert >> 8 == SSL3_AL_WARNING || | 130 | if (tls_client_alert >> 8 == SSL3_AL_WARNING || |
| 123 | tls_server_alert >> 8 == SSL3_AL_WARNING) { | 131 | tls_server_alert >> 8 == SSL3_AL_WARNING) { |
| 124 | ERR_clear_error(); | 132 | ERR_clear_error(); |
| 125 | return 1; | 133 | return 0; |
| 126 | } | 134 | } |
| 127 | fprintf(stderr, "FAIL: %s %s failed - ssl err = %d, errno = %d\n", | 135 | fprintf(stderr, "INFO: %s %s failed - ssl err = %d, errno = %d\n", |
| 128 | name, desc, ssl_err, errno); | 136 | name, desc, ssl_err, errno); |
| 137 | *error = ERR_peek_error(); | ||
| 129 | ERR_print_errors_fp(stderr); | 138 | ERR_print_errors_fp(stderr); |
| 130 | return 0; | 139 | return 0; |
| 131 | } | 140 | } |
| @@ -134,7 +143,7 @@ ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret) | |||
| 134 | } | 143 | } |
| 135 | 144 | ||
| 136 | static int | 145 | static int |
| 137 | do_connect(SSL *ssl, const char *name, int *done) | 146 | do_connect(SSL *ssl, const char *name, int *done, int *error) |
| 138 | { | 147 | { |
| 139 | int ssl_ret; | 148 | int ssl_ret; |
| 140 | 149 | ||
| @@ -144,11 +153,11 @@ do_connect(SSL *ssl, const char *name, int *done) | |||
| 144 | return 1; | 153 | return 1; |
| 145 | } | 154 | } |
| 146 | 155 | ||
| 147 | return ssl_error(ssl, name, "connect", ssl_ret); | 156 | return ssl_error(ssl, name, "connect", ssl_ret, error); |
| 148 | } | 157 | } |
| 149 | 158 | ||
| 150 | static int | 159 | static int |
| 151 | do_accept(SSL *ssl, const char *name, int *done) | 160 | do_accept(SSL *ssl, const char *name, int *done, int *error) |
| 152 | { | 161 | { |
| 153 | int ssl_ret; | 162 | int ssl_ret; |
| 154 | 163 | ||
| @@ -158,11 +167,11 @@ do_accept(SSL *ssl, const char *name, int *done) | |||
| 158 | return 1; | 167 | return 1; |
| 159 | } | 168 | } |
| 160 | 169 | ||
| 161 | return ssl_error(ssl, name, "accept", ssl_ret); | 170 | return ssl_error(ssl, name, "accept", ssl_ret, error); |
| 162 | } | 171 | } |
| 163 | 172 | ||
| 164 | static int | 173 | static int |
| 165 | do_read(SSL *ssl, const char *name, int *done) | 174 | do_read(SSL *ssl, const char *name, int *done, int *error) |
| 166 | { | 175 | { |
| 167 | uint8_t buf[512]; | 176 | uint8_t buf[512]; |
| 168 | int ssl_ret; | 177 | int ssl_ret; |
| @@ -175,11 +184,11 @@ do_read(SSL *ssl, const char *name, int *done) | |||
| 175 | return 1; | 184 | return 1; |
| 176 | } | 185 | } |
| 177 | 186 | ||
| 178 | return ssl_error(ssl, name, "read", ssl_ret); | 187 | return ssl_error(ssl, name, "read", ssl_ret, error); |
| 179 | } | 188 | } |
| 180 | 189 | ||
| 181 | static int | 190 | static int |
| 182 | do_write(SSL *ssl, const char *name, int *done) | 191 | do_write(SSL *ssl, const char *name, int *done, int *error) |
| 183 | { | 192 | { |
| 184 | const uint8_t buf[] = "Hello, World!\n"; | 193 | const uint8_t buf[] = "Hello, World!\n"; |
| 185 | int ssl_ret; | 194 | int ssl_ret; |
| @@ -190,11 +199,11 @@ do_write(SSL *ssl, const char *name, int *done) | |||
| 190 | return 1; | 199 | return 1; |
| 191 | } | 200 | } |
| 192 | 201 | ||
| 193 | return ssl_error(ssl, name, "write", ssl_ret); | 202 | return ssl_error(ssl, name, "write", ssl_ret, error); |
| 194 | } | 203 | } |
| 195 | 204 | ||
| 196 | static int | 205 | static int |
| 197 | do_shutdown(SSL *ssl, const char *name, int *done) | 206 | do_shutdown(SSL *ssl, const char *name, int *done, int *error) |
| 198 | { | 207 | { |
| 199 | int ssl_ret; | 208 | int ssl_ret; |
| 200 | 209 | ||
| @@ -204,10 +213,10 @@ do_shutdown(SSL *ssl, const char *name, int *done) | |||
| 204 | *done = 1; | 213 | *done = 1; |
| 205 | return 1; | 214 | return 1; |
| 206 | } | 215 | } |
| 207 | return ssl_error(ssl, name, "shutdown", ssl_ret); | 216 | return ssl_error(ssl, name, "shutdown", ssl_ret, error); |
| 208 | } | 217 | } |
| 209 | 218 | ||
| 210 | typedef int (*ssl_func)(SSL *ssl, const char *name, int *done); | 219 | typedef int (*ssl_func)(SSL *ssl, const char *name, int *done, int *error); |
| 211 | 220 | ||
| 212 | static int | 221 | static int |
| 213 | do_client_server_loop(SSL *client, ssl_func client_func, SSL *server, | 222 | do_client_server_loop(SSL *client, ssl_func client_func, SSL *server, |
| @@ -220,13 +229,15 @@ do_client_server_loop(SSL *client, ssl_func client_func, SSL *server, | |||
| 220 | if (!client_done) { | 229 | if (!client_done) { |
| 221 | if (debug) | 230 | if (debug) |
| 222 | fprintf(stderr, "DEBUG: client loop\n"); | 231 | fprintf(stderr, "DEBUG: client loop\n"); |
| 223 | if (!client_func(client, "client", &client_done)) | 232 | if (!client_func(client, "client", &client_done, |
| 233 | &tls_client_error)) | ||
| 224 | return 0; | 234 | return 0; |
| 225 | } | 235 | } |
| 226 | if (!server_done) { | 236 | if (!server_done) { |
| 227 | if (debug) | 237 | if (debug) |
| 228 | fprintf(stderr, "DEBUG: server loop\n"); | 238 | fprintf(stderr, "DEBUG: server loop\n"); |
| 229 | if (!server_func(server, "server", &server_done)) | 239 | if (!server_func(server, "server", &server_done, |
| 240 | &tls_server_error)) | ||
| 230 | return 0; | 241 | return 0; |
| 231 | } | 242 | } |
| 232 | } while (i++ < 100 && (!client_done || !server_done)); | 243 | } while (i++ < 100 && (!client_done || !server_done)); |
| @@ -245,8 +256,12 @@ struct tls_reneg_test { | |||
| 245 | int renegotiate_client; | 256 | int renegotiate_client; |
| 246 | int renegotiate_server; | 257 | int renegotiate_server; |
| 247 | int client_ignored; | 258 | int client_ignored; |
| 259 | int client_disable_ri; | ||
| 260 | int server_disable_ri; | ||
| 248 | int want_client_alert; | 261 | int want_client_alert; |
| 249 | int want_server_alert; | 262 | int want_server_alert; |
| 263 | int want_client_connect_error; | ||
| 264 | int want_server_renegotiate_error; | ||
| 250 | int want_failure; | 265 | int want_failure; |
| 251 | }; | 266 | }; |
| 252 | 267 | ||
| @@ -346,6 +361,38 @@ static const struct tls_reneg_test tls_reneg_tests[] = { | |||
| 346 | .want_failure = 1, | 361 | .want_failure = 1, |
| 347 | }, | 362 | }, |
| 348 | { | 363 | { |
| 364 | .desc = "TLSv1.2 - Server Renegotiation Indication disabled, " | ||
| 365 | "client legacy connect", | ||
| 366 | .ssl_max_proto_version = TLS1_2_VERSION, | ||
| 367 | .ssl_client_options = SSL_OP_LEGACY_SERVER_CONNECT, | ||
| 368 | .server_disable_ri = 1, | ||
| 369 | }, | ||
| 370 | { | ||
| 371 | .desc = "TLSv1.2 - Server Renegotiation Indication disabled, " | ||
| 372 | "no client legacy connect", | ||
| 373 | .ssl_max_proto_version = TLS1_2_VERSION, | ||
| 374 | .server_disable_ri = 1, | ||
| 375 | .want_client_connect_error = SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED, | ||
| 376 | }, | ||
| 377 | { | ||
| 378 | .desc = "TLSv1.2 - Server Renegotiation Indication disabled, " | ||
| 379 | "client legacy connect, client renegotiates", | ||
| 380 | .ssl_max_proto_version = TLS1_2_VERSION, | ||
| 381 | .ssl_client_options = SSL_OP_LEGACY_SERVER_CONNECT, | ||
| 382 | .server_disable_ri = 1, | ||
| 383 | .renegotiate_client = 1, | ||
| 384 | .want_client_alert = SSL3_AL_WARNING << 8 | SSL_AD_NO_RENEGOTIATION, | ||
| 385 | }, | ||
| 386 | { | ||
| 387 | .desc = "TLSv1.2 - Server Renegotiation Indication disabled, " | ||
| 388 | "client legacy connect, server renegotiates", | ||
| 389 | .ssl_max_proto_version = TLS1_2_VERSION, | ||
| 390 | .ssl_client_options = SSL_OP_LEGACY_SERVER_CONNECT, | ||
| 391 | .server_disable_ri = 1, | ||
| 392 | .renegotiate_server = 1, | ||
| 393 | .want_server_renegotiate_error = SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED, | ||
| 394 | }, | ||
| 395 | { | ||
| 349 | .desc = "TLSv1.3 - No renegotiation supported, no renegotiation", | 396 | .desc = "TLSv1.3 - No renegotiation supported, no renegotiation", |
| 350 | .ssl_max_proto_version = TLS1_3_VERSION, | 397 | .ssl_max_proto_version = TLS1_3_VERSION, |
| 351 | }, | 398 | }, |
| @@ -376,6 +423,11 @@ tls_client_info_callback(const SSL *ssl, int where, int value) | |||
| 376 | SSL_alert_desc_string_long(value)); | 423 | SSL_alert_desc_string_long(value)); |
| 377 | tls_client_alert = value; | 424 | tls_client_alert = value; |
| 378 | } | 425 | } |
| 426 | |||
| 427 | if (tls_client_disable_ri) { | ||
| 428 | ssl->s3->renegotiate_seen = 0; | ||
| 429 | ssl->s3->send_connection_binding = 0; | ||
| 430 | } | ||
| 379 | } | 431 | } |
| 380 | 432 | ||
| 381 | static void | 433 | static void |
| @@ -387,6 +439,11 @@ tls_server_info_callback(const SSL *ssl, int where, int value) | |||
| 387 | SSL_alert_desc_string_long(value)); | 439 | SSL_alert_desc_string_long(value)); |
| 388 | tls_server_alert = value; | 440 | tls_server_alert = value; |
| 389 | } | 441 | } |
| 442 | |||
| 443 | if (tls_server_disable_ri) { | ||
| 444 | ssl->s3->renegotiate_seen = 0; | ||
| 445 | ssl->s3->send_connection_binding = 0; | ||
| 446 | } | ||
| 390 | } | 447 | } |
| 391 | 448 | ||
| 392 | static int | 449 | static int |
| @@ -445,6 +502,8 @@ tls_reneg_test(const struct tls_reneg_test *trt) | |||
| 445 | if ((client = tls_client(server_wbio, client_wbio)) == NULL) | 502 | if ((client = tls_client(server_wbio, client_wbio)) == NULL) |
| 446 | goto failure; | 503 | goto failure; |
| 447 | 504 | ||
| 505 | SSL_clear_options(client, SSL_OP_LEGACY_SERVER_CONNECT); | ||
| 506 | |||
| 448 | SSL_set_options(client, trt->ssl_client_options); | 507 | SSL_set_options(client, trt->ssl_client_options); |
| 449 | SSL_set_info_callback(client, tls_client_info_callback); | 508 | SSL_set_info_callback(client, tls_client_info_callback); |
| 450 | 509 | ||
| @@ -458,13 +517,33 @@ tls_reneg_test(const struct tls_reneg_test *trt) | |||
| 458 | goto failure; | 517 | goto failure; |
| 459 | 518 | ||
| 460 | tls_client_alert = 0; | 519 | tls_client_alert = 0; |
| 520 | tls_client_error = 0; | ||
| 521 | |||
| 461 | tls_server_alert = 0; | 522 | tls_server_alert = 0; |
| 523 | tls_server_error = 0; | ||
| 524 | |||
| 525 | tls_client_disable_ri = trt->client_disable_ri; | ||
| 526 | tls_server_disable_ri = trt->server_disable_ri; | ||
| 462 | 527 | ||
| 463 | if (!do_client_server_loop(client, do_connect, server, do_accept)) { | 528 | if (!do_client_server_loop(client, do_connect, server, do_accept)) { |
| 529 | if (trt->want_client_connect_error != 0) { | ||
| 530 | if (ERR_GET_REASON(tls_client_error) != trt->want_client_connect_error) { | ||
| 531 | fprintf(stderr, "FAIL: got client error 0x%x, want " | ||
| 532 | "error 0x%x\n", ERR_GET_REASON(tls_client_error), | ||
| 533 | trt->want_client_connect_error); | ||
| 534 | goto failure; | ||
| 535 | } | ||
| 536 | goto done; | ||
| 537 | } | ||
| 464 | fprintf(stderr, "FAIL: client and server handshake failed\n"); | 538 | fprintf(stderr, "FAIL: client and server handshake failed\n"); |
| 465 | goto failure; | 539 | goto failure; |
| 466 | } | 540 | } |
| 467 | 541 | ||
| 542 | if (trt->want_client_connect_error != 0) { | ||
| 543 | fprintf(stderr, "FAIL: handshake should have failed\n"); | ||
| 544 | goto failure; | ||
| 545 | } | ||
| 546 | |||
| 468 | if (!do_client_server_loop(client, do_write, server, do_read)) { | 547 | if (!do_client_server_loop(client, do_write, server, do_read)) { |
| 469 | fprintf(stderr, "FAIL: client write and server read failed\n"); | 548 | fprintf(stderr, "FAIL: client write and server read failed\n"); |
| 470 | goto failure; | 549 | goto failure; |
| @@ -500,7 +579,16 @@ tls_reneg_test(const struct tls_reneg_test *trt) | |||
| 500 | goto failure; | 579 | goto failure; |
| 501 | 580 | ||
| 502 | if (!do_client_server_loop(client, do_read, server, do_write)) { | 581 | if (!do_client_server_loop(client, do_read, server, do_write)) { |
| 503 | fprintf(stderr, "FAIL: client read and server write failed\n"); | 582 | if (trt->want_server_renegotiate_error != 0) { |
| 583 | if (ERR_GET_REASON(tls_server_error) != trt->want_server_renegotiate_error) { | ||
| 584 | fprintf(stderr, "FAIL: got server error 0x%x, want " | ||
| 585 | "error 0x%x\n", ERR_GET_REASON(tls_server_error), | ||
| 586 | trt->want_server_renegotiate_error); | ||
| 587 | goto failure; | ||
| 588 | } | ||
| 589 | goto done; | ||
| 590 | } | ||
| 591 | fprintf(stderr, "FAIL: client write and server read failed\n"); | ||
| 504 | goto failure; | 592 | goto failure; |
| 505 | } | 593 | } |
| 506 | 594 | ||
