aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorArne Schwabe2021-03-05 15:13:52 +0100
committerGert Doering2021-03-08 10:43:01 +0100
commit06f6cf3ff850f2930bf4a864ae9898407e94ffb9 (patch)
tree932fea6914a60afff81e01deb8c29ce9aca2dd1a /tests
parent3338f2d5a2b7f12f314cc53bf0eaa44ba4f2e58c (diff)
downloadopenvpn-06f6cf3ff850f2930bf4a864ae9898407e94ffb9.zip
openvpn-06f6cf3ff850f2930bf4a864ae9898407e94ffb9.tar.gz
Prefer TLS libraries TLS PRF function, fix OpenVPN in FIPS mode
This moves from using our own copy of the TLS1 PRF function to using TLS library provided function where possible. This includes currently OpenSSL 1.1.0+ and mbed TLS 2.18+. For the libraries where it is not possible to use the library's own function, we still use our own implementation. mbed TLS will continue to use our own old PRF function while for OpenSSL we will use a adapted version from OpenSSL 1.0.2t code. The version allows to be used in a FIPS enabled environment. The old OpenSSL and mbed TLS implementation could have shared some more code but as we will eventually drop support for older TLS libraries, the separation makes it easier it remove that code invdidually. In FIPS mode MD5 is normally forbidden, the TLS1 PRF1 function we use, makes uses of MD5, which in the past has caused OpenVPN to segfault. The new implementation for OpenSSL version of our custom implementation has added the special flags that tell OpenSSL that this specific use of MD5 is allowed in FIPS mode. No FIPS conformitiy testing etc has been done, this is only about allowing OpenVPN on a system where FIPS mode has been enabled system wide (e.g. on RHEL derivates). Patch v4: Handle the unlikely case that PRF generation fails. More formatting fixes. Patch v5: v4 with the formatting fixes actually commited. sigh. Patch v6: More formatting fixes, make OpenSSL fucntion return bool instead of int. Signed-off-by: Arne Schwabe <arne@rfc2549.org> Acked-by: Antonio Quartulli <antonio@openvpn.net> Message-Id: <20210305141352.21847-1-arne@rfc2549.org> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg21612.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
Diffstat (limited to 'tests')
-rw-r--r--tests/unit_tests/openvpn/test_crypto.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/unit_tests/openvpn/test_crypto.c b/tests/unit_tests/openvpn/test_crypto.c
index ea9b99b..af83da6 100644
--- a/tests/unit_tests/openvpn/test_crypto.c
+++ b/tests/unit_tests/openvpn/test_crypto.c
@@ -38,6 +38,7 @@
#include <cmocka.h>
#include "crypto.h"
+#include "ssl_backend.h"
#include "mock_msg.h"
@@ -136,12 +137,43 @@ crypto_translate_cipher_names(void **state)
test_cipher_names("id-aes256-GCM", "AES-256-GCM");
}
+
+static uint8_t good_prf[32] = {0xd9, 0x8c, 0x85, 0x18, 0xc8, 0x5e, 0x94, 0x69,
+ 0x27, 0x91, 0x6a, 0xcf, 0xc2, 0xd5, 0x92, 0xfb,
+ 0xb1, 0x56, 0x7e, 0x4b, 0x4b, 0x14, 0x59, 0xe6,
+ 0xa9, 0x04, 0xac, 0x2d, 0xda, 0xb7, 0x2d, 0x67};
+static void
+crypto_test_tls_prf(void **state)
+{
+ const char *seedstr = "Quis aute iure reprehenderit in voluptate "
+ "velit esse cillum dolore";
+ const unsigned char *seed = (const unsigned char *)seedstr;
+ const size_t seed_len = strlen(seedstr);
+
+
+
+
+ const char* ipsumlorem = "Lorem ipsum dolor sit amet, consectetur "
+ "adipisici elit, sed eiusmod tempor incidunt ut "
+ "labore et dolore magna aliqua.";
+
+ const unsigned char *secret = (const unsigned char *) ipsumlorem;
+ size_t secret_len = strlen((const char *)secret);
+
+
+ uint8_t out[32];
+ ssl_tls1_PRF(seed, seed_len, secret, secret_len, out, sizeof(out));
+
+ assert_memory_equal(good_prf, out, sizeof(out));
+}
+
int
main(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(crypto_pem_encode_decode_loopback),
cmocka_unit_test(crypto_translate_cipher_names),
+ cmocka_unit_test(crypto_test_tls_prf)
};
#if defined(ENABLE_CRYPTO_OPENSSL)