summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2026-06-14 14:33:36 +0000
committerjsing <>2026-06-14 14:33:36 +0000
commitaff99e861ac22e29f303f1540d4783c44cad44f1 (patch)
treeadf0167b69363944ef3cacc222988d58fdf79c5f /src
parent10f1c5f3b1878fc0729a303d0b2257d43206b087 (diff)
downloadopenbsd-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/Makefile5
-rw-r--r--src/regress/lib/libssl/renegotiation/renegotiation_test.c124
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
3PROG= renegotiation_test 3PROG= renegotiation_test
4LDADD= -lssl -lcrypto 4LDADD= ${SSL_INT} -lcrypto
5DPADD= ${LIBSSL} ${LIBCRYPTO} 5DPADD= ${LIBSSL} ${LIBCRYPTO}
6WARNINGS= Yes 6WARNINGS= Yes
7CFLAGS+= -DLIBRESSL_INTERNAL -Werror 7CFLAGS+= -DLIBRESSL_INTERNAL -Werror
8CFLAGS+= -I${.CURDIR}/../../../../lib/libssl
8 9
9REGRESS_TARGETS= \ 10REGRESS_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
24const char *server_ca_file; 26const char *server_ca_file;
25const char *server_cert_file; 27const char *server_cert_file;
26const char *server_key_file; 28const char *server_key_file;
@@ -28,7 +30,13 @@ const char *server_key_file;
28int debug = 0; 30int debug = 0;
29 31
30int tls_client_alert; 32int tls_client_alert;
33int tls_client_error;
34
31int tls_server_alert; 35int tls_server_alert;
36int tls_server_error;
37
38int tls_client_disable_ri;
39int tls_server_disable_ri;
32 40
33static void 41static void
34hexdump(const unsigned char *buf, size_t len) 42hexdump(const unsigned char *buf, size_t len)
@@ -101,7 +109,7 @@ tls_server(BIO *rbio, BIO *wbio)
101} 109}
102 110
103static int 111static int
104ssl_error(SSL *ssl, const char *name, const char *desc, int ssl_ret) 112ssl_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
136static int 145static int
137do_connect(SSL *ssl, const char *name, int *done) 146do_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
150static int 159static int
151do_accept(SSL *ssl, const char *name, int *done) 160do_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
164static int 173static int
165do_read(SSL *ssl, const char *name, int *done) 174do_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
181static int 190static int
182do_write(SSL *ssl, const char *name, int *done) 191do_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
196static int 205static int
197do_shutdown(SSL *ssl, const char *name, int *done) 206do_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
210typedef int (*ssl_func)(SSL *ssl, const char *name, int *done); 219typedef int (*ssl_func)(SSL *ssl, const char *name, int *done, int *error);
211 220
212static int 221static int
213do_client_server_loop(SSL *client, ssl_func client_func, SSL *server, 222do_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
381static void 433static 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
392static int 449static 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