Browse Source

Merge pull request #586 from libtom/feature/cmake-support

Feature/cmake support
Steffen Jaeckel 3 years ago
parent
commit
e10c62ec18
13 changed files with 1105 additions and 10 deletions
  1. 7 0
      .gitignore
  2. 304 0
      CMakeLists.txt
  3. 15 0
      README.md
  4. 70 0
      demos/CMakeLists.txt
  5. 17 0
      doc/crypt.tex
  6. 31 2
      helper.pl
  7. 4 4
      libtomcrypt.pc.in
  8. 2 1
      makefile.shared
  9. 525 0
      sources.cmake
  10. 71 0
      tests/CMakeLists.txt
  11. 18 2
      tests/common.c
  12. 6 1
      tests/file_test.c
  13. 35 0
      tests/sources.cmake

+ 7 - 0
.gitignore

@@ -60,6 +60,10 @@ timing.exe
 .cproject
 .settings/
 
+# KDevelop special files
+*.kdev4
+
+
 # macOS special files
 .DS_Store
 
@@ -102,3 +106,6 @@ coverage*.info
 cov-int/
 .coverity_*
 libtomcrypt.lzma
+
+# cmake build directories
+build*/

+ 304 - 0
CMakeLists.txt

@@ -0,0 +1,304 @@
+# SPDX-License-Identifier: Unlicense
+#
+# LibTomCrypt, modular cryptographic library -- Tom St Denis
+#
+
+cmake_minimum_required(VERSION 3.10)
+
+project(libtomcrypt
+    VERSION 1.18.2
+    DESCRIPTION "A modular cryptographic library."
+    HOMEPAGE_URL "https://www.libtom.net/LibTomCrypt"
+    LANGUAGES C)
+
+# package release version
+# bump if re-releasing the same VERSION + patches
+# set to 1 if releasing a new VERSION
+set(PACKAGE_RELEASE_VERSION 1)
+
+#-----------------------------------------------------------------------------
+# Include CMake modules
+#-----------------------------------------------------------------------------
+include(GNUInstallDirs)
+include(CheckIPOSupported)
+include(CMakePackageConfigHelpers)
+# for potential builds against gnump
+include(FindPkgConfig)
+# default is "No tests"
+option(BUILD_TESTING "" OFF)
+include(CTest)
+include(sources.cmake)
+
+#-----------------------------------------------------------------------------
+# Options
+#-----------------------------------------------------------------------------
+option(WITH_LTM "Build with support for libtommath" TRUE)
+option(WITH_GMP "Build with support for GNU Multi Precision Arithmetic Library" FALSE)
+set(MPI_PROVIDER "LTM" CACHE STRING "Build tests and demos against 'LTM', 'TFM' or 'GMP', default is LTM")
+option(BUILD_SHARED_LIBS "Build shared library and only the shared library if \"ON\", default is static" OFF)
+
+#-----------------------------------------------------------------------------
+# Compose CFLAGS
+#-----------------------------------------------------------------------------
+
+# Some information ported from makefile_include.mk
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+    message(STATUS "Setting build type to 'Release' as none was specified.")
+    set(CMAKE_BUILD_TYPE "Release")
+endif()
+
+# We differentiate between MSVC, WATCOM and GCC-compatible compilers
+if(MSVC)
+    set(LTC_C_FLAGS -W3)
+elseif(WATCOM)
+    set(LTC_C_FLAGS -fo=.obj -oaxt -3r -w3)
+else()
+    set(LTC_C_FLAGS -Wall -Wsign-compare -Wextra -Wshadow
+                    -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align
+                    -Wstrict-prototypes -Wpointer-arith -Wsystem-headers)
+    set(CMAKE_C_FLAGS_DEBUG "-g3")
+    set(CMAKE_C_FLAGS_RELEASE "-O3 -funroll-loops -fomit-frame-pointer")
+    set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g3 -O2")
+    set(CMAKE_C_FLAGS_MINSIZEREL "-Os")
+endif()
+
+# What compiler do we have and what are their...uhm... peculiarities
+if(CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang")
+    list(APPEND LTC_C_FLAGS -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
+    # Clang requires at least '-O1' for dead code eliminiation
+    set(CMAKE_C_FLAGS_DEBUG "-O1 ${CMAKE_C_FLAGS_DEBUG}")
+endif()
+if(CMAKE_C_COMPILER MATCHES "mingw")
+    list(APPEND LTC_C_FLAGS -Wno-shadow -Wno-expansion-to-defined -Wno-declaration-after-statement -Wno-bad-function-cast)
+endif()
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+    list(APPEND LTC_C_FLAGS -Wno-nullability-completeness)
+endif()
+if(CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
+    list(APPEND LTC_C_FLAGS -no-undefined)
+endif()
+
+# If the user set the environment variables at generate-time, append them
+# in order to allow overriding our defaults.
+# ${LTC_CFLAGS} means the user passed it via sth like:
+# $ cmake -DLTC_CFLAGS="foo"
+list(APPEND LTC_C_FLAGS ${LTC_CFLAGS})
+list(APPEND LTC_LD_FLAGS ${LTC_LDFLAGS})
+
+#-----------------------------------------------------------------------------
+# Library targets
+#-----------------------------------------------------------------------------
+add_library(${PROJECT_NAME}
+    ${SOURCES}
+    ${PUBLIC_HEADERS}
+    ${PRIVATE_HEADERS}
+)
+
+target_include_directories(${PROJECT_NAME} PUBLIC
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/headers>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
+)
+
+target_compile_options(${PROJECT_NAME} BEFORE PRIVATE
+    ${LTM_C_FLAGS}
+)
+target_link_options(${PROJECT_NAME} BEFORE PRIVATE
+    ${LTM_LD_FLAGS}
+)
+
+set_target_properties(${PROJECT_NAME} PROPERTIES
+    OUTPUT_NAME tomcrypt
+    VERSION ${PROJECT_VERSION}
+    SOVERSION ${PROJECT_VERSION_MAJOR}
+    PUBLIC_HEADER "${PUBLIC_HEADERS}"
+)
+
+option(COMPILE_LTO "Build with LTO enabled")
+if(COMPILE_LTO)
+    check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO)
+    if(COMPILER_SUPPORTS_LTO)
+        set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
+    else()
+        message(SEND_ERROR "This compiler does not support LTO. Reconfigure ${PROJECT_NAME} with -DCOMPILE_LTO=OFF.")
+    endif()
+endif()
+
+#-----------------------------------------------------------------------------
+# MPI provider
+#-----------------------------------------------------------------------------
+# libtommath
+if(WITH_LTM)
+    find_package(libtommath 1.2.0 REQUIRED)
+
+    target_compile_definitions(${PROJECT_NAME} PUBLIC LTM_DESC)
+    if(MPI_PROVIDER MATCHES "LTM")
+        target_compile_definitions(${PROJECT_NAME} PUBLIC USE_LTM)
+    endif()
+    target_link_libraries(${PROJECT_NAME} PUBLIC libtommath)
+endif()
+# GNU MP
+if(WITH_GMP)
+    pkg_check_modules(GMP REQUIRED gmp>=6.1.2)
+
+    target_compile_definitions(${PROJECT_NAME} PUBLIC GMP_DESC)
+    if(MPI_PROVIDER MATCHES "GMP")
+        target_compile_definitions(${PROJECT_NAME} PUBLIC USE_GMP)
+    endif()
+    target_link_libraries(${PROJECT_NAME} PUBLIC ${GMP_LIBRARIES})
+endif()
+
+
+#-----------------------------------------------------------------------------
+# demos&test targets
+#-----------------------------------------------------------------------------
+
+add_subdirectory(demos)
+if(BUILD_TESTING)
+    enable_testing()
+    add_subdirectory(tests)
+endif()
+
+#---------------------------------------------------------------------------------------
+# Install/export targets and files
+#---------------------------------------------------------------------------------------
+set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
+set(PROJECT_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
+set(PROJECT_CONFIG_FILE "${PROJECT_NAME}-config.cmake")
+set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
+
+# install targets
+install(TARGETS ${PROJECT_NAME}
+        EXPORT ${TARGETS_EXPORT_NAME}
+        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
+)
+
+# Install libtomcrypt.pc for pkg-config if we build a shared library
+if(BUILD_SHARED_LIBS)
+    # Let the user override the default directory of the pkg-config file (usually this shouldn't be required to be changed)
+    set(CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE PATH "Folder where to install .pc files")
+
+    configure_file(
+        ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
+        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
+        @ONLY
+    )
+
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
+        DESTINATION ${CMAKE_INSTALL_PKGCONFIGDIR}
+    )
+endif()
+
+# generate package version file
+write_basic_package_version_file(
+    ${PROJECT_VERSION_FILE}
+    VERSION ${PROJECT_VERSION}
+    COMPATIBILITY SameMajorVersion
+)
+
+# install version file
+install(FILES ${PROJECT_VERSION_FILE}
+        DESTINATION ${CONFIG_INSTALL_DIR}
+)
+
+# build directory package config
+export(EXPORT ${TARGETS_EXPORT_NAME}
+       FILE ${PROJECT_CONFIG_FILE}
+)
+
+# installed package config
+install(EXPORT ${TARGETS_EXPORT_NAME}
+        DESTINATION ${CONFIG_INSTALL_DIR}
+        FILE ${PROJECT_CONFIG_FILE}
+)
+
+# add to CMake registry
+export(PACKAGE ${PROJECT_NAME})
+
+#---------------------------------------------------------------------------------------
+# Create release packages
+#---------------------------------------------------------------------------------------
+
+# determine distribution and architecture
+find_program(LSB_RELEASE lsb_release)
+find_program(SYSCTL sysctl)
+find_program(UNAME uname)
+
+if(UNAME)
+    execute_process(COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
+elseif(SYSCTL)
+    execute_process(COMMAND sysctl -b hw.machine_arch OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
+else()
+    string(TOLOWER ${CMAKE_SYSTEM_NAME} MACHINE_ARCH)
+endif()
+
+if(LSB_RELEASE)
+    execute_process(COMMAND lsb_release -si OUTPUT_VARIABLE LINUX_DISTRO OUTPUT_STRIP_TRAILING_WHITESPACE)
+    execute_process(COMMAND lsb_release -sc OUTPUT_VARIABLE LINUX_DISTRO_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE)
+    execute_process(COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    string(TOLOWER ${LINUX_DISTRO} LINUX_DISTRO)
+    if(LINUX_DISTRO_CODENAME STREQUAL "n/a")
+        set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_VERSION}/)
+    else()
+        set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_CODENAME}/)
+    endif()
+else()
+    set(DISTRO_PACK_PATH ${CMAKE_SYSTEM_NAME}/)
+endif()
+
+# default CPack generators
+set(CPACK_GENERATOR TGZ STGZ)
+
+# extra CPack generators
+if(LINUX_DISTRO STREQUAL "debian" OR LINUX_DISTRO STREQUAL "ubuntu" OR LINUX_DISTRO STREQUAL "linuxmint")
+    list(APPEND CPACK_GENERATOR DEB)
+elseif(LINUX_DISTRO STREQUAL "fedora" OR LINUX_DISTRO STREQUAL "opensuse" OR LINUX_DISTRO STREQUAL "centos")
+    list(APPEND CPACK_GENERATOR RPM)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+    list(APPEND CPACK_GENERATOR FREEBSD)
+endif()
+
+# general CPack config
+set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/${DISTRO_PACK_PATH})
+message(STATUS "CPack: packages will be generated under ${CPACK_PACKAGE_DIRECTORY}")
+if(BUILD_SHARED_LIBS)
+    set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${PROJECT_VERSION_MAJOR}")
+else()
+    set(CPACK_PACKAGE_NAME "${PROJECT_NAME}-devel")
+endif()
+set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomCrypt")
+set(CPACK_PACKAGE_VENDOR "libtom projects")
+set(CPACK_PACKAGE_CONTACT "[email protected]")
+set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
+set(PACKAGE_NAME_TRAILER ${CPACK_PACKAGE_VERSION}-${PACKAGE_RELEASE_VERSION}_${MACHINE_ARCH})
+set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${PACKAGE_NAME_TRAILER})
+set(CPACK_STRIP_FILES ON)
+
+# deb specific CPack config
+set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
+set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
+set(CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
+if(BUILD_SHARED_LIBS)
+    set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
+else()
+    set(CPACK_DEBIAN_PACKAGE_NAME "${PROJECT_NAME}-dev")
+    set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
+endif()
+
+# rpm specific CPack config
+set(CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
+set(CPACK_RPM_PACKAGE_ARCHITECTURE ${MACHINE_ARCH})
+set(CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-${PROJECT_VERSION}")
+set(CPACK_RPM_PACKAGE_LICENSE "The Unlicense")
+
+# FreeBSD specific CPack config
+set(CPACK_FREEBSD_PACKAGE_MAINTAINER "[email protected]")
+set(CPACK_FREEBSD_PACKAGE_ORIGIN "security/libtomcrypt")
+set(CPACK_FREEBSD_PACKAGE_CATEGORIES "security")
+
+include(CPack)

+ 15 - 0
README.md

@@ -180,6 +180,21 @@ You want to install the shared library to a special path and use it from this pa
 
 Have a look at the developer documentation, [[GNU]] or [[FreeBSD]] to get a detailed explanation of all the variables.
 
+## CMake support
+
+The project provides support for the CMake build system.
+
+```
+git clone https://github.com/libtom/libtomcrypt.git
+mkdir -p libtomcrypt/build
+cd libtomcrypt/build
+cmake ..
+make -j$(nproc)
+```
+
+More details around building with CMake can be found in the developer documentation.
+
+
 [GNU]: https://www.gnu.org/prep/standards/html_node/DESTDIR.html
 
 [FreeBSD]: https://www.freebsd.org/doc/en/books/porters-handbook/porting-prefix.html

+ 70 - 0
demos/CMakeLists.txt

@@ -0,0 +1,70 @@
+#-----------------------------------------------------------------------------
+# Options
+#-----------------------------------------------------------------------------
+option(BUILD_USEFUL_DEMOS "Build useful demos (hashsum)" FALSE)
+option(BUILD_USABLE_DEMOS "Build usable demos (ltcrypt sizes constants)" FALSE)
+
+#-----------------------------------------------------------------------------
+# Useful demos
+#-----------------------------------------------------------------------------
+
+if(BUILD_USEFUL_DEMOS)
+
+    list(APPEND ALL_DEMOS_TARGETS hashsum)
+
+    # hashsum
+    add_executable(hashsum
+        ${CMAKE_CURRENT_SOURCE_DIR}/hashsum.c
+    )
+
+    target_link_libraries(hashsum PRIVATE
+        ${PROJECT_NAME}
+    )
+
+endif()
+
+#-----------------------------------------------------------------------------
+# Usable demos
+#-----------------------------------------------------------------------------
+
+if(BUILD_USABLE_DEMOS)
+
+    list(APPEND ALL_DEMOS_TARGETS ltcrypt sizes constants)
+
+    # ltcrypt
+    add_executable(ltcrypt
+        ${CMAKE_CURRENT_SOURCE_DIR}/ltcrypt.c
+    )
+
+    target_link_libraries(ltcrypt PRIVATE
+        ${PROJECT_NAME}
+    )
+
+    # sizes
+    add_executable(sizes
+        ${CMAKE_CURRENT_SOURCE_DIR}/sizes.c
+    )
+
+    target_link_libraries(sizes PRIVATE
+        ${PROJECT_NAME}
+    )
+
+    # constants
+    add_executable(constants
+        ${CMAKE_CURRENT_SOURCE_DIR}/constants.c
+    )
+
+    target_link_libraries(constants PRIVATE
+        ${PROJECT_NAME}
+    )
+
+endif()
+
+#-----------------------------------------------------------------------------
+# Install targets
+#-----------------------------------------------------------------------------
+install(TARGETS ${ALL_DEMOS_TARGETS}
+        COMPONENT "runtime"
+        EXPORT ${TARGETS_EXPORT_NAME}
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)

+ 17 - 0
doc/crypt.tex

@@ -8110,6 +8110,23 @@ make -f makefile.shared install CFLAGS="-DTFM_DESC" EXTRALIBS=-ltfm
 This will build and install the library and link the shared object against the TomsFastMath library (which must be installed as a shared object as well).  The
 shared build process requires libtool to be installed.
 
+\mysection{Building with CMake}
+
+LibTomCrypt can also be built via CMake.
+
+\begin{verbatim}
+git clone https://github.com/libtom/libtomcrypt.git
+mkdir -p libtomcrypt/build
+cd libtomcrypt/build
+cmake ..
+make -j$(nproc)
+\end{verbatim}
+
+Per default a static library in \textbf{Release} configuration is built, without tests and building against the LibTomMath library.
+
+A shared library build can be done by setting \textbf{-DBUILD\_SHARED\_LIBS=On} when invoking the \textbf{cmake} command.
+Tests can be enabled by setting \textbf{-DBUILD\_TESTING=On} when invoking the \textbf{cmake} command.
+
 \mysection{Header Configuration}
 The file \textit{tomcrypt\_cfg.h} is what lets you control various high level macros which control the behaviour of the library.  Build options are also
 stored in \textit{tomcrypt\_custom.h} which allow the enabling and disabling of various algorithms.

+ 31 - 2
helper.pl

@@ -279,6 +279,31 @@ sub version_from_tomcrypt_h {
   }
 }
 
+sub make_sources_cmake {
+  my ($list, $pub_headers) = @_;
+  my $output = "set(SOURCES\n";
+
+  foreach my $obj (sort @$list) {
+    $output .= $obj . "\n";
+  }
+  $output .= ")\n\n";
+
+  if ($pub_headers eq "") {
+    return $output;
+  }
+
+  $output .= "set(PUBLIC_HEADERS\n";
+
+  foreach my $obj (sort @$pub_headers) {
+    $output .= $obj . "\n";
+  }
+
+  $output .= ")\n\nset(PRIVATE_HEADERS src/headers/tomcrypt_private.h)\n";
+  $output .= "set_property(GLOBAL PROPERTY PUBLIC_HEADERS \$\{PUBLIC_HEADERS\}\)\n\n";
+
+  return $output;
+}
+
 sub process_makefiles {
   my $write = shift;
   my $changed_count = 0;
@@ -296,6 +321,7 @@ sub process_makefiles {
   my $var_h = prepare_variable("HEADERS_PUB", (sort @h));
   (my $var_obj = $var_o) =~ s/\.o\b/.obj/sg;
 
+  my @t_srcs = sort (map { my $x = $_; $x =~ s/^tests\///; $x } @t);
   my $var_to = prepare_variable("TOBJECTS", sort map { my $x = $_; $x =~ s/\.c$/.o/; $x } @t);
   (my $var_tobj = $var_to) =~ s/\.o\b/.obj/sg;
 
@@ -315,10 +341,13 @@ sub process_makefiles {
   }
 
   # update OBJECTS + HEADERS in makefile*
-  for my $m (qw/ makefile makefile.shared makefile.unix makefile.mingw makefile.msvc makefile_include.mk doc\/Doxyfile /) {
+  for my $m (qw/ makefile makefile.shared makefile.unix makefile.mingw makefile.msvc makefile_include.mk doc\/Doxyfile sources.cmake tests\/sources.cmake /) {
     my $old = read_file($m);
     my $new = $m eq 'makefile.msvc' ? patch_file($old, $var_obj, $var_h, $var_tobj, @ver_version)
-                                    : patch_file($old, $var_o, $var_h, $var_to, @ver_version);
+            : $m eq 'sources.cmake' ? make_sources_cmake(\@all, \@h)
+            : $m eq 'tests/sources.cmake' ? make_sources_cmake(\@t_srcs, "")
+            :                         patch_file($old, $var_o, $var_h, $var_to, @ver_version);
+
     if ($old ne $new) {
       write_file($m, $new) if $write;
       warn "changed: $m\n";

+ 4 - 4
libtomcrypt.pc.in

@@ -1,10 +1,10 @@
-prefix=@to-be-replaced@
+prefix=@CMAKE_INSTALL_PREFIX@
 exec_prefix=${prefix}
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include
+libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@PROJECT_NAME@
 
 Name: LibTomCrypt
 Description: public domain open source cryptographic toolkit
-Version: @to-be-replaced@
+Version: @PROJECT_VERSION@
 Libs: -L${libdir} -ltomcrypt
 Cflags: -I${includedir}

+ 2 - 1
makefile.shared

@@ -79,7 +79,8 @@ endef
 $(foreach demo, $(strip $(DEMOS)), $(eval $(call DEMO_template,$(demo))))
 
 install: $(call print-help,install,Installs the library + headers + pkg-config file) .common_install
-	sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION_PC),' libtomcrypt.pc.in > libtomcrypt.pc
+	sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION_PC),' -e 's,@CMAKE_INSTALL_LIBDIR@,lib,' \
+		-e 's,@CMAKE_INSTALL_INCLUDEDIR@/@PROJECT_NAME@,include/tomcrypt,' libtomcrypt.pc.in > libtomcrypt.pc
 	install -p -d $(DESTDIR)$(LIBPATH)/pkgconfig
 	install -p -m 644 libtomcrypt.pc $(DESTDIR)$(LIBPATH)/pkgconfig/
 

+ 525 - 0
sources.cmake

@@ -0,0 +1,525 @@
+set(SOURCES
+src/ciphers/aes/aes.c
+src/ciphers/aes/aes_tab.c
+src/ciphers/anubis.c
+src/ciphers/blowfish.c
+src/ciphers/camellia.c
+src/ciphers/cast5.c
+src/ciphers/des.c
+src/ciphers/idea.c
+src/ciphers/kasumi.c
+src/ciphers/khazad.c
+src/ciphers/kseed.c
+src/ciphers/multi2.c
+src/ciphers/noekeon.c
+src/ciphers/rc2.c
+src/ciphers/rc5.c
+src/ciphers/rc6.c
+src/ciphers/safer/safer.c
+src/ciphers/safer/safer_tab.c
+src/ciphers/safer/saferp.c
+src/ciphers/serpent.c
+src/ciphers/skipjack.c
+src/ciphers/tea.c
+src/ciphers/twofish/twofish.c
+src/ciphers/twofish/twofish_tab.c
+src/ciphers/xtea.c
+src/encauth/ccm/ccm_add_aad.c
+src/encauth/ccm/ccm_add_nonce.c
+src/encauth/ccm/ccm_done.c
+src/encauth/ccm/ccm_init.c
+src/encauth/ccm/ccm_memory.c
+src/encauth/ccm/ccm_process.c
+src/encauth/ccm/ccm_reset.c
+src/encauth/ccm/ccm_test.c
+src/encauth/chachapoly/chacha20poly1305_add_aad.c
+src/encauth/chachapoly/chacha20poly1305_decrypt.c
+src/encauth/chachapoly/chacha20poly1305_done.c
+src/encauth/chachapoly/chacha20poly1305_encrypt.c
+src/encauth/chachapoly/chacha20poly1305_init.c
+src/encauth/chachapoly/chacha20poly1305_memory.c
+src/encauth/chachapoly/chacha20poly1305_setiv.c
+src/encauth/chachapoly/chacha20poly1305_setiv_rfc7905.c
+src/encauth/chachapoly/chacha20poly1305_test.c
+src/encauth/eax/eax_addheader.c
+src/encauth/eax/eax_decrypt.c
+src/encauth/eax/eax_decrypt_verify_memory.c
+src/encauth/eax/eax_done.c
+src/encauth/eax/eax_encrypt.c
+src/encauth/eax/eax_encrypt_authenticate_memory.c
+src/encauth/eax/eax_init.c
+src/encauth/eax/eax_test.c
+src/encauth/gcm/gcm_add_aad.c
+src/encauth/gcm/gcm_add_iv.c
+src/encauth/gcm/gcm_done.c
+src/encauth/gcm/gcm_gf_mult.c
+src/encauth/gcm/gcm_init.c
+src/encauth/gcm/gcm_memory.c
+src/encauth/gcm/gcm_mult_h.c
+src/encauth/gcm/gcm_process.c
+src/encauth/gcm/gcm_reset.c
+src/encauth/gcm/gcm_test.c
+src/encauth/ocb/ocb_decrypt.c
+src/encauth/ocb/ocb_decrypt_verify_memory.c
+src/encauth/ocb/ocb_done_decrypt.c
+src/encauth/ocb/ocb_done_encrypt.c
+src/encauth/ocb/ocb_encrypt.c
+src/encauth/ocb/ocb_encrypt_authenticate_memory.c
+src/encauth/ocb/ocb_init.c
+src/encauth/ocb/ocb_ntz.c
+src/encauth/ocb/ocb_shift_xor.c
+src/encauth/ocb/ocb_test.c
+src/encauth/ocb/s_ocb_done.c
+src/encauth/ocb3/ocb3_add_aad.c
+src/encauth/ocb3/ocb3_decrypt.c
+src/encauth/ocb3/ocb3_decrypt_last.c
+src/encauth/ocb3/ocb3_decrypt_verify_memory.c
+src/encauth/ocb3/ocb3_done.c
+src/encauth/ocb3/ocb3_encrypt.c
+src/encauth/ocb3/ocb3_encrypt_authenticate_memory.c
+src/encauth/ocb3/ocb3_encrypt_last.c
+src/encauth/ocb3/ocb3_init.c
+src/encauth/ocb3/ocb3_int_ntz.c
+src/encauth/ocb3/ocb3_int_xor_blocks.c
+src/encauth/ocb3/ocb3_test.c
+src/hashes/blake2b.c
+src/hashes/blake2s.c
+src/hashes/chc/chc.c
+src/hashes/helper/hash_file.c
+src/hashes/helper/hash_filehandle.c
+src/hashes/helper/hash_memory.c
+src/hashes/helper/hash_memory_multi.c
+src/hashes/md2.c
+src/hashes/md4.c
+src/hashes/md5.c
+src/hashes/rmd128.c
+src/hashes/rmd160.c
+src/hashes/rmd256.c
+src/hashes/rmd320.c
+src/hashes/sha1.c
+src/hashes/sha2/sha224.c
+src/hashes/sha2/sha256.c
+src/hashes/sha2/sha384.c
+src/hashes/sha2/sha512.c
+src/hashes/sha2/sha512_224.c
+src/hashes/sha2/sha512_256.c
+src/hashes/sha3.c
+src/hashes/sha3_test.c
+src/hashes/tiger.c
+src/hashes/whirl/whirl.c
+src/hashes/whirl/whirltab.c
+src/headers/tomcrypt.h
+src/headers/tomcrypt_argchk.h
+src/headers/tomcrypt_cfg.h
+src/headers/tomcrypt_cipher.h
+src/headers/tomcrypt_custom.h
+src/headers/tomcrypt_hash.h
+src/headers/tomcrypt_mac.h
+src/headers/tomcrypt_macros.h
+src/headers/tomcrypt_math.h
+src/headers/tomcrypt_misc.h
+src/headers/tomcrypt_pk.h
+src/headers/tomcrypt_pkcs.h
+src/headers/tomcrypt_private.h
+src/headers/tomcrypt_prng.h
+src/mac/blake2/blake2bmac.c
+src/mac/blake2/blake2bmac_file.c
+src/mac/blake2/blake2bmac_memory.c
+src/mac/blake2/blake2bmac_memory_multi.c
+src/mac/blake2/blake2bmac_test.c
+src/mac/blake2/blake2smac.c
+src/mac/blake2/blake2smac_file.c
+src/mac/blake2/blake2smac_memory.c
+src/mac/blake2/blake2smac_memory_multi.c
+src/mac/blake2/blake2smac_test.c
+src/mac/f9/f9_done.c
+src/mac/f9/f9_file.c
+src/mac/f9/f9_init.c
+src/mac/f9/f9_memory.c
+src/mac/f9/f9_memory_multi.c
+src/mac/f9/f9_process.c
+src/mac/f9/f9_test.c
+src/mac/hmac/hmac_done.c
+src/mac/hmac/hmac_file.c
+src/mac/hmac/hmac_init.c
+src/mac/hmac/hmac_memory.c
+src/mac/hmac/hmac_memory_multi.c
+src/mac/hmac/hmac_process.c
+src/mac/hmac/hmac_test.c
+src/mac/omac/omac_done.c
+src/mac/omac/omac_file.c
+src/mac/omac/omac_init.c
+src/mac/omac/omac_memory.c
+src/mac/omac/omac_memory_multi.c
+src/mac/omac/omac_process.c
+src/mac/omac/omac_test.c
+src/mac/pelican/pelican.c
+src/mac/pelican/pelican_memory.c
+src/mac/pelican/pelican_test.c
+src/mac/pmac/pmac_done.c
+src/mac/pmac/pmac_file.c
+src/mac/pmac/pmac_init.c
+src/mac/pmac/pmac_memory.c
+src/mac/pmac/pmac_memory_multi.c
+src/mac/pmac/pmac_ntz.c
+src/mac/pmac/pmac_process.c
+src/mac/pmac/pmac_shift_xor.c
+src/mac/pmac/pmac_test.c
+src/mac/poly1305/poly1305.c
+src/mac/poly1305/poly1305_file.c
+src/mac/poly1305/poly1305_memory.c
+src/mac/poly1305/poly1305_memory_multi.c
+src/mac/poly1305/poly1305_test.c
+src/mac/xcbc/xcbc_done.c
+src/mac/xcbc/xcbc_file.c
+src/mac/xcbc/xcbc_init.c
+src/mac/xcbc/xcbc_memory.c
+src/mac/xcbc/xcbc_memory_multi.c
+src/mac/xcbc/xcbc_process.c
+src/mac/xcbc/xcbc_test.c
+src/math/fp/ltc_ecc_fp_mulmod.c
+src/math/gmp_desc.c
+src/math/ltm_desc.c
+src/math/multi.c
+src/math/radix_to_bin.c
+src/math/rand_bn.c
+src/math/rand_prime.c
+src/math/tfm_desc.c
+src/misc/adler32.c
+src/misc/base16/base16_decode.c
+src/misc/base16/base16_encode.c
+src/misc/base32/base32_decode.c
+src/misc/base32/base32_encode.c
+src/misc/base64/base64_decode.c
+src/misc/base64/base64_encode.c
+src/misc/bcrypt/bcrypt.c
+src/misc/burn_stack.c
+src/misc/compare_testvector.c
+src/misc/copy_or_zeromem.c
+src/misc/crc32.c
+src/misc/crypt/crypt.c
+src/misc/crypt/crypt_argchk.c
+src/misc/crypt/crypt_cipher_descriptor.c
+src/misc/crypt/crypt_cipher_is_valid.c
+src/misc/crypt/crypt_constants.c
+src/misc/crypt/crypt_find_cipher.c
+src/misc/crypt/crypt_find_cipher_any.c
+src/misc/crypt/crypt_find_cipher_id.c
+src/misc/crypt/crypt_find_hash.c
+src/misc/crypt/crypt_find_hash_any.c
+src/misc/crypt/crypt_find_hash_id.c
+src/misc/crypt/crypt_find_hash_oid.c
+src/misc/crypt/crypt_find_prng.c
+src/misc/crypt/crypt_fsa.c
+src/misc/crypt/crypt_hash_descriptor.c
+src/misc/crypt/crypt_hash_is_valid.c
+src/misc/crypt/crypt_inits.c
+src/misc/crypt/crypt_ltc_mp_descriptor.c
+src/misc/crypt/crypt_prng_descriptor.c
+src/misc/crypt/crypt_prng_is_valid.c
+src/misc/crypt/crypt_prng_rng_descriptor.c
+src/misc/crypt/crypt_register_all_ciphers.c
+src/misc/crypt/crypt_register_all_hashes.c
+src/misc/crypt/crypt_register_all_prngs.c
+src/misc/crypt/crypt_register_cipher.c
+src/misc/crypt/crypt_register_hash.c
+src/misc/crypt/crypt_register_prng.c
+src/misc/crypt/crypt_sizes.c
+src/misc/crypt/crypt_unregister_cipher.c
+src/misc/crypt/crypt_unregister_hash.c
+src/misc/crypt/crypt_unregister_prng.c
+src/misc/error_to_string.c
+src/misc/hkdf/hkdf.c
+src/misc/hkdf/hkdf_test.c
+src/misc/mem_neq.c
+src/misc/padding/padding_depad.c
+src/misc/padding/padding_pad.c
+src/misc/pbes/pbes.c
+src/misc/pbes/pbes1.c
+src/misc/pbes/pbes2.c
+src/misc/pkcs12/pkcs12_kdf.c
+src/misc/pkcs12/pkcs12_utf8_to_utf16.c
+src/misc/pkcs5/pkcs_5_1.c
+src/misc/pkcs5/pkcs_5_2.c
+src/misc/pkcs5/pkcs_5_test.c
+src/misc/ssh/ssh_decode_sequence_multi.c
+src/misc/ssh/ssh_encode_sequence_multi.c
+src/misc/zeromem.c
+src/modes/cbc/cbc_decrypt.c
+src/modes/cbc/cbc_done.c
+src/modes/cbc/cbc_encrypt.c
+src/modes/cbc/cbc_getiv.c
+src/modes/cbc/cbc_setiv.c
+src/modes/cbc/cbc_start.c
+src/modes/cfb/cfb_decrypt.c
+src/modes/cfb/cfb_done.c
+src/modes/cfb/cfb_encrypt.c
+src/modes/cfb/cfb_getiv.c
+src/modes/cfb/cfb_setiv.c
+src/modes/cfb/cfb_start.c
+src/modes/ctr/ctr_decrypt.c
+src/modes/ctr/ctr_done.c
+src/modes/ctr/ctr_encrypt.c
+src/modes/ctr/ctr_getiv.c
+src/modes/ctr/ctr_setiv.c
+src/modes/ctr/ctr_start.c
+src/modes/ctr/ctr_test.c
+src/modes/ecb/ecb_decrypt.c
+src/modes/ecb/ecb_done.c
+src/modes/ecb/ecb_encrypt.c
+src/modes/ecb/ecb_start.c
+src/modes/f8/f8_decrypt.c
+src/modes/f8/f8_done.c
+src/modes/f8/f8_encrypt.c
+src/modes/f8/f8_getiv.c
+src/modes/f8/f8_setiv.c
+src/modes/f8/f8_start.c
+src/modes/f8/f8_test_mode.c
+src/modes/lrw/lrw_decrypt.c
+src/modes/lrw/lrw_done.c
+src/modes/lrw/lrw_encrypt.c
+src/modes/lrw/lrw_getiv.c
+src/modes/lrw/lrw_process.c
+src/modes/lrw/lrw_setiv.c
+src/modes/lrw/lrw_start.c
+src/modes/lrw/lrw_test.c
+src/modes/ofb/ofb_decrypt.c
+src/modes/ofb/ofb_done.c
+src/modes/ofb/ofb_encrypt.c
+src/modes/ofb/ofb_getiv.c
+src/modes/ofb/ofb_setiv.c
+src/modes/ofb/ofb_start.c
+src/modes/xts/xts_decrypt.c
+src/modes/xts/xts_done.c
+src/modes/xts/xts_encrypt.c
+src/modes/xts/xts_init.c
+src/modes/xts/xts_mult_x.c
+src/modes/xts/xts_test.c
+src/pk/asn1/der/bit/der_decode_bit_string.c
+src/pk/asn1/der/bit/der_decode_raw_bit_string.c
+src/pk/asn1/der/bit/der_encode_bit_string.c
+src/pk/asn1/der/bit/der_encode_raw_bit_string.c
+src/pk/asn1/der/bit/der_length_bit_string.c
+src/pk/asn1/der/boolean/der_decode_boolean.c
+src/pk/asn1/der/boolean/der_encode_boolean.c
+src/pk/asn1/der/boolean/der_length_boolean.c
+src/pk/asn1/der/choice/der_decode_choice.c
+src/pk/asn1/der/custom_type/der_decode_custom_type.c
+src/pk/asn1/der/custom_type/der_encode_custom_type.c
+src/pk/asn1/der/custom_type/der_length_custom_type.c
+src/pk/asn1/der/general/der_asn1_maps.c
+src/pk/asn1/der/general/der_decode_asn1_identifier.c
+src/pk/asn1/der/general/der_decode_asn1_length.c
+src/pk/asn1/der/general/der_encode_asn1_identifier.c
+src/pk/asn1/der/general/der_encode_asn1_length.c
+src/pk/asn1/der/general/der_length_asn1_identifier.c
+src/pk/asn1/der/general/der_length_asn1_length.c
+src/pk/asn1/der/generalizedtime/der_decode_generalizedtime.c
+src/pk/asn1/der/generalizedtime/der_encode_generalizedtime.c
+src/pk/asn1/der/generalizedtime/der_length_generalizedtime.c
+src/pk/asn1/der/ia5/der_decode_ia5_string.c
+src/pk/asn1/der/ia5/der_encode_ia5_string.c
+src/pk/asn1/der/ia5/der_length_ia5_string.c
+src/pk/asn1/der/integer/der_decode_integer.c
+src/pk/asn1/der/integer/der_encode_integer.c
+src/pk/asn1/der/integer/der_length_integer.c
+src/pk/asn1/der/object_identifier/der_decode_object_identifier.c
+src/pk/asn1/der/object_identifier/der_encode_object_identifier.c
+src/pk/asn1/der/object_identifier/der_length_object_identifier.c
+src/pk/asn1/der/octet/der_decode_octet_string.c
+src/pk/asn1/der/octet/der_encode_octet_string.c
+src/pk/asn1/der/octet/der_length_octet_string.c
+src/pk/asn1/der/printable_string/der_decode_printable_string.c
+src/pk/asn1/der/printable_string/der_encode_printable_string.c
+src/pk/asn1/der/printable_string/der_length_printable_string.c
+src/pk/asn1/der/sequence/der_decode_sequence_ex.c
+src/pk/asn1/der/sequence/der_decode_sequence_flexi.c
+src/pk/asn1/der/sequence/der_decode_sequence_multi.c
+src/pk/asn1/der/sequence/der_encode_sequence_ex.c
+src/pk/asn1/der/sequence/der_encode_sequence_multi.c
+src/pk/asn1/der/sequence/der_length_sequence.c
+src/pk/asn1/der/sequence/der_sequence_free.c
+src/pk/asn1/der/sequence/der_sequence_shrink.c
+src/pk/asn1/der/set/der_encode_set.c
+src/pk/asn1/der/set/der_encode_setof.c
+src/pk/asn1/der/short_integer/der_decode_short_integer.c
+src/pk/asn1/der/short_integer/der_encode_short_integer.c
+src/pk/asn1/der/short_integer/der_length_short_integer.c
+src/pk/asn1/der/teletex_string/der_decode_teletex_string.c
+src/pk/asn1/der/teletex_string/der_length_teletex_string.c
+src/pk/asn1/der/utctime/der_decode_utctime.c
+src/pk/asn1/der/utctime/der_encode_utctime.c
+src/pk/asn1/der/utctime/der_length_utctime.c
+src/pk/asn1/der/utf8/der_decode_utf8_string.c
+src/pk/asn1/der/utf8/der_encode_utf8_string.c
+src/pk/asn1/der/utf8/der_length_utf8_string.c
+src/pk/asn1/oid/pk_get_oid.c
+src/pk/asn1/oid/pk_oid_cmp.c
+src/pk/asn1/oid/pk_oid_str.c
+src/pk/asn1/pkcs8/pkcs8_decode_flexi.c
+src/pk/asn1/x509/x509_decode_public_key_from_certificate.c
+src/pk/asn1/x509/x509_decode_subject_public_key_info.c
+src/pk/asn1/x509/x509_encode_subject_public_key_info.c
+src/pk/dh/dh.c
+src/pk/dh/dh_check_pubkey.c
+src/pk/dh/dh_export.c
+src/pk/dh/dh_export_key.c
+src/pk/dh/dh_free.c
+src/pk/dh/dh_generate_key.c
+src/pk/dh/dh_import.c
+src/pk/dh/dh_set.c
+src/pk/dh/dh_set_pg_dhparam.c
+src/pk/dh/dh_shared_secret.c
+src/pk/dsa/dsa_decrypt_key.c
+src/pk/dsa/dsa_encrypt_key.c
+src/pk/dsa/dsa_export.c
+src/pk/dsa/dsa_free.c
+src/pk/dsa/dsa_generate_key.c
+src/pk/dsa/dsa_generate_pqg.c
+src/pk/dsa/dsa_import.c
+src/pk/dsa/dsa_make_key.c
+src/pk/dsa/dsa_set.c
+src/pk/dsa/dsa_set_pqg_dsaparam.c
+src/pk/dsa/dsa_shared_secret.c
+src/pk/dsa/dsa_sign_hash.c
+src/pk/dsa/dsa_verify_hash.c
+src/pk/dsa/dsa_verify_key.c
+src/pk/ec25519/ec25519_crypto_ctx.c
+src/pk/ec25519/ec25519_export.c
+src/pk/ec25519/ec25519_import_pkcs8.c
+src/pk/ec25519/tweetnacl.c
+src/pk/ecc/ecc.c
+src/pk/ecc/ecc_ansi_x963_export.c
+src/pk/ecc/ecc_ansi_x963_import.c
+src/pk/ecc/ecc_decrypt_key.c
+src/pk/ecc/ecc_encrypt_key.c
+src/pk/ecc/ecc_export.c
+src/pk/ecc/ecc_export_openssl.c
+src/pk/ecc/ecc_find_curve.c
+src/pk/ecc/ecc_free.c
+src/pk/ecc/ecc_get_key.c
+src/pk/ecc/ecc_get_oid_str.c
+src/pk/ecc/ecc_get_size.c
+src/pk/ecc/ecc_import.c
+src/pk/ecc/ecc_import_openssl.c
+src/pk/ecc/ecc_import_pkcs8.c
+src/pk/ecc/ecc_import_x509.c
+src/pk/ecc/ecc_make_key.c
+src/pk/ecc/ecc_recover_key.c
+src/pk/ecc/ecc_set_curve.c
+src/pk/ecc/ecc_set_curve_internal.c
+src/pk/ecc/ecc_set_key.c
+src/pk/ecc/ecc_shared_secret.c
+src/pk/ecc/ecc_sign_hash.c
+src/pk/ecc/ecc_sizes.c
+src/pk/ecc/ecc_ssh_ecdsa_encode_name.c
+src/pk/ecc/ecc_verify_hash.c
+src/pk/ecc/ltc_ecc_export_point.c
+src/pk/ecc/ltc_ecc_import_point.c
+src/pk/ecc/ltc_ecc_is_point.c
+src/pk/ecc/ltc_ecc_is_point_at_infinity.c
+src/pk/ecc/ltc_ecc_map.c
+src/pk/ecc/ltc_ecc_mul2add.c
+src/pk/ecc/ltc_ecc_mulmod.c
+src/pk/ecc/ltc_ecc_mulmod_timing.c
+src/pk/ecc/ltc_ecc_points.c
+src/pk/ecc/ltc_ecc_projective_add_point.c
+src/pk/ecc/ltc_ecc_projective_dbl_point.c
+src/pk/ecc/ltc_ecc_verify_key.c
+src/pk/ed25519/ed25519_export.c
+src/pk/ed25519/ed25519_import.c
+src/pk/ed25519/ed25519_import_pkcs8.c
+src/pk/ed25519/ed25519_import_raw.c
+src/pk/ed25519/ed25519_import_x509.c
+src/pk/ed25519/ed25519_make_key.c
+src/pk/ed25519/ed25519_sign.c
+src/pk/ed25519/ed25519_verify.c
+src/pk/pkcs1/pkcs_1_i2osp.c
+src/pk/pkcs1/pkcs_1_mgf1.c
+src/pk/pkcs1/pkcs_1_oaep_decode.c
+src/pk/pkcs1/pkcs_1_oaep_encode.c
+src/pk/pkcs1/pkcs_1_os2ip.c
+src/pk/pkcs1/pkcs_1_pss_decode.c
+src/pk/pkcs1/pkcs_1_pss_encode.c
+src/pk/pkcs1/pkcs_1_v1_5_decode.c
+src/pk/pkcs1/pkcs_1_v1_5_encode.c
+src/pk/rsa/rsa_decrypt_key.c
+src/pk/rsa/rsa_encrypt_key.c
+src/pk/rsa/rsa_export.c
+src/pk/rsa/rsa_exptmod.c
+src/pk/rsa/rsa_get_size.c
+src/pk/rsa/rsa_import.c
+src/pk/rsa/rsa_import_pkcs8.c
+src/pk/rsa/rsa_import_x509.c
+src/pk/rsa/rsa_key.c
+src/pk/rsa/rsa_make_key.c
+src/pk/rsa/rsa_set.c
+src/pk/rsa/rsa_sign_hash.c
+src/pk/rsa/rsa_sign_saltlen_get.c
+src/pk/rsa/rsa_verify_hash.c
+src/pk/x25519/x25519_export.c
+src/pk/x25519/x25519_import.c
+src/pk/x25519/x25519_import_pkcs8.c
+src/pk/x25519/x25519_import_raw.c
+src/pk/x25519/x25519_import_x509.c
+src/pk/x25519/x25519_make_key.c
+src/pk/x25519/x25519_shared_secret.c
+src/prngs/chacha20.c
+src/prngs/fortuna.c
+src/prngs/rc4.c
+src/prngs/rng_get_bytes.c
+src/prngs/rng_make_prng.c
+src/prngs/sober128.c
+src/prngs/sprng.c
+src/prngs/yarrow.c
+src/stream/chacha/chacha_crypt.c
+src/stream/chacha/chacha_done.c
+src/stream/chacha/chacha_ivctr32.c
+src/stream/chacha/chacha_ivctr64.c
+src/stream/chacha/chacha_keystream.c
+src/stream/chacha/chacha_memory.c
+src/stream/chacha/chacha_setup.c
+src/stream/chacha/chacha_test.c
+src/stream/rabbit/rabbit.c
+src/stream/rabbit/rabbit_memory.c
+src/stream/rc4/rc4_stream.c
+src/stream/rc4/rc4_stream_memory.c
+src/stream/rc4/rc4_test.c
+src/stream/salsa20/salsa20_crypt.c
+src/stream/salsa20/salsa20_done.c
+src/stream/salsa20/salsa20_ivctr64.c
+src/stream/salsa20/salsa20_keystream.c
+src/stream/salsa20/salsa20_memory.c
+src/stream/salsa20/salsa20_setup.c
+src/stream/salsa20/salsa20_test.c
+src/stream/salsa20/xsalsa20_memory.c
+src/stream/salsa20/xsalsa20_setup.c
+src/stream/salsa20/xsalsa20_test.c
+src/stream/sober128/sober128_stream.c
+src/stream/sober128/sober128_stream_memory.c
+src/stream/sober128/sober128_test.c
+src/stream/sober128/sober128tab.c
+src/stream/sosemanuk/sosemanuk.c
+src/stream/sosemanuk/sosemanuk_memory.c
+src/stream/sosemanuk/sosemanuk_test.c
+)
+
+set(PUBLIC_HEADERS
+src/headers/tomcrypt.h
+src/headers/tomcrypt_argchk.h
+src/headers/tomcrypt_cfg.h
+src/headers/tomcrypt_cipher.h
+src/headers/tomcrypt_custom.h
+src/headers/tomcrypt_hash.h
+src/headers/tomcrypt_mac.h
+src/headers/tomcrypt_macros.h
+src/headers/tomcrypt_math.h
+src/headers/tomcrypt_misc.h
+src/headers/tomcrypt_pk.h
+src/headers/tomcrypt_pkcs.h
+src/headers/tomcrypt_prng.h
+)
+
+set(PRIVATE_HEADERS src/headers/tomcrypt_private.h)
+set_property(GLOBAL PROPERTY PUBLIC_HEADERS ${PUBLIC_HEADERS})
+

+ 71 - 0
tests/CMakeLists.txt

@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: Unlicense
+#
+# LibTomCrypt, modular cryptographic library -- Tom St Denis
+#
+
+cmake_minimum_required(VERSION 3.10)
+
+set(LTC_TEST test-ltc)
+
+# This file can be included from the top level or used stand-alone
+if(PROJECT_NAME)
+    set(LIBRARY_NAME ${PROJECT_NAME})
+else()
+    # Define an independent project and all the necessary stuff around
+    project(${LTC_TEST}
+        LANGUAGES C)
+    set(LIBRARY_NAME libtomcrypt)
+    find_package(${LIBRARY_NAME})
+    include(CTest)
+    if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+        set(CMAKE_BUILD_TYPE "Release")
+    endif()
+endif()
+
+#-----------------------------------------------------------------------------
+# Compose CFLAGS etc.
+#-----------------------------------------------------------------------------
+
+if(NOT MSVC)
+    set(CMAKE_C_FLAGS_DEBUG "-g3 -O1")
+endif()
+
+#-----------------------------------------------------------------------------
+# demo target
+#-----------------------------------------------------------------------------
+include(sources.cmake)
+set(PRIVATE_HEADERS
+    common.h
+    tomcrypt_test.h
+)
+
+add_executable(${LTC_TEST}
+    ${SOURCES}
+    ${PRIVATE_HEADERS}
+)
+
+target_include_directories(${LTC_TEST} PRIVATE
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    $<$<STREQUAL:${PROJECT_NAME},${LTC_TEST}>:${CMAKE_CURRENT_SOURCE_DIR}/..>
+)
+
+target_link_libraries(${LTC_TEST} PRIVATE
+    ${LIBRARY_NAME}
+)
+
+target_compile_options(${LTC_TEST} PRIVATE
+    $<$<STREQUAL:$<TARGET_PROPERTY:${LIBRARY_NAME},TYPE>,SHARED_LIBRARY>:-DLTC_TEST_DYNAMIC>
+    -DCMAKE_SOURCE_DIR=\"${CMAKE_SOURCE_DIR}\"
+    ${LTC_C_FLAGS}
+)
+target_link_options(${LTC_TEST} BEFORE PUBLIC
+    ${LTC_LD_FLAGS}
+)
+
+#-----------------------------------------------------------------------------
+# CTest
+#-----------------------------------------------------------------------------
+add_test(NAME ${LTC_TEST} COMMAND ${LTC_TEST})
+
+find_program(MEMORYCHECK_COMMAND valgrind)
+set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full")

+ 18 - 2
tests/common.c

@@ -79,10 +79,26 @@ static off_t fsize(const char *filename)
 
    return -1;
 }
+static DIR *s_opendir(const char *path, char *mypath, unsigned long l)
+{
+#ifdef CMAKE_SOURCE_DIR
+#define SOURCE_PREFIX CMAKE_SOURCE_DIR "/"
+#else
+#define SOURCE_PREFIX ""
+#endif
+   DIR *d = NULL;
+   int r = snprintf(mypath, l, "%s%s", SOURCE_PREFIX, path);
+   if (r > 0 && (unsigned int)r < l) {
+      d = opendir(mypath);
+   }
+
+   return d;
+}
 
 int test_process_dir(const char *path, void *ctx, dir_iter_cb process, dir_cleanup_cb cleanup, const char *test)
 {
-   DIR *d = opendir(path);
+   char mypath[PATH_MAX];
+   DIR *d = s_opendir(path, mypath, sizeof(mypath));
    struct dirent *de;
    char fname[PATH_MAX];
    void* buf = NULL;
@@ -96,7 +112,7 @@ int test_process_dir(const char *path, void *ctx, dir_iter_cb process, dir_clean
       fname[0] = '\0';
       if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0 || strcmp(de->d_name, "README.txt") == 0)
          continue;
-      strcat(fname, path);
+      strcat(fname, mypath);
       strcat(fname, "/");
       strcat(fname, de->d_name);
       fsz = fsize(fname);

+ 6 - 1
tests/file_test.c

@@ -13,7 +13,12 @@ int file_test(void)
                              0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
    unsigned char buf[200];
    unsigned long len;
-   const char *fname = "tests/test.key";
+#ifdef CMAKE_SOURCE_DIR
+#define FILE_IN_SOURCE_DIR(f) CMAKE_SOURCE_DIR "/" f
+#else
+#define FILE_IN_SOURCE_DIR(f) f
+#endif
+   const char *fname = FILE_IN_SOURCE_DIR("tests/test.key");
    FILE *in;
    int err, isha256, iaes;
 

+ 35 - 0
tests/sources.cmake

@@ -0,0 +1,35 @@
+set(SOURCES
+base16_test.c
+base32_test.c
+base64_test.c
+bcrypt_test.c
+cipher_hash_test.c
+common.c
+der_test.c
+dh_test.c
+dsa_test.c
+ecc_test.c
+ed25519_test.c
+file_test.c
+mac_test.c
+misc_test.c
+modes_test.c
+mpi_test.c
+multi_test.c
+no_null_termination_check_test.c
+no_prng.c
+padding_test.c
+pkcs_1_eme_test.c
+pkcs_1_emsa_test.c
+pkcs_1_oaep_test.c
+pkcs_1_pss_test.c
+pkcs_1_test.c
+prng_test.c
+rotate_test.c
+rsa_test.c
+ssh_test.c
+store_test.c
+test.c
+x25519_test.c
+)
+