@@ -331,11 +331,12 @@ const char *tls_cert_reg_get_id(tls_cert_reg_t *reg, const rustls_certified_key
331
331
}
332
332
333
333
apr_status_t tls_cert_load_root_store (
334
- apr_pool_t * p , const char * store_file , rustls_root_cert_store * * pstore )
334
+ apr_pool_t * p , const char * store_file , const rustls_root_cert_store * * pstore )
335
335
{
336
336
const char * fpath ;
337
337
tls_data_t pem ;
338
- rustls_root_cert_store * store = NULL ;
338
+ rustls_root_cert_store_builder * store_builder = NULL ;
339
+ const rustls_root_cert_store * store = NULL ;
339
340
rustls_result rr = RUSTLS_RESULT_OK ;
340
341
apr_pool_t * ptemp = NULL ;
341
342
apr_status_t rv ;
@@ -353,11 +354,17 @@ apr_status_t tls_cert_load_root_store(
353
354
rv = tls_util_file_load (ptemp , fpath , 0 , 1024 * 1024 , & pem );
354
355
if (APR_SUCCESS != rv ) goto cleanup ;
355
356
356
- store = rustls_root_cert_store_new ();
357
- rr = rustls_root_cert_store_add_pem (store , pem .data , pem .len , 1 );
357
+ store_builder = rustls_root_cert_store_builder_new ();
358
+ rr = rustls_root_cert_store_builder_add_pem (store_builder , pem .data , pem .len , 1 );
359
+ if (RUSTLS_RESULT_OK != rr ) goto cleanup ;
360
+
361
+ rr = rustls_root_cert_store_builder_build (store_builder , & store );
358
362
if (RUSTLS_RESULT_OK != rr ) goto cleanup ;
359
363
360
364
cleanup :
365
+ if (store_builder != NULL ) {
366
+ rustls_root_cert_store_builder_free (store_builder );
367
+ }
361
368
if (RUSTLS_RESULT_OK != rr ) {
362
369
const char * err_descr ;
363
370
rv = tls_util_rustls_error (p , rr , & err_descr );
@@ -378,7 +385,7 @@ apr_status_t tls_cert_load_root_store(
378
385
379
386
typedef struct {
380
387
const char * id ;
381
- rustls_root_cert_store * store ;
388
+ const rustls_root_cert_store * store ;
382
389
} tls_cert_root_stores_entry_t ;
383
390
384
391
static int stores_entry_cleanup (void * ctx , const void * key , apr_ssize_t klen , const void * val )
@@ -421,14 +428,14 @@ void tls_cert_root_stores_clear(tls_cert_root_stores_t *stores)
421
428
apr_status_t tls_cert_root_stores_get (
422
429
tls_cert_root_stores_t * stores ,
423
430
const char * store_file ,
424
- rustls_root_cert_store * * pstore )
431
+ const rustls_root_cert_store * * pstore )
425
432
{
426
433
apr_status_t rv = APR_SUCCESS ;
427
434
tls_cert_root_stores_entry_t * entry ;
428
435
429
436
entry = apr_hash_get (stores -> file2store , store_file , APR_HASH_KEY_STRING );
430
437
if (!entry ) {
431
- rustls_root_cert_store * store ;
438
+ const rustls_root_cert_store * store ;
432
439
rv = tls_cert_load_root_store (stores -> pool , store_file , & store );
433
440
if (APR_SUCCESS != rv ) goto cleanup ;
434
441
entry = apr_pcalloc (stores -> pool , sizeof (* entry ));
@@ -449,8 +456,8 @@ apr_status_t tls_cert_root_stores_get(
449
456
450
457
typedef struct {
451
458
const char * id ;
452
- const rustls_client_cert_verifier * client_verifier ;
453
- const rustls_client_cert_verifier_optional * client_verifier_opt ;
459
+ rustls_client_cert_verifier * client_verifier ;
460
+ rustls_client_cert_verifier * client_verifier_opt ;
454
461
} tls_cert_verifiers_entry_t ;
455
462
456
463
static int verifiers_entry_cleanup (void * ctx , const void * key , apr_ssize_t klen , const void * val )
@@ -462,7 +469,7 @@ static int verifiers_entry_cleanup(void *ctx, const void *key, apr_ssize_t klen,
462
469
entry -> client_verifier = NULL ;
463
470
}
464
471
if (entry -> client_verifier_opt ) {
465
- rustls_client_cert_verifier_optional_free (entry -> client_verifier_opt );
472
+ rustls_client_cert_verifier_free (entry -> client_verifier_opt );
466
473
entry -> client_verifier_opt = NULL ;
467
474
}
468
475
return 1 ;
@@ -511,23 +518,44 @@ static tls_cert_verifiers_entry_t * verifiers_get_or_make_entry(
511
518
return entry ;
512
519
}
513
520
514
- apr_status_t tls_cert_client_verifiers_get (
515
- tls_cert_verifiers_t * verifiers ,
516
- const char * store_file ,
517
- const rustls_client_cert_verifier * * pverifier )
521
+ static apr_status_t tls_cert_client_verifiers_get_internal (
522
+ tls_cert_verifiers_t * verifiers ,
523
+ const char * store_file ,
524
+ const rustls_client_cert_verifier * * pverifier ,
525
+ bool allow_unauthenticated )
518
526
{
519
527
apr_status_t rv = APR_SUCCESS ;
520
528
tls_cert_verifiers_entry_t * entry ;
529
+ rustls_result rr = RUSTLS_RESULT_OK ;
530
+ struct rustls_web_pki_client_cert_verifier_builder * verifier_builder = NULL ;
521
531
522
532
entry = verifiers_get_or_make_entry (verifiers , store_file );
523
533
if (!entry -> client_verifier ) {
524
- rustls_root_cert_store * store ;
534
+ const rustls_root_cert_store * store ;
525
535
rv = tls_cert_root_stores_get (verifiers -> stores , store_file , & store );
526
536
if (APR_SUCCESS != rv ) goto cleanup ;
527
- entry -> client_verifier = rustls_client_cert_verifier_new (store );
537
+ verifier_builder = rustls_web_pki_client_cert_verifier_builder_new (store );
538
+
539
+ if (allow_unauthenticated ) {
540
+ rr = rustls_web_pki_client_cert_verifier_builder_allow_unauthenticated (verifier_builder );
541
+ if (rr != RUSTLS_RESULT_OK ) {
542
+ goto cleanup ;
543
+ }
544
+ }
545
+
546
+ rr = rustls_web_pki_client_cert_verifier_builder_build (verifier_builder , & entry -> client_verifier );
547
+ if (rr != RUSTLS_RESULT_OK ) {
548
+ goto cleanup ;
549
+ }
528
550
}
529
551
530
552
cleanup :
553
+ if (verifier_builder != NULL ) {
554
+ rustls_web_pki_client_cert_verifier_builder_free (verifier_builder );
555
+ }
556
+ if (rr != RUSTLS_RESULT_OK ) {
557
+ rv = tls_util_rustls_error (verifiers -> pool , rr , NULL );
558
+ }
531
559
if (APR_SUCCESS == rv ) {
532
560
* pverifier = entry -> client_verifier ;
533
561
}
@@ -537,28 +565,19 @@ apr_status_t tls_cert_client_verifiers_get(
537
565
return rv ;
538
566
}
539
567
540
- apr_status_t tls_cert_client_verifiers_get_optional (
568
+
569
+ apr_status_t tls_cert_client_verifiers_get (
541
570
tls_cert_verifiers_t * verifiers ,
542
571
const char * store_file ,
543
- const rustls_client_cert_verifier_optional * * pverifier )
572
+ const rustls_client_cert_verifier * * pverifier )
544
573
{
545
- apr_status_t rv = APR_SUCCESS ;
546
- tls_cert_verifiers_entry_t * entry ;
547
-
548
- entry = verifiers_get_or_make_entry (verifiers , store_file );
549
- if (!entry -> client_verifier_opt ) {
550
- rustls_root_cert_store * store ;
551
- rv = tls_cert_root_stores_get (verifiers -> stores , store_file , & store );
552
- if (APR_SUCCESS != rv ) goto cleanup ;
553
- entry -> client_verifier_opt = rustls_client_cert_verifier_optional_new (store );
554
- }
574
+ return tls_cert_client_verifiers_get_internal (verifiers , store_file , pverifier , false);
575
+ }
555
576
556
- cleanup :
557
- if (APR_SUCCESS == rv ) {
558
- * pverifier = entry -> client_verifier_opt ;
559
- }
560
- else {
561
- * pverifier = NULL ;
562
- }
563
- return rv ;
577
+ apr_status_t tls_cert_client_verifiers_get_optional (
578
+ tls_cert_verifiers_t * verifiers ,
579
+ const char * store_file ,
580
+ const rustls_client_cert_verifier * * pverifier )
581
+ {
582
+ return tls_cert_client_verifiers_get_internal (verifiers , store_file , pverifier , true);
564
583
}
0 commit comments