diff options
Diffstat (limited to 'src/regress/lib/libssl')
| -rw-r--r-- | src/regress/lib/libssl/tlsext/tlsexttest.c | 101 |
1 files changed, 96 insertions, 5 deletions
diff --git a/src/regress/lib/libssl/tlsext/tlsexttest.c b/src/regress/lib/libssl/tlsext/tlsexttest.c index c7983833dc..e61722542e 100644 --- a/src/regress/lib/libssl/tlsext/tlsexttest.c +++ b/src/regress/lib/libssl/tlsext/tlsexttest.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tlsexttest.c,v 1.86 2024/03/26 02:43:56 beck Exp $ */ | 1 | /* $OpenBSD: tlsexttest.c,v 1.87 2024/03/27 22:27:09 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
| @@ -1109,7 +1109,6 @@ test_tlsext_ecpf_client(void) | |||
| 1109 | goto err; | 1109 | goto err; |
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| 1112 | |||
| 1113 | failure = 0; | 1112 | failure = 0; |
| 1114 | 1113 | ||
| 1115 | err: | 1114 | err: |
| @@ -3648,6 +3647,7 @@ test_tlsext_keyshare_client(void) | |||
| 3648 | const struct tls_extension_funcs *server_funcs; | 3647 | const struct tls_extension_funcs *server_funcs; |
| 3649 | int failure; | 3648 | int failure; |
| 3650 | size_t dlen; | 3649 | size_t dlen; |
| 3650 | size_t idx; | ||
| 3651 | int alert; | 3651 | int alert; |
| 3652 | CBB cbb; | 3652 | CBB cbb; |
| 3653 | CBS cbs; | 3653 | CBS cbs; |
| @@ -3701,18 +3701,109 @@ test_tlsext_keyshare_client(void) | |||
| 3701 | goto done; | 3701 | goto done; |
| 3702 | } | 3702 | } |
| 3703 | 3703 | ||
| 3704 | (ssl)->version = TLS1_3_VERSION; | 3704 | ssl->version = TLS1_3_VERSION; |
| 3705 | CBS_init(&cbs, data, dlen); | 3705 | |
| 3706 | /* Fake up the ssl enough so the key share can process */ | ||
| 3707 | ssl->session = SSL_SESSION_new(); | ||
| 3708 | ssl->s3 = calloc(1, sizeof(*ssl->s3)); | ||
| 3709 | ssl->session->tlsext_supportedgroups = calloc(4, | ||
| 3710 | sizeof(unsigned short)); | ||
| 3711 | if (ssl->session == NULL || ssl->s3 == NULL || | ||
| 3712 | ssl->session->tlsext_supportedgroups == NULL) { | ||
| 3713 | FAIL("malloc"); | ||
| 3714 | goto done; | ||
| 3715 | } | ||
| 3716 | ssl->session->tlsext_supportedgroups[0] = 29; | ||
| 3717 | ssl->session->tlsext_supportedgroups[1] = 23; | ||
| 3718 | ssl->session->tlsext_supportedgroups[2] = 24; | ||
| 3719 | ssl->session->tlsext_supportedgroups[3] = 25; | ||
| 3720 | ssl->session->tlsext_supportedgroups_length = 4; | ||
| 3721 | tls_extension_find(TLSEXT_TYPE_supported_groups, &idx); | ||
| 3722 | ssl->s3->hs.extensions_processed |= (1 << idx); | ||
| 3723 | ssl->s3->hs.extensions_seen |= (1 << idx); | ||
| 3724 | ssl->s3->hs.our_max_tls_version = TLS1_3_VERSION; | ||
| 3706 | 3725 | ||
| 3726 | /* | ||
| 3727 | * We should select the key share for group 29, when group 29 | ||
| 3728 | * is the most preferred group | ||
| 3729 | */ | ||
| 3730 | CBS_init(&cbs, data, dlen); | ||
| 3707 | if (!server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { | 3731 | if (!server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { |
| 3708 | FAIL("failed to parse client keyshare\n"); | 3732 | FAIL("failed to process client keyshare\n"); |
| 3733 | goto done; | ||
| 3734 | } | ||
| 3735 | if (CBS_len(&cbs) != 0) { | ||
| 3736 | FAIL("extension data remaining\n"); | ||
| 3737 | goto done; | ||
| 3738 | } | ||
| 3739 | if (ssl->s3->hs.key_share == NULL) { | ||
| 3740 | FAIL("Did not select a key share"); | ||
| 3709 | goto done; | 3741 | goto done; |
| 3710 | } | 3742 | } |
| 3711 | 3743 | ||
| 3744 | /* | ||
| 3745 | * Pretend the client did not send the supported groups extension. We | ||
| 3746 | * should fail to process. | ||
| 3747 | */ | ||
| 3748 | ssl->s3->hs.extensions_seen = 0; | ||
| 3749 | free(ssl->s3->hs.key_share); | ||
| 3750 | ssl->s3->hs.key_share = NULL; | ||
| 3751 | CBS_init(&cbs, data, dlen); | ||
| 3752 | if (server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { | ||
| 3753 | FAIL("Processed key share when supported groups not provided"); | ||
| 3754 | goto done; | ||
| 3755 | } | ||
| 3756 | ssl->s3->hs.extensions_seen |= (1 << idx); | ||
| 3757 | |||
| 3758 | /* | ||
| 3759 | * Pretend supported groups did not get processed. We should fail to | ||
| 3760 | * process | ||
| 3761 | */ | ||
| 3762 | ssl->s3->hs.extensions_processed = 0; | ||
| 3763 | ssl->s3->hs.key_share = NULL; | ||
| 3764 | CBS_init(&cbs, data, dlen); | ||
| 3765 | if (server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { | ||
| 3766 | FAIL("Processed key share when supported groups unprocesed"); | ||
| 3767 | goto done; | ||
| 3768 | } | ||
| 3769 | ssl->s3->hs.extensions_processed |= (1 << idx); | ||
| 3770 | |||
| 3771 | /* | ||
| 3772 | * Remove group 29 by making it 0xbeef, meaning 29 has not been sent in | ||
| 3773 | * supported groups. This should fail to process. | ||
| 3774 | */ | ||
| 3775 | ssl->session->tlsext_supportedgroups[0] = 0xbeef; | ||
| 3776 | ssl->s3->hs.key_share = NULL; | ||
| 3777 | CBS_init(&cbs, data, dlen); | ||
| 3778 | if (server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { | ||
| 3779 | FAIL("Processed key share with invalid group!"); | ||
| 3780 | goto done; | ||
| 3781 | } | ||
| 3782 | ssl->session->tlsext_supportedgroups[0] = 29; | ||
| 3783 | |||
| 3784 | /* | ||
| 3785 | * Make 29 least preferred, while server supports both 29 and 25. | ||
| 3786 | * Client key share is for 29 but it prefers 25. We should successfully | ||
| 3787 | * process, but should not select this key share. | ||
| 3788 | */ | ||
| 3789 | ssl->session->tlsext_supportedgroups[0] = 25; | ||
| 3790 | ssl->session->tlsext_supportedgroups[3] = 29; | ||
| 3791 | ssl->s3->hs.key_share = NULL; | ||
| 3792 | CBS_init(&cbs, data, dlen); | ||
| 3793 | if (!server_funcs->process(ssl, SSL_TLSEXT_MSG_CH, &cbs, &alert)) { | ||
| 3794 | FAIL("failed to process client keyshare\n"); | ||
| 3795 | goto done; | ||
| 3796 | } | ||
| 3712 | if (CBS_len(&cbs) != 0) { | 3797 | if (CBS_len(&cbs) != 0) { |
| 3713 | FAIL("extension data remaining\n"); | 3798 | FAIL("extension data remaining\n"); |
| 3714 | goto done; | 3799 | goto done; |
| 3715 | } | 3800 | } |
| 3801 | if (ssl->s3->hs.key_share != NULL) { | ||
| 3802 | FAIL("Selected a key share when I should not have!"); | ||
| 3803 | goto done; | ||
| 3804 | } | ||
| 3805 | ssl->session->tlsext_supportedgroups[0] = 29; | ||
| 3806 | ssl->session->tlsext_supportedgroups[3] = 25; | ||
| 3716 | 3807 | ||
| 3717 | failure = 0; | 3808 | failure = 0; |
| 3718 | 3809 | ||
