diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..958336e --- /dev/null +++ b/CMakeLists.txt @@ -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) diff --git a/cmake/DecafConfig.cmake.in b/cmake/DecafConfig.cmake.in new file mode 100644 index 0000000..05837f9 --- /dev/null +++ b/cmake/DecafConfig.cmake.in @@ -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) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..2585c73 --- /dev/null +++ b/src/CMakeLists.txt @@ -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} $ $ $ $) + 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} $ $ $ $) + 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 +) diff --git a/src/GENERATED/c/curve25519/CMakeLists.txt b/src/GENERATED/c/curve25519/CMakeLists.txt new file mode 100644 index 0000000..dd64d1c --- /dev/null +++ b/src/GENERATED/c/curve25519/CMakeLists.txt @@ -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) diff --git a/src/GENERATED/c/ed448goldilocks/CMakeLists.txt b/src/GENERATED/c/ed448goldilocks/CMakeLists.txt new file mode 100644 index 0000000..180efc6 --- /dev/null +++ b/src/GENERATED/c/ed448goldilocks/CMakeLists.txt @@ -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) diff --git a/src/GENERATED/c/p25519/CMakeLists.txt b/src/GENERATED/c/p25519/CMakeLists.txt new file mode 100644 index 0000000..3371afd --- /dev/null +++ b/src/GENERATED/c/p25519/CMakeLists.txt @@ -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) diff --git a/src/GENERATED/c/p448/CMakeLists.txt b/src/GENERATED/c/p448/CMakeLists.txt new file mode 100644 index 0000000..fc7b350 --- /dev/null +++ b/src/GENERATED/c/p448/CMakeLists.txt @@ -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) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..77e3945 --- /dev/null +++ b/test/CMakeLists.txt @@ -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) +