OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_ssl.cpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12
13#include "test_common.hpp"
14
15
16using namespace openvpn;
17
20
21#ifdef USE_OPENSSL
22#include <openssl/opensslv.h>
23#endif
24
25TEST(Ssl, Sslciphersuites)
26{
27 SSLFactoryAPI::Ptr sslfact;
28 const SSLLib::SSLAPI::Config::Ptr sslcfg(new SSLLib::SSLAPI::Config);
29 sslcfg->set_local_cert_enabled(false);
30 sslcfg->set_flags(SSLConst::NO_VERIFY_PEER);
31
32 sslcfg->set_tls_ciphersuite_list("TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256");
33
34 sslfact = sslcfg->new_factory();
35
36
37 sslcfg->set_tls_ciphersuite_list("TLS_CHACHA2000");
38#ifdef USE_MBEDTLS
39 /* Ignored on non TLS 1.3 implementations */
40 sslfact = sslcfg->new_factory();
41#else
42 /* This is invalid and should throw an exception */
43 EXPECT_THROW(sslcfg->new_factory(), SSLFactoryAPI::ssl_context_error);
44#endif
45}
46
47TEST(Ssl, Sslciphers)
48{
50
51 const bool previousLogOutput = testLog->isStdoutEnabled();
52 testLog->setPrintOutput(false);
53 SSLFactoryAPI::Ptr sslfact;
54 const SSLLib::SSLAPI::Config::Ptr sslcfg(new SSLLib::SSLAPI::Config);
55 sslcfg->set_local_cert_enabled(false);
56 sslcfg->set_flags(SSLConst::NO_VERIFY_PEER);
57 sslcfg->set_rng(rng);
58
59 /* This list mixes IANA and OpenSSL ciphers to see if ciphers are translated for mbed TLS and for OpenSSL */
60 sslcfg->set_tls_cipher_list("TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256:AES256-SHA");
61
62 sslfact = sslcfg->new_factory();
63 sslfact->ssl();
64
65 testLog->setPrintOutput(previousLogOutput);
66}
67
68TEST(Ssl, TlsGroups)
69{
71
72 const SSLFactoryAPI::Ptr sslfact;
73
74 const SSLLib::SSLAPI::Config::Ptr sslcfg(new SSLLib::SSLAPI::Config);
75 sslcfg->set_local_cert_enabled(false);
76 sslcfg->set_flags(SSLConst::NO_VERIFY_PEER);
77 sslcfg->set_rng(rng);
78 sslcfg->set_debug_level(1);
79
80 sslcfg->set_tls_groups("secp521r1:secp384r1");
81
82 /* Should not throw an error */
83 auto f = sslcfg->new_factory();
84 f->ssl();
85
86 sslcfg->set_tls_groups("secp521r1:secp384r1:greenhell");
87
89 f = sslcfg->new_factory();
90 f->set_log_level(logging::LOG_LEVEL_INFO);
91 f->ssl();
92#ifdef USE_OPENSSL
93 EXPECT_EQ("OpenSSL -- warning ignoring unknown group 'greenhell' in tls-groups\n", testLog->stopCollecting());
94#else
95 EXPECT_EQ("mbed TLS -- warning ignoring unknown group 'greenhell' in tls-groups\n", testLog->stopCollecting());
96#endif
97}
98
99#ifdef USE_OPENSSL
100TEST(Ssl, TranslateCiphersOpenssl)
101{
102 const bool previousLogOutput = testLog->isStdoutEnabled();
103 testLog->setPrintOutput(false);
104 EXPECT_EQ("ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA",
105 OpenSSLContext::translate_cipher_list("TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256:AES256-SHA"));
106 EXPECT_EQ("DEFAULT", OpenSSLContext::translate_cipher_list("DEFAULT"));
107 EXPECT_EQ("NONSENSE:AES256-SHA", OpenSSLContext::translate_cipher_list("NONSENSE:AES256-SHA"));
108
109 testLog->setPrintOutput(previousLogOutput);
110}
111#endif
112
113#if defined(USE_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x30000000L
114TEST(Ssl, EnablelegacyProvider)
115{
117
118 const SSLLib::SSLAPI::Config::Ptr sslcfg(new SSLLib::SSLAPI::Config);
119 sslcfg->set_local_cert_enabled(false);
120 sslcfg->set_flags(SSLConst::NO_VERIFY_PEER);
121 sslcfg->set_rng(rng);
122
123 auto f_nolegacy = sslcfg->new_factory();
124
125 EXPECT_EQ(SSLLib::CryptoAPI::CipherContext::is_supported(f_nolegacy->libctx(), openvpn::CryptoAlgs::BF_CBC), false);
126
127 const SSLLib::SSLAPI::Config::Ptr sslcfg_legacy(new SSLLib::SSLAPI::Config);
128 sslcfg_legacy->set_local_cert_enabled(false);
129 sslcfg_legacy->set_flags(SSLConst::NO_VERIFY_PEER);
130 sslcfg_legacy->set_rng(rng);
131 sslcfg_legacy->enable_legacy_algorithms(true);
132
133 /* Should not throw an error */
134 auto f_legacy = sslcfg_legacy->new_factory();
135
136 EXPECT_EQ(SSLLib::CryptoAPI::CipherContext::is_supported(f_legacy->libctx(), openvpn::CryptoAlgs::BF_CBC), true);
137}
138#endif
void setPrintOutput(bool doOutput)
static std::string translate_cipher_list(const std::string &cipherlist)
Definition sslctx.hpp:1192
virtual SSLAPI::Ptr ssl()=0
openvpn::LogOutputCollector * testLog
constexpr int LOG_LEVEL_INFO
Definition logger.hpp:20
auto f(const Thing1 t)
TEST(Ssl, Sslciphersuites)
Definition test_ssl.cpp:25