diff options
Diffstat (limited to 'cmake/Modules')
-rw-r--r-- | cmake/Modules/FindBotan.cmake | 168 | ||||
-rw-r--r-- | cmake/Modules/FindBotan2.cmake | 131 | ||||
-rw-r--r-- | cmake/Modules/FindOpenSSLFeatures.cmake | 5 | ||||
-rw-r--r-- | cmake/Modules/findopensslfeatures.c | 51 |
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; } |