| @@ -0,0 +1,95 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| cmake_minimum_required(VERSION 3.0) | |||||
| project(DECAF VERSION 0.9.4 LANGUAGES C CXX) | |||||
| set(DECAF_SO_VERSION "0") | |||||
| option(ENABLE_SHARED "Build shared library." ON) | |||||
| option(ENABLE_STATIC "Build static library." ON) | |||||
| option(ENABLE_STRICT "Build with strict compile options." YES) | |||||
| option(ENABLE_TESTS "Enable compilation of tests." YES) | |||||
| if(NOT CPACK_GENERATOR AND NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX) | |||||
| set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) | |||||
| message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}") | |||||
| endif() | |||||
| include(GNUInstallDirs) | |||||
| include(CheckSymbolExists) | |||||
| include(CMakePushCheckState) | |||||
| include_directories( | |||||
| src/GENERATED/include/ | |||||
| src/include/ | |||||
| src/ | |||||
| ${CMAKE_CURRENT_BINARY_DIR} | |||||
| ) | |||||
| set(STRICT_OPTIONS_CPP ) | |||||
| set(STRICT_OPTIONS_C ) | |||||
| set(STRICT_OPTIONS_CXX ) | |||||
| if(MSVC) | |||||
| if(ENABLE_STRICT) | |||||
| set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} /WX") | |||||
| endif() | |||||
| else() | |||||
| set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -std=c++11 -O2 ") | |||||
| set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers ") | |||||
| set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c99 -O2 -Wstrict-prototypes -Wno-error=strict-prototypes -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer ") | |||||
| if(CMAKE_C_COMPILER_ID STREQUAL "Clang") | |||||
| set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Qunused-arguments -Wno-array-bounds ") | |||||
| endif() | |||||
| if(APPLE) | |||||
| set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-error=unknown-warning-option -Qunused-arguments -Wno-tautological-compare -Wno-unused-function -Wno-array-bounds ") | |||||
| set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -stdlib=libc++ ") | |||||
| endif() | |||||
| if(ENABLE_STRICT) | |||||
| set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing ") | |||||
| endif() | |||||
| endif() | |||||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STRICT_OPTIONS_C}") | |||||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STRICT_OPTIONS_CXX}") | |||||
| add_subdirectory(src) | |||||
| if(ENABLE_TESTS) | |||||
| enable_testing() | |||||
| add_subdirectory(test) | |||||
| endif() | |||||
| include(CMakePackageConfigHelpers) | |||||
| export(EXPORT ${EXPORT_TARGETS_NAME}Targets | |||||
| FILE "${CMAKE_CURRENT_BINARY_DIR}/DecafTargets.cmake" | |||||
| ) | |||||
| configure_file(cmake/DecafConfig.cmake.in | |||||
| "${CMAKE_CURRENT_BINARY_DIR}/DecafConfig.cmake" | |||||
| @ONLY | |||||
| ) | |||||
| set(ConfigPackageLocation share/decaf/cmake) | |||||
| install(EXPORT ${EXPORT_TARGETS_NAME}Targets | |||||
| FILE DecafTargets.cmake | |||||
| DESTINATION ${ConfigPackageLocation} | |||||
| ) | |||||
| install(FILES | |||||
| "${CMAKE_CURRENT_BINARY_DIR}/DecafConfig.cmake" | |||||
| DESTINATION ${ConfigPackageLocation} | |||||
| ) | |||||
| # CPack settings | |||||
| set(CPACK_PACKAGE_NAME "decaf") | |||||
| set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) | |||||
| set(CPACK_SOURCE_GENERATOR "TGZ") | |||||
| set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") | |||||
| set(CPACK_SOURCE_IGNORE_FILES | |||||
| "^${CMAKE_BINARY_DIR}" | |||||
| "/\\\\..+" | |||||
| ) | |||||
| include(CPack) | |||||
| @@ -0,0 +1,50 @@ | |||||
| ############################################################################ | |||||
| # decafConfig.cmake | |||||
| # Copyright (C) 2017 Belledonne Communications, Grenoble France | |||||
| # | |||||
| ############################################################################ | |||||
| # | |||||
| # This program is free software; you can redistribute it and/or | |||||
| # modify it under the terms of the GNU General Public License | |||||
| # as published by the Free Software Foundation; either version 2 | |||||
| # of the License, or (at your option) any later version. | |||||
| # | |||||
| # This program is distributed in the hope that it will be useful, | |||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| # GNU General Public License for more details. | |||||
| # | |||||
| # You should have received a copy of the GNU General Public License | |||||
| # along with this program; if not, write to the Free Software | |||||
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
| # | |||||
| ############################################################################ | |||||
| # | |||||
| # Config file for the decaf package. | |||||
| # It defines the following variables: | |||||
| # | |||||
| # DECAF_FOUND - system has decaf | |||||
| # DECAF_INCLUDE_DIRS - the decaf include directory | |||||
| # DECAF_LIBRARIES - The libraries needed to use decaf | |||||
| # DECAF_CPPFLAGS - The compilation flags needed to use decaf | |||||
| if(@ENABLE_SHARED@) | |||||
| set(DECAF_TARGETNAME decaf) | |||||
| set(DECAF_LIBRARIES ${DECAF_TARGETNAME}) | |||||
| else() | |||||
| set(DECAF_TARGETNAME decaf-static) | |||||
| if(TARGET ${DECAF_TARGETNAME}) | |||||
| get_target_property(DECAF_LIBRARIES ${DECAF_TARGETNAME} LOCATION) | |||||
| get_target_property(DECAF_LINK_LIBRARIES ${DECAF_TARGETNAME} INTERFACE_LINK_LIBRARIES) | |||||
| if(DECAF_LINK_LIBRARIES) | |||||
| list(APPEND DECAF_LIBRARIES ${DECAF_LINK_LIBRARIES}) | |||||
| endif() | |||||
| endif() | |||||
| endif() | |||||
| get_target_property(DECAF_INCLUDE_DIRS ${DECAF_TARGETNAME} INTERFACE_INCLUDE_DIRECTORIES) | |||||
| list(INSERT DECAF_INCLUDE_DIRS 0 "@CMAKE_INSTALL_FULL_INCLUDEDIR@") | |||||
| list(REMOVE_DUPLICATES DECAF_INCLUDE_DIRS) | |||||
| set(DECAF_CPPFLAGS @DECAF_CPPFLAGS@) | |||||
| set(DECAF_FOUND 1) | |||||
| @@ -0,0 +1,112 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| set(DECAF_HEADER_FILES | |||||
| include/constant_time.h | |||||
| include/field.h | |||||
| include/keccak_internal.h | |||||
| include/portable_endian.h | |||||
| include/word.h | |||||
| ) | |||||
| set(DECAF_SOURCE_FILES_C | |||||
| utils.c | |||||
| shake.c | |||||
| sha512.c | |||||
| spongerng.c | |||||
| ) | |||||
| # default target arch is arch_32 which shall be generic enough to compile mostly on anything | |||||
| # target arch dirs: | |||||
| # global one to get the include/arch_intrinsics.h | |||||
| # availables: arch_32, arch_arm_32, arch_neon, arch_ref64, arch_x86_64 | |||||
| set(TARGET_ARCH_DIR arch_32) | |||||
| # specific to p25519, to get f_impl.c/h in p25519 | |||||
| #availables: arch_32, arch_ref64, arch_x86_64 | |||||
| set(TARGET_ARCH_DIR_P25519 arch_32) | |||||
| # specific to p448, to get f_impl.c/h in p448 | |||||
| # availables: arch_32, arch_arm_32, arch_neon, arch_ref64, arch_x86_64 | |||||
| set(TARGET_ARCH_DIR_P448 arch_32) | |||||
| if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") # x86_64 | |||||
| message("Target architecture is x86_64") | |||||
| set(TARGET_ARCH_DIR arch_x86_64) | |||||
| set(TARGET_ARCH_DIR_P25519 arch_x86_64) | |||||
| set(TARGET_ARCH_DIR_P448 arch_x86_64) | |||||
| elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arch64") # shall be arm64 bits, stick to ref64 | |||||
| message("Target architecture is 64 bits general purpose(arm64 shall use this)") | |||||
| set(TARGET_ARCH_DIR arch_ref64) | |||||
| set(TARGET_ARCH_DIR_P25519 arch_ref64) | |||||
| set(TARGET_ARCH_DIR_P448 arch_ref64) | |||||
| elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") # is an arm 32 bits, TODO: detect neon features? | |||||
| message("Target architecture is arm32 no NEON") | |||||
| set(TARGET_ARCH_DIR arch_arm_32) | |||||
| set(TARGET_ARCH_DIR_P25519 arch_32) # nothing specific for arm32 on p25519 | |||||
| set(TARGET_ARCH_DIR_P448 arch_arm_32) | |||||
| else() # nothing picked yet, stick to the | |||||
| message("Target architecture is general purpose 32bits") | |||||
| endif() | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/include/${TARGET_ARCH_DIR} | |||||
| ) | |||||
| set(DECAF_SOURCE_FILES_CXX | |||||
| ) | |||||
| add_subdirectory(GENERATED/c/p25519) | |||||
| add_subdirectory(GENERATED/c/p448) | |||||
| add_subdirectory(GENERATED/c/curve25519) | |||||
| add_subdirectory(GENERATED/c/ed448goldilocks) | |||||
| if(ENABLE_STATIC) | |||||
| add_library(decaf-static STATIC ${DECAF_HEADER_FILES} ${DECAF_SOURCE_FILES_C} ${DECAF_SOURCE_FILES_CXX} $<TARGET_OBJECTS:p25519> $<TARGET_OBJECTS:p448> $<TARGET_OBJECTS:CURVE25519> $<TARGET_OBJECTS:CURVE448>) | |||||
| set_target_properties(decaf-static PROPERTIES OUTPUT_NAME decaf) | |||||
| target_include_directories(decaf-static PUBLIC) | |||||
| target_link_libraries(decaf-static INTERFACE) | |||||
| endif() | |||||
| if(ENABLE_SHARED) | |||||
| add_library(decaf SHARED ${DECAF_HEADER_FILES} ${DECAF_SOURCE_FILES_C} ${DECAF_SOURCE_FILES_CXX} $<TARGET_OBJECTS:p25519> $<TARGET_OBJECTS:p448> $<TARGET_OBJECTS:CURVE25519> $<TARGET_OBJECTS:CURVE448>) | |||||
| if(APPLE) | |||||
| set_target_properties(decaf PROPERTIES LINK_FLAGS "-stdlib=libc++") | |||||
| endif() | |||||
| set_target_properties(decaf PROPERTIES VERSION ${DECAF_SO_VERSION}) | |||||
| target_include_directories(decaf PUBLIC) | |||||
| target_link_libraries(decaf PRIVATE) | |||||
| if(MSVC) | |||||
| if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") | |||||
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/decaf.pdb | |||||
| DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
| PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE | |||||
| ) | |||||
| endif() | |||||
| endif() | |||||
| endif() | |||||
| if(ENABLE_STATIC) | |||||
| install(TARGETS decaf-static EXPORT ${EXPORT_TARGETS_NAME}Targets | |||||
| RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
| LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE | |||||
| ) | |||||
| endif() | |||||
| if(ENABLE_SHARED) | |||||
| install(TARGETS decaf EXPORT ${EXPORT_TARGETS_NAME}Targets | |||||
| RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | |||||
| LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |||||
| PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE | |||||
| ) | |||||
| endif() | |||||
| install(DIRECTORY GENERATED/include/ | |||||
| DESTINATION include/decaf | |||||
| FILES_MATCHING PATTERN "*.h*" | |||||
| PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ | |||||
| ) | |||||
| @@ -0,0 +1,26 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519 | |||||
| ${PROJECT_SOURCE_DIR}/src/GENERATED/c/p25519 | |||||
| ) | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519} | |||||
| ) | |||||
| set(CURVE25519_SOURCE_FILES_C | |||||
| decaf.c | |||||
| elligator.c | |||||
| scalar.c | |||||
| eddsa.c | |||||
| decaf_tables.c | |||||
| ) | |||||
| add_library(CURVE25519 OBJECT ${CURVE25519_SOURCE_FILES_C}) | |||||
| set_target_properties(CURVE25519 PROPERTIES POSITION_INDEPENDENT_CODE True) | |||||
| @@ -0,0 +1,26 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p448 | |||||
| ${PROJECT_SOURCE_DIR}/src/GENERATED/c/p448 | |||||
| ) | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448} | |||||
| ) | |||||
| set(CURVE448_SOURCE_FILES_C | |||||
| decaf.c | |||||
| elligator.c | |||||
| scalar.c | |||||
| eddsa.c | |||||
| decaf_tables.c | |||||
| ) | |||||
| add_library(CURVE448 OBJECT ${CURVE448_SOURCE_FILES_C}) | |||||
| set_target_properties(CURVE448 PROPERTIES POSITION_INDEPENDENT_CODE True) | |||||
| @@ -0,0 +1,28 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519 | |||||
| ${PROJECT_SOURCE_DIR}/src/GENERATED/c/p25519 | |||||
| ) | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519} | |||||
| ) | |||||
| set(P25519_HEADER_FILES | |||||
| f_field.h | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}/f_impl.h | |||||
| ) | |||||
| set(P25519_SOURCE_FILES_C | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519/${TARGET_ARCH_DIR_P25519}/f_impl.c | |||||
| ${PROJECT_SOURCE_DIR}/src/p25519/f_arithmetic.c | |||||
| f_generic.c | |||||
| ) | |||||
| add_library(p25519 OBJECT ${P25519_HEADER_FILES} ${P25519_SOURCE_FILES_C}) | |||||
| set_target_properties(p25519 PROPERTIES POSITION_INDEPENDENT_CODE True) | |||||
| @@ -0,0 +1,29 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p448 | |||||
| ${PROJECT_SOURCE_DIR}/src/GENERATED/c/p448 | |||||
| ) | |||||
| include_directories( | |||||
| ${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448} | |||||
| ) | |||||
| set(P448_HEADER_FILES | |||||
| f_field.h | |||||
| ${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}/f_impl.h | |||||
| ) | |||||
| set(P448_SOURCE_FILES_C | |||||
| ${PROJECT_SOURCE_DIR}/src/p448/${TARGET_ARCH_DIR_P448}/f_impl.c | |||||
| ${PROJECT_SOURCE_DIR}/src/p448/f_arithmetic.c | |||||
| f_generic.c | |||||
| ) | |||||
| add_library(p448 OBJECT ${P448_HEADER_FILES} ${P448_SOURCE_FILES_C}) | |||||
| set_target_properties(p448 PROPERTIES POSITION_INDEPENDENT_CODE True) | |||||
| @@ -0,0 +1,31 @@ | |||||
| ############################################################################ | |||||
| # CMakeLists.txt | |||||
| # | |||||
| # Released under the MIT License. See LICENSE.txt for license information. | |||||
| # | |||||
| ############################################################################ | |||||
| if(ENABLE_SHARED) | |||||
| set(DECAF_LIBRARIES_FOR_TESTER decaf) | |||||
| else() | |||||
| set(DECAF_LIBRARIES_FOR_TESTER decaf-static) | |||||
| endif() | |||||
| add_executable(decaf_tester test_decaf.cxx) | |||||
| set_target_properties(decaf_tester PROPERTIES LINKER_LANGUAGE CXX) | |||||
| target_link_libraries(decaf_tester ${DECAF_LIBRARIES_FOR_TESTER}) | |||||
| add_executable(ristretto_tester ristretto.cxx) | |||||
| set_target_properties(ristretto_tester PROPERTIES LINKER_LANGUAGE CXX) | |||||
| target_link_libraries(ristretto_tester ${DECAF_LIBRARIES_FOR_TESTER}) | |||||
| add_executable(shakesum_tester shakesum.c) | |||||
| set_target_properties(shakesum_tester PROPERTIES LINKER_LANGUAGE C) | |||||
| target_link_libraries(shakesum_tester ${DECAF_LIBRARIES_FOR_TESTER}) | |||||
| add_executable(bench bench_decaf.cxx) | |||||
| set_target_properties(bench PROPERTIES LINKER_LANGUAGE CXX) | |||||
| target_link_libraries(bench ${DECAF_LIBRARIES_FOR_TESTER}) | |||||
| add_test(NAME decaf COMMAND decaf_tester) | |||||
| add_test(NAME bench COMMAND bench) | |||||