c7039f5e99
crypto-algorithms "have no resistence to side-channel attacks and should not be used in contexts that need cryptographically secure implementations" (see lib/crypto-algorithms/README.md), so using OpenSSL or LibreSSL is preferable. This does solve https://github.com/matrix-org/olm/issues/3 for some platforms, without breaking other platforms without these libraries (like web). Signed-off-by: Lukas Lihotzki <lukas@lihotzki.de>
227 lines
6.2 KiB
CMake
227 lines
6.2 KiB
CMake
#[=======================================================================[
|
|
|
|
Copyright (c) 2019 John Norrbin <jlnorrbin@johnex.se>
|
|
|
|
Permission to use, copy, modify, and distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
FindLibreSSL
|
|
------------
|
|
|
|
Find the LibreSSL encryption library.
|
|
|
|
Optional Components
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
This module supports two optional components: SSL and TLS. Both
|
|
components have associated imported targets, as described below.
|
|
|
|
Imported Targets
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
This module defines the following imported targets:
|
|
|
|
LibreSSL::Crypto
|
|
The LibreSSL crypto library, if found.
|
|
|
|
LibreSSL::SSL
|
|
The LibreSSL ssl library, if found. Requires and includes LibreSSL::Crypto automatically.
|
|
|
|
LibreSSL::TLS
|
|
The LibreSSL tls library, if found. Requires and includes LibreSSL::SSL and LibreSSL::Crypto automatically.
|
|
|
|
Result Variables
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
This module will set the following variables in your project:
|
|
|
|
LIBRESSL_FOUND
|
|
System has the LibreSSL library. If no components are requested it only requires the crypto library.
|
|
LIBRESSL_INCLUDE_DIR
|
|
The LibreSSL include directory.
|
|
LIBRESSL_CRYPTO_LIBRARY
|
|
The LibreSSL crypto library.
|
|
LIBRESSL_SSL_LIBRARY
|
|
The LibreSSL SSL library.
|
|
LIBRESSL_TLS_LIBRARY
|
|
The LibreSSL TLS library.
|
|
LIBRESSL_LIBRARIES
|
|
All LibreSSL libraries.
|
|
LIBRESSL_VERSION
|
|
This is set to $major.$minor.$revision (e.g. 2.6.8).
|
|
|
|
Hints
|
|
^^^^^
|
|
|
|
Set LIBRESSL_ROOT_DIR to the root directory of an LibreSSL installation.
|
|
|
|
]=======================================================================]
|
|
|
|
INCLUDE(FindPackageHandleStandardArgs)
|
|
|
|
# Set Hints
|
|
set(_LIBRESSL_ROOT_HINTS
|
|
${LIBRESSL_ROOT_DIR}
|
|
ENV LIBRESSL_ROOT_DIR
|
|
)
|
|
|
|
# Set Paths
|
|
if (WIN32)
|
|
file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
|
|
set(_LIBRESSL_ROOT_PATHS
|
|
"${_programfiles}/LibreSSL"
|
|
)
|
|
unset(_programfiles)
|
|
else()
|
|
set(_LIBRESSL_ROOT_PATHS
|
|
"/usr/local/"
|
|
)
|
|
endif()
|
|
|
|
# Combine
|
|
set(_LIBRESSL_ROOT_HINTS_AND_PATHS
|
|
HINTS ${_LIBRESSL_ROOT_HINTS}
|
|
PATHS ${_LIBRESSL_ROOT_PATHS}
|
|
)
|
|
|
|
# Find Include Path
|
|
find_path(LIBRESSL_INCLUDE_DIR
|
|
NAMES
|
|
tls.h
|
|
${_LIBRESSL_ROOT_HINTS_AND_PATHS}
|
|
PATH_SUFFIXES
|
|
include
|
|
)
|
|
|
|
# Find Crypto Library
|
|
find_library(LIBRESSL_CRYPTO_LIBRARY
|
|
NAMES
|
|
libcrypto
|
|
crypto
|
|
NAMES_PER_DIR
|
|
${_LIBRESSL_ROOT_HINTS_AND_PATHS}
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
# Find SSL Library
|
|
find_library(LIBRESSL_SSL_LIBRARY
|
|
NAMES
|
|
libssl
|
|
ssl
|
|
NAMES_PER_DIR
|
|
${_LIBRESSL_ROOT_HINTS_AND_PATHS}
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
# Find TLS Library
|
|
find_library(LIBRESSL_TLS_LIBRARY
|
|
NAMES
|
|
libtls
|
|
tls
|
|
NAMES_PER_DIR
|
|
${_LIBRESSL_ROOT_HINTS_AND_PATHS}
|
|
PATH_SUFFIXES
|
|
lib
|
|
)
|
|
|
|
# Set Libraries
|
|
set(LIBRESSL_LIBRARIES ${LIBRESSL_CRYPTO_LIBRARY} ${LIBRESSL_SSL_LIBRARY} ${LIBRESSL_TLS_LIBRARY})
|
|
|
|
# Mark Variables As Advanced
|
|
mark_as_advanced(LIBRESSL_INCLUDE_DIR LIBRESSL_LIBRARIES LIBRESSL_CRYPTO_LIBRARY LIBRESSL_SSL_LIBRARY LIBRESSL_TLS_LIBRARY)
|
|
|
|
# Find Version File
|
|
if(LIBRESSL_INCLUDE_DIR AND EXISTS "${LIBRESSL_INCLUDE_DIR}/openssl/opensslv.h")
|
|
|
|
# Get Version From File
|
|
file(STRINGS "${LIBRESSL_INCLUDE_DIR}/openssl/opensslv.h" OPENSSLV.H REGEX "#define LIBRESSL_VERSION_TEXT[ ]+\".*\"")
|
|
|
|
# Match Version String
|
|
string(REGEX REPLACE ".*\".*([0-9]+)\\.([0-9]+)\\.([0-9]+)\"" "\\1;\\2;\\3" LIBRESSL_VERSION_LIST "${OPENSSLV.H}")
|
|
|
|
# Split Parts
|
|
list(GET LIBRESSL_VERSION_LIST 0 LIBRESSL_VERSION_MAJOR)
|
|
list(GET LIBRESSL_VERSION_LIST 1 LIBRESSL_VERSION_MINOR)
|
|
list(GET LIBRESSL_VERSION_LIST 2 LIBRESSL_VERSION_REVISION)
|
|
|
|
# Set Version String
|
|
set(LIBRESSL_VERSION "${LIBRESSL_VERSION_MAJOR}.${LIBRESSL_VERSION_MINOR}.${LIBRESSL_VERSION_REVISION}")
|
|
|
|
endif()
|
|
|
|
# Set Find Package Arguments
|
|
find_package_handle_standard_args(LibreSSL
|
|
REQUIRED_VARS
|
|
LIBRESSL_CRYPTO_LIBRARY
|
|
LIBRESSL_INCLUDE_DIR
|
|
VERSION_VAR
|
|
LIBRESSL_VERSION
|
|
HANDLE_COMPONENTS
|
|
FAIL_MESSAGE
|
|
"Could NOT find LibreSSL, try setting the path to LibreSSL using the LIBRESSL_ROOT_DIR environment variable"
|
|
)
|
|
|
|
# LibreSSL Found
|
|
if(LIBRESSL_FOUND)
|
|
|
|
# Set LibreSSL::Crypto
|
|
if(NOT TARGET LibreSSL::Crypto AND EXISTS "${LIBRESSL_CRYPTO_LIBRARY}")
|
|
|
|
# Add Library
|
|
add_library(LibreSSL::Crypto UNKNOWN IMPORTED)
|
|
|
|
# Set Properties
|
|
set_target_properties(
|
|
LibreSSL::Crypto
|
|
PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}"
|
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
|
IMPORTED_LOCATION "${LIBRESSL_CRYPTO_LIBRARY}"
|
|
)
|
|
|
|
endif() # LibreSSL::Crypto
|
|
|
|
# Set LibreSSL::SSL
|
|
if(NOT TARGET LibreSSL::SSL AND EXISTS "${LIBRESSL_SSL_LIBRARY}")
|
|
|
|
# Add Library
|
|
add_library(LibreSSL::SSL UNKNOWN IMPORTED)
|
|
|
|
# Set Properties
|
|
set_target_properties(
|
|
LibreSSL::SSL
|
|
PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}"
|
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
|
IMPORTED_LOCATION "${LIBRESSL_SSL_LIBRARY}"
|
|
INTERFACE_LINK_LIBRARIES LibreSSL::Crypto
|
|
)
|
|
|
|
endif() # LibreSSL::SSL
|
|
|
|
# Set LibreSSL::TLS
|
|
if(NOT TARGET LibreSSL::TLS AND EXISTS "${LIBRESSL_TLS_LIBRARY}")
|
|
add_library(LibreSSL::TLS UNKNOWN IMPORTED)
|
|
set_target_properties(
|
|
LibreSSL::TLS
|
|
PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBRESSL_INCLUDE_DIR}"
|
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
|
IMPORTED_LOCATION "${LIBRESSL_TLS_LIBRARY}"
|
|
INTERFACE_LINK_LIBRARIES LibreSSL::SSL
|
|
)
|
|
|
|
endif() # LibreSSL::TLS
|
|
|
|
endif(LIBRESSL_FOUND)
|