From e461496ecb89263d1df052b1876ad607b196b58d Mon Sep 17 00:00:00 2001 From: Edward Moulsdale Date: Fri, 1 Mar 2024 07:17:59 +0000 Subject: [PATCH] Add unit tests for CryptoKey --- .gitignore | 1 + modules/mbedtls/SCsub | 3 ++ modules/mbedtls/tests/test_crypto_mbedtls.cpp | 39 ++++++++++++++ modules/mbedtls/tests/test_crypto_mbedtls.h | 31 +++++++++++ tests/data/crypto/in.key | 51 +++++++++++++++++++ tests/data/crypto/in.pub | 14 +++++ 6 files changed, 139 insertions(+) create mode 100644 tests/data/crypto/in.key create mode 100644 tests/data/crypto/in.pub diff --git a/.gitignore b/.gitignore index f43b81f286f..d40f4d39486 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ logs/ # Generated by unit tests tests/data/*.translation +tests/data/crypto/out* ############################ ### General build output ### diff --git a/modules/mbedtls/SCsub b/modules/mbedtls/SCsub index 7c1204d2b77..4b8f65d8ffa 100644 --- a/modules/mbedtls/SCsub +++ b/modules/mbedtls/SCsub @@ -121,6 +121,9 @@ if env["tests"]: env_mbed_tls.Append(CPPDEFINES=["TESTS_ENABLED"]) env_mbed_tls.add_source_files(module_obj, "./tests/*.cpp") + if env["disable_exceptions"]: + env_mbed_tls.Append(CPPDEFINES=["DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS"]) + env.modules_sources += module_obj # Needed to force rebuilding the module files when the thirdparty library is updated. diff --git a/modules/mbedtls/tests/test_crypto_mbedtls.cpp b/modules/mbedtls/tests/test_crypto_mbedtls.cpp index 22d79b79f9d..b96a0721468 100644 --- a/modules/mbedtls/tests/test_crypto_mbedtls.cpp +++ b/modules/mbedtls/tests/test_crypto_mbedtls.cpp @@ -33,6 +33,7 @@ #include "../crypto_mbedtls.h" #include "tests/test_macros.h" +#include "tests/test_utils.h" namespace TestCryptoMbedTLS { @@ -60,4 +61,42 @@ void hmac_context_digest_test(HashingContext::HashType ht, String expected_hex) String hex = String::hex_encode_buffer(digest.ptr(), digest.size()); CHECK(hex == expected_hex); } + +Ref create_crypto_key(const String &p_key_path, bool p_public_only) { + Ref crypto_key = Ref(CryptoKey::create()); + crypto_key->load(p_key_path, p_public_only); + return crypto_key; +} + +String read_file_s(const String &p_file_path) { + Ref file_access = FileAccess::open(p_file_path, FileAccess::READ); + REQUIRE(file_access.is_valid()); + return file_access->get_as_utf8_string(); +} + +bool files_equal(const String &p_in_path, const String &p_out_path) { + const String s_in = read_file_s(p_in_path); + const String s_out = read_file_s(p_out_path); + return s_in == s_out; +} + +void crypto_key_public_only_test(const String &p_key_path, bool p_public_only) { + Ref crypto_key = create_crypto_key(p_key_path, p_public_only); + bool is_equal = crypto_key->is_public_only() == p_public_only; + CHECK(is_equal); +} + +void crypto_key_save_test(const String &p_in_path, const String &p_out_path, bool p_public_only) { + Ref crypto_key = create_crypto_key(p_in_path, p_public_only); + crypto_key->save(p_out_path, p_public_only); + bool is_equal = files_equal(p_in_path, p_out_path); + CHECK(is_equal); +} + +void crypto_key_save_public_only_test(const String &p_in_priv_path, const String &p_in_pub_path, const String &p_out_path) { + Ref crypto_key = create_crypto_key(p_in_priv_path, false); + crypto_key->save(p_out_path, true); + bool is_equal = files_equal(p_in_pub_path, p_out_path); + CHECK(is_equal); +} } // namespace TestCryptoMbedTLS diff --git a/modules/mbedtls/tests/test_crypto_mbedtls.h b/modules/mbedtls/tests/test_crypto_mbedtls.h index 0b24925d6b8..5ec78d18a3c 100644 --- a/modules/mbedtls/tests/test_crypto_mbedtls.h +++ b/modules/mbedtls/tests/test_crypto_mbedtls.h @@ -31,9 +31,11 @@ #ifndef TEST_CRYPTO_MBEDTLS_H #define TEST_CRYPTO_MBEDTLS_H +#include "core/crypto/crypto.h" #include "core/crypto/hashing_context.h" #include "tests/test_macros.h" +#include "tests/test_utils.h" namespace TestCryptoMbedTLS { @@ -56,6 +58,35 @@ TEST_CASE("[HMACContext] HMAC digest") { // SHA-1 hmac_context_digest_test(HashingContext::HashType::HASH_SHA1, "a0ac4cd68a2f4812c355983d94e8d025afe7dddf"); } + +void crypto_key_public_only_test(const String &p_key_path, bool public_only); + +TEST_CASE("[Crypto] CryptoKey is_public_only") { + crypto_key_public_only_test(TestUtils::get_data_path("crypto/in.key"), false); + crypto_key_public_only_test(TestUtils::get_data_path("crypto/in.pub"), true); +} + +void crypto_key_save_test(const String &p_in_path, const String &p_out_path, bool public_only); + +TEST_CASE("[Crypto] CryptoKey save") { + const String in_priv_path = TestUtils::get_data_path("crypto/in.key"); + const String out_priv_path = TestUtils::get_data_path("crypto/out.key"); + crypto_key_save_test(in_priv_path, out_priv_path, false); + + const String in_pub_path = TestUtils::get_data_path("crypto/in.pub"); + const String out_pub_path = TestUtils::get_data_path("crypto/out.pub"); + crypto_key_save_test(in_pub_path, out_pub_path, true); +} + +void crypto_key_save_public_only_test(const String &p_in_priv_path, const String &p_in_pub_path, const String &p_out_path); + +TEST_CASE("[Crypto] CryptoKey save public_only") { + const String in_priv_path = TestUtils::get_data_path("crypto/in.key"); + const String in_pub_path = TestUtils::get_data_path("crypto/in.pub"); + const String out_path = TestUtils::get_data_path("crypto/out_public_only.pub"); + crypto_key_save_public_only_test(in_priv_path, in_pub_path, out_path); +} + } // namespace TestCryptoMbedTLS #endif // TEST_CRYPTO_MBEDTLS_H diff --git a/tests/data/crypto/in.key b/tests/data/crypto/in.key new file mode 100644 index 00000000000..c3380c6fe6f --- /dev/null +++ b/tests/data/crypto/in.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/tests/data/crypto/in.pub b/tests/data/crypto/in.pub new file mode 100644 index 00000000000..369eebd25c8 --- /dev/null +++ b/tests/data/crypto/in.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp+sWMepqN+dXhmZkS45W +0FTLX2f0zRb+kUhXngfiEprgA2UuZP5gGv7/EjOBDniYalGZqYPJum08Px++17P6 +Hyopr05aPhZ6Ocnt+LAU/WRAFspN3xXTZglqnmGMsdNcqBl3loVNmC1H/zX53oBe +P/L/i4lva3DjCRIpHtGjfy3ufSn7fTrlBqKIEHYgQZyzos9dxbk1NJcWVxlNmvFR +tgPW6DQ/P3g0ahLJeq/hO3ykUFfiKdhHkS+s9dC9qjZwSxCCEF1o6zkEO6ynxk0s +xjOpPTJFw7fQ+2KeJWJQfdZeJ6u+DpbwK4g9tMUMNxf3QMk1KhAnwwUrKXfZcviS +3zweD8Tl5zEj45H1ghoUQfuW7Y3wgwHMu8lF8iGA87cf/fhqr0V9piCcwWkfVP/a +thpMoUfyj9Sa3ag0dvDSo9PAet0urXmdKTyhMg4lQL6f9BmMuuB/KwWzCuG/5VY9 +ONxno3OVX6juHTpng5UglbkiDsD3tivl1gCbvIryoGdt+xI0JmAC5eXfg79Nio/B +ayDR9Npm1m460p3GeRaawyYysBo/L5/YZ/S3bYBRoJ7lq6GkTA+22lWAb04IgtS8 +wxO4Ma8EOtKD+AoR3C+WLivcp9LNTxbQOMKGL+8imQGBEz3XTR4lrE02QDQy0DIB +Ky7p7dhlyBdwhTmBX3P2mx0CAwEAAQ== +-----END PUBLIC KEY-----