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