VirtualBox

source: vbox/trunk/src/libs/openssl-3.4.1/test/rpktest.c

Last change on this file was 109052, checked in by vboxsync, 3 weeks ago

openssl-3.4.1: Applied our changes, regenerated files, added missing files and functions. This time with a three way merge. ​bugref:10890

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.8 KB
Line 
1/*
2 * Copyright 2023-2025 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9#include <openssl/ssl.h>
10
11#include "helpers/ssltestlib.h"
12#include "internal/dane.h"
13#include "testutil.h"
14
15#undef OSSL_NO_USABLE_TLS1_3
16#if defined(OPENSSL_NO_TLS1_3) \
17 || (defined(OPENSSL_NO_EC) && defined(OPENSSL_NO_DH))
18/*
19 * If we don't have ec or dh then there are no built-in groups that are usable
20 * with TLSv1.3
21 */
22# define OSSL_NO_USABLE_TLS1_3
23#endif
24
25static char *certsdir = NULL;
26static char *rootcert = NULL;
27static char *cert = NULL;
28static char *privkey = NULL;
29static char *cert2 = NULL;
30static char *privkey2 = NULL;
31static char *cert448 = NULL;
32static char *privkey448 = NULL;
33static char *cert25519 = NULL;
34static char *privkey25519 = NULL;
35static OSSL_LIB_CTX *libctx = NULL;
36static OSSL_PROVIDER *defctxnull = NULL;
37
38static const unsigned char cert_type_rpk[] = { TLSEXT_cert_type_rpk, TLSEXT_cert_type_x509 };
39static const unsigned char SID_CTX[] = { 'r', 'p', 'k' };
40
41static int rpk_verify_client_cb(int ok, X509_STORE_CTX *ctx)
42{
43 int err = X509_STORE_CTX_get_error(ctx);
44
45 if (X509_STORE_CTX_get0_rpk(ctx) != NULL) {
46 if (err != X509_V_OK) {
47 TEST_info("rpk_verify_client_cb: ok=%d err=%d", ok, err);
48 return 0;
49 }
50 }
51 return 1;
52}
53static int rpk_verify_server_cb(int ok, X509_STORE_CTX *ctx)
54{
55 int err = X509_STORE_CTX_get_error(ctx);
56
57 if (X509_STORE_CTX_get0_rpk(ctx) != NULL) {
58 if (err != X509_V_OK) {
59 TEST_info("rpk_verify_server_cb: ok=%d err=%d", ok, err);
60 return 0;
61 }
62 }
63 return 1;
64}
65
66/*
67 * Test dimensions:
68 * (2) server_cert_type RPK off/on for server
69 * (2) client_cert_type RPK off/on for server
70 * (2) server_cert_type RPK off/on for client
71 * (2) client_cert_type RPK off/on for client
72 * (4) RSA vs ECDSA vs Ed25519 vs Ed448 certificates
73 * (2) TLSv1.2 vs TLSv1.3
74 *
75 * Tests:
76 * idx = 0 - is the normal success case, certificate, single peer key
77 * idx = 1 - only a private key
78 * idx = 2 - add client authentication
79 * idx = 3 - add second peer key (rootcert.pem)
80 * idx = 4 - add second peer key (different, RSA or ECDSA)
81 * idx = 5 - reverse peer keys (rootcert.pem, different order)
82 * idx = 6 - reverse peer keys (RSA or ECDSA, different order)
83 * idx = 7 - expects failure due to mismatched key (RSA or ECDSA)
84 * idx = 8 - expects failure due to no configured key on client
85 * idx = 9 - add client authentication (PHA)
86 * idx = 10 - add client authentication (privake key only)
87 * idx = 11 - simple resumption
88 * idx = 12 - simple resumption, no ticket
89 * idx = 13 - resumption with client authentication
90 * idx = 14 - resumption with client authentication, no ticket
91 * idx = 15 - like 0, but use non-default libctx
92 * idx = 16 - like 7, but with SSL_VERIFY_PEER connection should fail
93 * idx = 17 - like 8, but with SSL_VERIFY_PEER connection should fail
94 *
95 * 18 * 2 * 4 * 2 * 2 * 2 * 2 = 2048 tests
96 */
97static int test_rpk(int idx)
98{
99# define RPK_TESTS 18
100# define RPK_DIMS (2 * 4 * 2 * 2 * 2 * 2)
101 SSL_CTX *cctx = NULL, *sctx = NULL;
102 SSL *clientssl = NULL, *serverssl = NULL;
103 EVP_PKEY *pkey = NULL, *other_pkey = NULL, *root_pkey = NULL;
104 X509 *x509 = NULL, *other_x509 = NULL, *root_x509 = NULL;
105 int testresult = 0, ret, expected = 1;
106 int client_expected = X509_V_OK;
107 int verify;
108 int tls_version;
109 char *cert_file = NULL;
110 char *privkey_file = NULL;
111 char *other_cert_file = NULL;
112 SSL_SESSION *client_sess = NULL;
113 SSL_SESSION *server_sess = NULL;
114 int idx_server_server_rpk, idx_server_client_rpk;
115 int idx_client_server_rpk, idx_client_client_rpk;
116 int idx_cert, idx_prot;
117 int client_auth = 0;
118 int resumption = 0;
119 int want_error = SSL_ERROR_NONE;
120 long server_verify_result = 0;
121 long client_verify_result = 0;
122 OSSL_LIB_CTX *test_libctx = NULL;
123
124 if (!TEST_int_le(idx, RPK_TESTS * RPK_DIMS))
125 return 0;
126
127 idx_server_server_rpk = idx / (RPK_TESTS * 2 * 4 * 2 * 2 * 2);
128 idx %= RPK_TESTS * 2 * 4 * 2 * 2 * 2;
129 idx_server_client_rpk = idx / (RPK_TESTS * 2 * 4 * 2 * 2);
130 idx %= RPK_TESTS * 2 * 4 * 2 * 2;
131 idx_client_server_rpk = idx / (RPK_TESTS * 2 * 4 * 2);
132 idx %= RPK_TESTS * 2 * 4 * 2;
133 idx_client_client_rpk = idx / (RPK_TESTS * 2 * 4);
134 idx %= RPK_TESTS * 2 * 4;
135 idx_cert = idx / (RPK_TESTS * 2);
136 idx %= RPK_TESTS * 2;
137 idx_prot = idx / RPK_TESTS;
138 idx %= RPK_TESTS;
139
140 /* Load "root" cert/pubkey */
141 root_x509 = load_cert_pem(rootcert, NULL);
142 if (!TEST_ptr(root_x509))
143 goto end;
144 root_pkey = X509_get0_pubkey(root_x509);
145 if (!TEST_ptr(root_pkey))
146 goto end;
147
148 switch (idx_cert) {
149 case 0:
150 /* use RSA */
151 cert_file = cert;
152 privkey_file = privkey;
153 other_cert_file = cert2;
154 break;
155#ifndef OPENSSL_NO_ECDSA
156 case 1:
157 /* use ECDSA */
158 cert_file = cert2;
159 privkey_file = privkey2;
160 other_cert_file = cert;
161 break;
162# ifndef OPENSSL_NO_ECX
163 case 2:
164 /* use Ed448 */
165 cert_file = cert448;
166 privkey_file = privkey448;
167 other_cert_file = cert;
168 break;
169 case 3:
170 /* use Ed25519 */
171 cert_file = cert25519;
172 privkey_file = privkey25519;
173 other_cert_file = cert;
174 break;
175# endif
176#endif
177 default:
178 testresult = TEST_skip("EDCSA disabled");
179 goto end;
180 }
181 /* Load primary cert */
182 x509 = load_cert_pem(cert_file, NULL);
183 if (!TEST_ptr(x509))
184 goto end;
185 pkey = X509_get0_pubkey(x509);
186 /* load other cert */
187 other_x509 = load_cert_pem(other_cert_file, NULL);
188 if (!TEST_ptr(other_x509))
189 goto end;
190 other_pkey = X509_get0_pubkey(other_x509);
191#ifdef OPENSSL_NO_ECDSA
192 /* Can't get other_key if it's ECDSA */
193 if (other_pkey == NULL && idx_cert == 0
194 && (idx == 4 || idx == 6 || idx == 7 || idx == 16)) {
195 testresult = TEST_skip("EDCSA disabled");
196 goto end;
197 }
198#endif
199
200 switch (idx_prot) {
201 case 0:
202#ifdef OSSL_NO_USABLE_TLS1_3
203 testresult = TEST_skip("TLSv1.3 disabled");
204 goto end;
205#else
206 tls_version = TLS1_3_VERSION;
207 break;
208#endif
209 case 1:
210#ifdef OPENSSL_NO_TLS1_2
211 testresult = TEST_skip("TLSv1.2 disabled");
212 goto end;
213#else
214 tls_version = TLS1_2_VERSION;
215 break;
216#endif
217 default:
218 goto end;
219 }
220
221 if (idx == 15) {
222 test_libctx = libctx;
223 defctxnull = OSSL_PROVIDER_load(NULL, "null");
224 if (!TEST_ptr(defctxnull))
225 goto end;
226 }
227 if (!TEST_true(create_ssl_ctx_pair(test_libctx,
228 TLS_server_method(), TLS_client_method(),
229 tls_version, tls_version,
230 &sctx, &cctx, NULL, NULL)))
231 goto end;
232
233 if (idx_server_server_rpk)
234 if (!TEST_true(SSL_CTX_set1_server_cert_type(sctx, cert_type_rpk, sizeof(cert_type_rpk))))
235 goto end;
236 if (idx_server_client_rpk)
237 if (!TEST_true(SSL_CTX_set1_client_cert_type(sctx, cert_type_rpk, sizeof(cert_type_rpk))))
238 goto end;
239 if (idx_client_server_rpk)
240 if (!TEST_true(SSL_CTX_set1_server_cert_type(cctx, cert_type_rpk, sizeof(cert_type_rpk))))
241 goto end;
242 if (idx_client_client_rpk)
243 if (!TEST_true(SSL_CTX_set1_client_cert_type(cctx, cert_type_rpk, sizeof(cert_type_rpk))))
244 goto end;
245 if (!TEST_true(SSL_CTX_set_session_id_context(sctx, SID_CTX, sizeof(SID_CTX))))
246 goto end;
247 if (!TEST_true(SSL_CTX_set_session_id_context(cctx, SID_CTX, sizeof(SID_CTX))))
248 goto end;
249
250 if (!TEST_int_gt(SSL_CTX_dane_enable(sctx), 0))
251 goto end;
252 if (!TEST_int_gt(SSL_CTX_dane_enable(cctx), 0))
253 goto end;
254
255 /* NEW */
256 SSL_CTX_set_verify(cctx, SSL_VERIFY_PEER, rpk_verify_client_cb);
257
258 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
259 NULL, NULL)))
260 goto end;
261
262 if (!TEST_int_gt(SSL_dane_enable(serverssl, NULL), 0))
263 goto end;
264 if (!TEST_int_gt(SSL_dane_enable(clientssl, "example.com"), 0))
265 goto end;
266
267 /* Set private key and certificate */
268 if (!TEST_int_eq(SSL_use_PrivateKey_file(serverssl, privkey_file, SSL_FILETYPE_PEM), 1))
269 goto end;
270 /* Only a private key */
271 if (idx == 1) {
272 if (idx_server_server_rpk == 0 || idx_client_server_rpk == 0) {
273 expected = 0;
274 want_error = SSL_ERROR_SSL;
275 }
276 } else {
277 /* Add certificate */
278 if (!TEST_int_eq(SSL_use_certificate_file(serverssl, cert_file, SSL_FILETYPE_PEM), 1))
279 goto end;
280 if (!TEST_int_eq(SSL_check_private_key(serverssl), 1))
281 goto end;
282 }
283
284 switch (idx) {
285 default:
286 if (!TEST_true(idx < RPK_TESTS))
287 goto end;
288 break;
289 case 0:
290 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
291 goto end;
292 break;
293 case 1:
294 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
295 goto end;
296 break;
297 case 2:
298 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
299 goto end;
300 if (!TEST_true(SSL_add_expected_rpk(serverssl, pkey)))
301 goto end;
302 /* Use the same key for client auth */
303 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
304 goto end;
305 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
306 goto end;
307 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
308 goto end;
309 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
310 client_auth = 1;
311 break;
312 case 3:
313 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
314 goto end;
315 if (!TEST_true(SSL_add_expected_rpk(clientssl, root_pkey)))
316 goto end;
317 break;
318 case 4:
319 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
320 goto end;
321 if (!TEST_true(SSL_add_expected_rpk(clientssl, other_pkey)))
322 goto end;
323 break;
324 case 5:
325 if (!TEST_true(SSL_add_expected_rpk(clientssl, root_pkey)))
326 goto end;
327 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
328 goto end;
329 break;
330 case 6:
331 if (!TEST_true(SSL_add_expected_rpk(clientssl, other_pkey)))
332 goto end;
333 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
334 goto end;
335 break;
336 case 7:
337 if (idx_server_server_rpk == 1 && idx_client_server_rpk == 1)
338 client_expected = -1;
339 if (!TEST_true(SSL_add_expected_rpk(clientssl, other_pkey)))
340 goto end;
341 SSL_set_verify(clientssl, SSL_VERIFY_NONE, rpk_verify_client_cb);
342 client_verify_result = X509_V_ERR_DANE_NO_MATCH;
343 break;
344 case 8:
345 if (idx_server_server_rpk == 1 && idx_client_server_rpk == 1)
346 client_expected = -1;
347 /* no peer keys */
348 SSL_set_verify(clientssl, SSL_VERIFY_NONE, rpk_verify_client_cb);
349 client_verify_result = X509_V_ERR_RPK_UNTRUSTED;
350 break;
351 case 9:
352 if (tls_version != TLS1_3_VERSION) {
353 testresult = TEST_skip("PHA requires TLSv1.3");
354 goto end;
355 }
356 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
357 goto end;
358 if (!TEST_true(SSL_add_expected_rpk(serverssl, pkey)))
359 goto end;
360 /* Use the same key for client auth */
361 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
362 goto end;
363 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
364 goto end;
365 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
366 goto end;
367 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_POST_HANDSHAKE, rpk_verify_server_cb);
368 SSL_set_post_handshake_auth(clientssl, 1);
369 client_auth = 1;
370 break;
371 case 10:
372 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
373 goto end;
374 if (!TEST_true(SSL_add_expected_rpk(serverssl, pkey)))
375 goto end;
376 /* Use the same key for client auth */
377 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
378 goto end;
379 /* Since there's no cert, this is expected to fail without RPK support */
380 if (!idx_server_client_rpk || !idx_client_client_rpk) {
381 expected = 0;
382 want_error = SSL_ERROR_SSL;
383 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
384 } else {
385 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
386 }
387 client_auth = 1;
388 break;
389 case 11:
390 if (!idx_server_server_rpk || !idx_client_server_rpk) {
391 testresult = TEST_skip("Only testing resumption with server RPK");
392 goto end;
393 }
394 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
395 goto end;
396 resumption = 1;
397 break;
398 case 12:
399 if (!idx_server_server_rpk || !idx_client_server_rpk) {
400 testresult = TEST_skip("Only testing resumption with server RPK");
401 goto end;
402 }
403 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
404 goto end;
405 SSL_set_options(serverssl, SSL_OP_NO_TICKET);
406 SSL_set_options(clientssl, SSL_OP_NO_TICKET);
407 resumption = 1;
408 break;
409 case 13:
410 if (!idx_server_server_rpk || !idx_client_server_rpk) {
411 testresult = TEST_skip("Only testing resumption with server RPK");
412 goto end;
413 }
414 if (!idx_server_client_rpk || !idx_client_client_rpk) {
415 testresult = TEST_skip("Only testing client authentication resumption with client RPK");
416 goto end;
417 }
418 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
419 goto end;
420 if (!TEST_true(SSL_add_expected_rpk(serverssl, pkey)))
421 goto end;
422 /* Use the same key for client auth */
423 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
424 goto end;
425 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
426 goto end;
427 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
428 goto end;
429 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
430 client_auth = 1;
431 resumption = 1;
432 break;
433 case 14:
434 if (!idx_server_server_rpk || !idx_client_server_rpk) {
435 testresult = TEST_skip("Only testing resumption with server RPK");
436 goto end;
437 }
438 if (!idx_server_client_rpk || !idx_client_client_rpk) {
439 testresult = TEST_skip("Only testing client authentication resumption with client RPK");
440 goto end;
441 }
442 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
443 goto end;
444 if (!TEST_true(SSL_add_expected_rpk(serverssl, pkey)))
445 goto end;
446 /* Use the same key for client auth */
447 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
448 goto end;
449 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
450 goto end;
451 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
452 goto end;
453 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
454 SSL_set_options(serverssl, SSL_OP_NO_TICKET);
455 SSL_set_options(clientssl, SSL_OP_NO_TICKET);
456 client_auth = 1;
457 resumption = 1;
458 break;
459 case 15:
460 if (!TEST_true(SSL_add_expected_rpk(clientssl, pkey)))
461 goto end;
462 break;
463 case 16:
464 if (idx_server_server_rpk == 1 && idx_client_server_rpk == 1) {
465 /* wrong expected server key */
466 expected = 0;
467 want_error = SSL_ERROR_SSL;
468 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
469 }
470 if (!TEST_true(SSL_add_expected_rpk(clientssl, other_pkey)))
471 goto end;
472 break;
473 case 17:
474 if (idx_server_server_rpk == 1 && idx_client_server_rpk == 1) {
475 /* no expected server keys */
476 expected = 0;
477 want_error = SSL_ERROR_SSL;
478 SSL_set_verify(serverssl, SSL_VERIFY_PEER, NULL);
479 }
480 break;
481 }
482
483 ret = create_ssl_connection(serverssl, clientssl, want_error);
484 if (!TEST_int_eq(expected, ret))
485 goto end;
486
487 if (expected <= 0) {
488 testresult = 1;
489 goto end;
490 }
491
492 /* Make sure client gets RPK or certificate as configured */
493 if (idx_server_server_rpk && idx_client_server_rpk) {
494 if (!TEST_long_eq(SSL_get_verify_result(clientssl), client_verify_result))
495 goto end;
496 if (!TEST_ptr(SSL_get0_peer_rpk(clientssl)))
497 goto end;
498 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(serverssl), TLSEXT_cert_type_rpk))
499 goto end;
500 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(clientssl), TLSEXT_cert_type_rpk))
501 goto end;
502 } else {
503 if (!TEST_ptr(SSL_get0_peer_certificate(clientssl)))
504 goto end;
505 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(serverssl), TLSEXT_cert_type_x509))
506 goto end;
507 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(clientssl), TLSEXT_cert_type_x509))
508 goto end;
509 }
510
511 if (idx == 9) {
512 /* Make PHA happen... */
513 if (!TEST_true(SSL_verify_client_post_handshake(serverssl)))
514 goto end;
515 if (!TEST_true(SSL_do_handshake(serverssl)))
516 goto end;
517 if (!TEST_int_le(SSL_read(clientssl, NULL, 0), 0))
518 goto end;
519 if (!TEST_int_le(SSL_read(serverssl, NULL, 0), 0))
520 goto end;
521 }
522
523 /* Make sure server gets an RPK or certificate as configured */
524 if (client_auth) {
525 if (idx_server_client_rpk && idx_client_client_rpk) {
526 if (!TEST_long_eq(SSL_get_verify_result(serverssl), server_verify_result))
527 goto end;
528 if (!TEST_ptr(SSL_get0_peer_rpk(serverssl)))
529 goto end;
530 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(serverssl), TLSEXT_cert_type_rpk))
531 goto end;
532 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(clientssl), TLSEXT_cert_type_rpk))
533 goto end;
534 } else {
535 if (!TEST_ptr(SSL_get0_peer_certificate(serverssl)))
536 goto end;
537 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(serverssl), TLSEXT_cert_type_x509))
538 goto end;
539 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(clientssl), TLSEXT_cert_type_x509))
540 goto end;
541 }
542 }
543
544 if (resumption) {
545 EVP_PKEY *client_pkey = NULL;
546 EVP_PKEY *server_pkey = NULL;
547
548 if (!TEST_ptr((client_sess = SSL_get1_session(clientssl)))
549 || !TEST_ptr((client_pkey = SSL_SESSION_get0_peer_rpk(client_sess))))
550 goto end;
551 if (client_auth) {
552 if (!TEST_ptr((server_sess = SSL_get1_session(serverssl)))
553 || !TEST_ptr((server_pkey = SSL_SESSION_get0_peer_rpk(server_sess))))
554 goto end;
555 }
556 SSL_shutdown(clientssl);
557 SSL_shutdown(serverssl);
558 SSL_free(clientssl);
559 SSL_free(serverssl);
560 serverssl = clientssl = NULL;
561
562 if (!TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
563 NULL, NULL))
564 || !TEST_true(SSL_set_session(clientssl, client_sess)))
565 goto end;
566
567 /* Set private key (and maybe certificate) */
568 if (!TEST_int_eq(SSL_use_PrivateKey_file(serverssl, privkey_file, SSL_FILETYPE_PEM), 1))
569 goto end;
570 if (!TEST_int_eq(SSL_use_certificate_file(serverssl, cert_file, SSL_FILETYPE_PEM), 1))
571 goto end;
572 if (!TEST_int_eq(SSL_check_private_key(serverssl), 1))
573 goto end;
574 if (!TEST_int_gt(SSL_dane_enable(serverssl, "example.com"), 0))
575 goto end;
576 if (!TEST_int_gt(SSL_dane_enable(clientssl, "example.com"), 0))
577 goto end;
578
579 switch (idx) {
580 default:
581 break;
582 case 11:
583 if (!TEST_true(SSL_add_expected_rpk(clientssl, client_pkey)))
584 goto end;
585 break;
586 case 12:
587 if (!TEST_true(SSL_add_expected_rpk(clientssl, client_pkey)))
588 goto end;
589 SSL_set_options(clientssl, SSL_OP_NO_TICKET);
590 SSL_set_options(serverssl, SSL_OP_NO_TICKET);
591 break;
592 case 13:
593 if (!TEST_true(SSL_add_expected_rpk(clientssl, client_pkey)))
594 goto end;
595 if (!TEST_true(SSL_add_expected_rpk(serverssl, server_pkey)))
596 goto end;
597 /* Use the same key for client auth */
598 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
599 goto end;
600 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
601 goto end;
602 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
603 goto end;
604 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
605 break;
606 case 14:
607 if (!TEST_true(SSL_add_expected_rpk(clientssl, client_pkey)))
608 goto end;
609 if (!TEST_true(SSL_add_expected_rpk(serverssl, server_pkey)))
610 goto end;
611 /* Use the same key for client auth */
612 if (!TEST_int_eq(SSL_use_PrivateKey_file(clientssl, privkey_file, SSL_FILETYPE_PEM), 1))
613 goto end;
614 if (!TEST_int_eq(SSL_use_certificate_file(clientssl, cert_file, SSL_FILETYPE_PEM), 1))
615 goto end;
616 if (!TEST_int_eq(SSL_check_private_key(clientssl), 1))
617 goto end;
618 SSL_set_verify(serverssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, rpk_verify_server_cb);
619 SSL_set_options(serverssl, SSL_OP_NO_TICKET);
620 SSL_set_options(clientssl, SSL_OP_NO_TICKET);
621 break;
622 }
623
624 ret = create_ssl_connection(serverssl, clientssl, SSL_ERROR_NONE);
625 if (!TEST_true(ret))
626 goto end;
627 verify = SSL_get_verify_result(clientssl);
628 if (!TEST_int_eq(client_expected, verify))
629 goto end;
630 if (!TEST_true(SSL_session_reused(clientssl)))
631 goto end;
632
633 if (!TEST_ptr(SSL_get0_peer_rpk(clientssl)))
634 goto end;
635 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(serverssl), TLSEXT_cert_type_rpk))
636 goto end;
637 if (!TEST_int_eq(SSL_get_negotiated_server_cert_type(clientssl), TLSEXT_cert_type_rpk))
638 goto end;
639
640 if (client_auth) {
641 if (!TEST_ptr(SSL_get0_peer_rpk(serverssl)))
642 goto end;
643 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(serverssl), TLSEXT_cert_type_rpk))
644 goto end;
645 if (!TEST_int_eq(SSL_get_negotiated_client_cert_type(clientssl), TLSEXT_cert_type_rpk))
646 goto end;
647 }
648 }
649
650 testresult = 1;
651
652 end:
653 OSSL_PROVIDER_unload(defctxnull);
654 defctxnull = NULL;
655 SSL_SESSION_free(client_sess);
656 SSL_SESSION_free(server_sess);
657 SSL_free(serverssl);
658 SSL_free(clientssl);
659 SSL_CTX_free(sctx);
660 SSL_CTX_free(cctx);
661 X509_free(x509);
662 X509_free(other_x509);
663 X509_free(root_x509);
664
665 if (testresult == 0) {
666 TEST_info("idx_ss_rpk=%d, idx_sc_rpk=%d, idx_cs_rpk=%d, idx_cc_rpk=%d, idx_cert=%d, idx_prot=%d, idx=%d",
667 idx_server_server_rpk, idx_server_client_rpk,
668 idx_client_server_rpk, idx_client_client_rpk,
669 idx_cert, idx_prot, idx);
670 }
671 return testresult;
672}
673
674static int test_rpk_api(void)
675{
676 int ret = 0;
677 SSL_CTX *cctx = NULL, *sctx = NULL;
678 unsigned char cert_type_dups[] = { TLSEXT_cert_type_rpk,
679 TLSEXT_cert_type_x509,
680 TLSEXT_cert_type_x509 };
681 unsigned char cert_type_bad[] = { 0xFF };
682 unsigned char cert_type_extra[] = { TLSEXT_cert_type_rpk,
683 TLSEXT_cert_type_x509,
684 0xFF };
685 unsigned char cert_type_unsup[] = { TLSEXT_cert_type_pgp,
686 TLSEXT_cert_type_1609dot2 };
687 unsigned char cert_type_just_x509[] = { TLSEXT_cert_type_x509 };
688 unsigned char cert_type_just_rpk[] = { TLSEXT_cert_type_rpk };
689
690 if (!TEST_true(create_ssl_ctx_pair(NULL,
691 TLS_server_method(), TLS_client_method(),
692 TLS1_2_VERSION, TLS1_2_VERSION,
693 &sctx, &cctx, NULL, NULL)))
694 goto end;
695
696 if (!TEST_false(SSL_CTX_set1_server_cert_type(sctx, cert_type_dups, sizeof(cert_type_dups))))
697 goto end;
698
699 if (!TEST_false(SSL_CTX_set1_server_cert_type(sctx, cert_type_bad, sizeof(cert_type_bad))))
700 goto end;
701
702 if (!TEST_false(SSL_CTX_set1_server_cert_type(sctx, cert_type_extra, sizeof(cert_type_extra))))
703 goto end;
704
705 if (!TEST_false(SSL_CTX_set1_server_cert_type(sctx, cert_type_unsup, sizeof(cert_type_unsup))))
706 goto end;
707
708 if (!TEST_true(SSL_CTX_set1_server_cert_type(sctx, cert_type_just_x509, sizeof(cert_type_just_x509))))
709 goto end;
710
711 if (!TEST_true(SSL_CTX_set1_server_cert_type(sctx, cert_type_just_rpk, sizeof(cert_type_just_rpk))))
712 goto end;
713
714 ret = 1;
715 end:
716 SSL_CTX_free(sctx);
717 SSL_CTX_free(cctx);
718 return ret;
719}
720OPT_TEST_DECLARE_USAGE("certdir\n")
721
722int setup_tests(void)
723{
724 if (!test_skip_common_options()) {
725 TEST_error("Error parsing test options\n");
726 return 0;
727 }
728
729 if (!TEST_ptr(certsdir = test_get_argument(0)))
730 return 0;
731
732 rootcert = test_mk_file_path(certsdir, "rootcert.pem");
733 if (rootcert == NULL)
734 goto err;
735
736 cert = test_mk_file_path(certsdir, "servercert.pem");
737 if (cert == NULL)
738 goto err;
739
740 privkey = test_mk_file_path(certsdir, "serverkey.pem");
741 if (privkey == NULL)
742 goto err;
743
744 cert2 = test_mk_file_path(certsdir, "server-ecdsa-cert.pem");
745 if (cert2 == NULL)
746 goto err;
747
748 privkey2 = test_mk_file_path(certsdir, "server-ecdsa-key.pem");
749 if (privkey2 == NULL)
750 goto err;
751
752 cert448 = test_mk_file_path(certsdir, "server-ed448-cert.pem");
753 if (cert2 == NULL)
754 goto err;
755
756 privkey448 = test_mk_file_path(certsdir, "server-ed448-key.pem");
757 if (privkey2 == NULL)
758 goto err;
759
760 cert25519 = test_mk_file_path(certsdir, "server-ed25519-cert.pem");
761 if (cert2 == NULL)
762 goto err;
763
764 privkey25519 = test_mk_file_path(certsdir, "server-ed25519-key.pem");
765 if (privkey2 == NULL)
766 goto err;
767
768 libctx = OSSL_LIB_CTX_new();
769 if (libctx == NULL)
770 goto err;
771
772 ADD_TEST(test_rpk_api);
773 ADD_ALL_TESTS(test_rpk, RPK_TESTS * RPK_DIMS);
774 return 1;
775
776 err:
777 return 0;
778}
779
780void cleanup_tests(void)
781{
782 OPENSSL_free(rootcert);
783 OPENSSL_free(cert);
784 OPENSSL_free(privkey);
785 OPENSSL_free(cert2);
786 OPENSSL_free(privkey2);
787 OPENSSL_free(cert448);
788 OPENSSL_free(privkey448);
789 OPENSSL_free(cert25519);
790 OPENSSL_free(privkey25519);
791 OSSL_LIB_CTX_free(libctx);
792 }
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette