summaryrefslogtreecommitdiffstats
path: root/cmake/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/Modules')
-rw-r--r--cmake/Modules/FindBotan.cmake168
-rw-r--r--cmake/Modules/FindBotan2.cmake131
-rw-r--r--cmake/Modules/FindOpenSSLFeatures.cmake5
-rw-r--r--cmake/Modules/findopensslfeatures.c51
4 files changed, 220 insertions, 135 deletions
diff --git a/cmake/Modules/FindBotan.cmake b/cmake/Modules/FindBotan.cmake
new file mode 100644
index 0000000..4362b54
--- /dev/null
+++ b/cmake/Modules/FindBotan.cmake
@@ -0,0 +1,168 @@
+# Copyright (c) 2018-2020 Ribose Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+#.rst:
+# FindBotan
+# -----------
+#
+# Find the botan-2 or botan-3 library.
+#
+# IMPORTED Targets
+# ^^^^^^^^^^^^^^^^
+#
+# This module defines :prop_tgt:`IMPORTED` targets:
+#
+# ``Botan::Botan``
+# The botan-2 or botan-3 library, if found.
+#
+# Result variables
+# ^^^^^^^^^^^^^^^^
+#
+# This module defines the following variables:
+#
+# ::
+#
+# BOTAN_FOUND - true if the headers and library were found
+# BOTAN_INCLUDE_DIRS - where to find headers
+# BOTAN_LIBRARIES - list of libraries to link
+# BOTAN_VERSION - library version that was found, if any
+#
+# Hints
+# ^^^^^
+#
+# These variables may be set to control search behaviour:
+#
+# ``BOTAN_ROOT_DIR``
+# Set to the root directory of the Botan installation.
+#
+
+# use pkg-config to get the directories and then use these values
+# in the find_path() and find_library() calls
+
+find_package(PkgConfig QUIET)
+
+# Search for the version 2 first unless version 3 requested
+if(NOT "${Botan_FIND_VERSION_MAJOR}" EQUAL "3")
+ pkg_check_modules(PC_BOTAN QUIET botan-2)
+ set(_suffixes "botan-2" "botan-3")
+ set(_names "botan-2" "libbotan-2" "botan-3" "libbotan-3")
+else()
+ set(_suffixes "botan-3")
+ set(_names "botan-3" "libbotan-3")
+endif()
+if(NOT PC_BOTAN_FOUND)
+ pkg_check_modules(PC_BOTAN QUIET botan-3)
+endif()
+
+if(DEFINED BOTAN_ROOT_DIR)
+ set(_hints_include "${BOTAN_ROOT_DIR}/include")
+ set(_hints_lib "${BOTAN_ROOT_DIR}/lib")
+endif()
+if(DEFINED ENV{BOTAN_ROOT_DIR})
+ list(APPEND _hints_include "$ENV{BOTAN_ROOT_DIR}/include")
+ list(APPEND _hints_lib "$ENV{BOTAN_ROOT_DIR}/lib")
+endif()
+
+# Append PC_* stuff only if BOTAN_ROOT_DIR is not specified
+if(NOT _hints_include)
+ list(APPEND _hints_include ${PC_BOTAN_INCLUDEDIR} ${PC_BOTAN_INCLUDE_DIRS})
+ list(APPEND _hints_lib ${PC_BOTAN_LIBDIR} ${PC_BOTAN_LIBRARY_DIRS})
+else()
+ set(_no_def_path "NO_DEFAULT_PATH")
+endif()
+
+# find the headers
+find_path(BOTAN_INCLUDE_DIR
+ NAMES botan/version.h
+ HINTS
+ ${_hints_include}
+ PATH_SUFFIXES ${_suffixes}
+ ${_no_def_path}
+)
+
+# find the library
+if(MSVC)
+ find_library(BOTAN_LIBRARY
+ NAMES botan ${_names}
+ HINTS
+ ${_hints_lib}
+ ${_no_def_path}
+ )
+else()
+ find_library(BOTAN_LIBRARY
+ NAMES
+ ${_names}
+ HINTS
+ ${_hints_lib}
+ ${_no_def_path}
+ )
+endif()
+
+# determine the version
+if(BOTAN_INCLUDE_DIR AND EXISTS "${BOTAN_INCLUDE_DIR}/botan/build.h")
+ file(STRINGS "${BOTAN_INCLUDE_DIR}/botan/build.h" botan_version_str
+ REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")
+
+ string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
+ "\\1" _botan_version_major "${botan_version_str}")
+ string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
+ "\\1" _botan_version_minor "${botan_version_str}")
+ string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
+ "\\1" _botan_version_patch "${botan_version_str}")
+ set(BOTAN_VERSION "${_botan_version_major}.${_botan_version_minor}.${_botan_version_patch}"
+ CACHE INTERNAL "The version of Botan which was detected")
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Botan
+ REQUIRED_VARS BOTAN_LIBRARY BOTAN_INCLUDE_DIR
+ VERSION_VAR BOTAN_VERSION
+)
+
+if (BOTAN_FOUND)
+ set(BOTAN_INCLUDE_DIRS ${BOTAN_INCLUDE_DIR} ${PC_BOTAN_INCLUDE_DIRS})
+ set(BOTAN_LIBRARIES ${BOTAN_LIBRARY})
+endif()
+
+if (BOTAN_FOUND AND NOT TARGET Botan::Botan)
+ # create the new library target
+ add_library(Botan::Botan UNKNOWN IMPORTED)
+ # set the required include dirs for the target
+ if (BOTAN_INCLUDE_DIRS)
+ set_target_properties(Botan::Botan
+ PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BOTAN_INCLUDE_DIRS}"
+ )
+ endif()
+ # set the required libraries for the target
+ if (EXISTS "${BOTAN_LIBRARY}")
+ set_target_properties(Botan::Botan
+ PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+ IMPORTED_LOCATION "${BOTAN_LIBRARY}"
+ )
+ endif()
+endif()
+
+mark_as_advanced(BOTAN_INCLUDE_DIR BOTAN_LIBRARY)
diff --git a/cmake/Modules/FindBotan2.cmake b/cmake/Modules/FindBotan2.cmake
deleted file mode 100644
index 2708491..0000000
--- a/cmake/Modules/FindBotan2.cmake
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright (c) 2018-2020 Ribose Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-#.rst:
-# FindBotan2
-# -----------
-#
-# Find the botan-2 library.
-#
-# IMPORTED Targets
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines :prop_tgt:`IMPORTED` targets:
-#
-# ``Botan2::Botan2``
-# The botan-2 library, if found.
-#
-# Result variables
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines the following variables:
-#
-# ::
-#
-# BOTAN2_FOUND - true if the headers and library were found
-# BOTAN2_INCLUDE_DIRS - where to find headers
-# BOTAN2_LIBRARIES - list of libraries to link
-# BOTAN2_VERSION - library version that was found, if any
-
-# use pkg-config to get the directories and then use these values
-# in the find_path() and find_library() calls
-find_package(PkgConfig QUIET)
-pkg_check_modules(PC_BOTAN2 QUIET botan-2)
-
-# find the headers
-find_path(BOTAN2_INCLUDE_DIR
- NAMES botan/version.h
- HINTS
- ${PC_BOTAN2_INCLUDEDIR}
- ${PC_BOTAN2_INCLUDE_DIRS}
- PATH_SUFFIXES botan-2
-)
-
-# find the library
-if(MSVC)
- find_library(BOTAN2_LIBRARY
- NAMES botan
- HINTS
- ${PC_BOTAN2_LIBDIR}
- ${PC_BOTAN2_LIBRARY_DIRS}
- )
-else()
- find_library(BOTAN2_LIBRARY
- NAMES botan-2 libbotan-2
- HINTS
- ${PC_BOTAN2_LIBDIR}
- ${PC_BOTAN2_LIBRARY_DIRS}
- )
-endif()
-
-# determine the version
-if(PC_BOTAN2_VERSION)
- set(BOTAN2_VERSION ${PC_BOTAN2_VERSION})
-elseif(BOTAN2_INCLUDE_DIR AND EXISTS "${BOTAN2_INCLUDE_DIR}/botan/build.h")
- file(STRINGS "${BOTAN2_INCLUDE_DIR}/botan/build.h" botan2_version_str
- REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")
-
- string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
- "\\1" _botan2_version_major "${botan2_version_str}")
- string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
- "\\1" _botan2_version_minor "${botan2_version_str}")
- string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
- "\\1" _botan2_version_patch "${botan2_version_str}")
- set(BOTAN2_VERSION "${_botan2_version_major}.${_botan2_version_minor}.${_botan2_version_patch}"
- CACHE INTERNAL "The version of Botan which was detected")
-endif()
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Botan2
- REQUIRED_VARS BOTAN2_LIBRARY BOTAN2_INCLUDE_DIR
- VERSION_VAR BOTAN2_VERSION
-)
-
-if (BOTAN2_FOUND)
- set(BOTAN2_INCLUDE_DIRS ${BOTAN2_INCLUDE_DIR} ${PC_BOTAN2_INCLUDE_DIRS})
- set(BOTAN2_LIBRARIES ${BOTAN2_LIBRARY})
-endif()
-
-if (BOTAN2_FOUND AND NOT TARGET Botan2::Botan2)
- # create the new library target
- add_library(Botan2::Botan2 UNKNOWN IMPORTED)
- # set the required include dirs for the target
- if (BOTAN2_INCLUDE_DIRS)
- set_target_properties(Botan2::Botan2
- PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${BOTAN2_INCLUDE_DIRS}"
- )
- endif()
- # set the required libraries for the target
- if (EXISTS "${BOTAN2_LIBRARY}")
- set_target_properties(Botan2::Botan2
- PROPERTIES
- IMPORTED_LINK_INTERFACE_LANGUAGES "C"
- IMPORTED_LOCATION "${BOTAN2_LIBRARY}"
- )
- endif()
-endif()
-
-mark_as_advanced(BOTAN2_INCLUDE_DIR BOTAN2_LIBRARY)
-
diff --git a/cmake/Modules/FindOpenSSLFeatures.cmake b/cmake/Modules/FindOpenSSLFeatures.cmake
index 6967764..c3e3e33 100644
--- a/cmake/Modules/FindOpenSSLFeatures.cmake
+++ b/cmake/Modules/FindOpenSSLFeatures.cmake
@@ -74,7 +74,6 @@ file(WRITE "${_fossl_work_dir}/CMakeLists.txt"
"cmake_minimum_required(VERSION 3.18)\n\
project(findopensslfeatures LANGUAGES C)\n\
set(CMAKE_C_STANDARD 99)\n\
-include(FindOpenSSL)\n\
find_package(OpenSSL REQUIRED)\n\
add_executable(findopensslfeatures findopensslfeatures.c)\n\
target_include_directories(findopensslfeatures PRIVATE ${OPENSSL_INCLUDE_DIR})\n\
@@ -139,7 +138,7 @@ else(WIN32 AND NOT MINGW)
set(FOF "build/findopensslfeatures")
endif(WIN32 AND NOT MINGW)
-foreach(feature "hashes" "ciphers" "curves" "publickey")
+foreach(feature "hashes" "ciphers" "curves" "publickey" "providers")
execute_process(
COMMAND "${FOF}" "${feature}"
WORKING_DIRECTORY "${_fossl_work_dir}"
@@ -160,7 +159,7 @@ foreach(feature "hashes" "ciphers" "curves" "publickey")
list(APPEND OPENSSL_SUPPORTED_FEATURES ${OPENSSL_SUPPORTED_${feature_up}})
endforeach()
-message(STATUS "Fetched OpenSSL features: ${hashes_len} hashes, ${ciphers_len} ciphers, ${curves_len} curves, ${publickey_len} publickey.")
+message(STATUS "Fetched OpenSSL features: ${hashes_len} hashes, ${ciphers_len} ciphers, ${curves_len} curves, ${publickey_len} publickey, ${providers_len} providers.")
function(OpenSSLHasFeature FEATURE VARIABLE)
string(TOUPPER ${FEATURE} _feature_up)
diff --git a/cmake/Modules/findopensslfeatures.c b/cmake/Modules/findopensslfeatures.c
index 390f1d2..ed7eb8e 100644
--- a/cmake/Modules/findopensslfeatures.c
+++ b/cmake/Modules/findopensslfeatures.c
@@ -4,6 +4,9 @@
#include <openssl/ec.h>
#include <openssl/objects.h>
#include <openssl/evp.h>
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#include <openssl/provider.h>
+#endif
int
list_curves()
@@ -65,15 +68,57 @@ list_ciphers()
return 0;
}
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+static void
+print_km_name(const char *name, void *param)
+{
+ /* Do not print OIDs for better clarity */
+ if (!name || ((name[0] <= '9') && (name[0] >= '0'))) {
+ return;
+ }
+ printf("%s\n", name);
+}
+
+static void
+print_km(EVP_KEYMGMT *km, void *param)
+{
+ EVP_KEYMGMT_names_do_all(km, print_km_name, NULL);
+}
+#endif
+
int
list_publickey()
{
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
for (size_t i = 0; i < EVP_PKEY_meth_get_count(); i++) {
const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i);
int id = 0;
EVP_PKEY_meth_get0_info(&id, NULL, pmeth);
printf("%s\n", OBJ_nid2ln(id));
}
+#else
+ EVP_KEYMGMT_do_all_provided(NULL, print_km, NULL);
+#endif
+ return 0;
+}
+
+int
+list_providers()
+{
+ printf("default\n");
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ const char *known_names[] = {"legacy", "fips"};
+ for (size_t i = 0; i < sizeof(known_names) / sizeof(known_names[0]); i++) {
+ OSSL_PROVIDER *prov = OSSL_PROVIDER_load(NULL, known_names[i]);
+ if (prov) {
+ printf("%s\n", known_names[i]);
+ OSSL_PROVIDER_unload(prov);
+ }
+ }
+#else
+ /* OpenSSL < 3.0 includes all legacy algorithms in the default provider */
+ printf("legacy\n");
+#endif
return 0;
}
@@ -81,7 +126,8 @@ int
main(int argc, char *argv[])
{
if (argc != 2) {
- fprintf(stderr, "Usage: opensslfeatures [curves|hashes|ciphers|publickey]\n");
+ fprintf(stderr,
+ "Usage: opensslfeatures [curves|hashes|ciphers|publickey|providers]\n");
return 1;
}
if (!strcmp(argv[1], "hashes")) {
@@ -96,6 +142,9 @@ main(int argc, char *argv[])
if (!strcmp(argv[1], "publickey")) {
return list_publickey();
}
+ if (!strcmp(argv[1], "providers")) {
+ return list_providers();
+ }
fprintf(stderr, "Unknown command: %s\n", argv[1]);
return 1;
}