aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2024-04-18 00:28:51 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2024-04-18 00:28:51 -0400
commitd09c6c1bd5da3e2d79351daeba304ca99976a726 (patch)
treed7e0057bb8546fcbee06e0f758906b3bd3397fa5 /CMakeLists.txt
parent54e06ada7d624ed0d28c6a6db04a149708841bf8 (diff)
refactor!: Pushing what I have to dev
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt229
1 files changed, 169 insertions, 60 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e6034a1..df0d884 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,45 +4,143 @@
cmake_minimum_required (VERSION 3.10)
+option(NC_BUILD_TESTS "Build tests" OFF)
+option(NC_DISABLE_INPUT_VALIDATION "Disables public function input validation" OFF)
+option(NC_FETCH_MBEDTLS "Fetch Mbed-TLS from it's source repository locally" OFF)
+option(NC_INCLUDE_MONOCYPHER "Statically link to vendored monocypher library" ON)
+set(CRYPTO_LIB "none" CACHE STRING "The crypto library to link to (mbedtls, openssl, none)")
+
+string(TOLOWER ${CMAKE_BUILD_TYPE} build_type)
+
+include(FetchContent)
+
+#SET SECP256k VARS
+set(SECP256K1_BUILD_BENCHMARK OFF)
+set(SECP256K1_BUILD_TESTS OFF)
+set(SECP256K1_BUILD_EXAMPLES OFF)
+set(SECP256K1_BUILD_EXHAUSTIVE_TESTS OFF)
+set(SECP256K1_BUILD_STATIC ON)
+set(SECP256K1_ENABLE_MODULE_ECDH ON)
+set(SECP256K1_ENABLE_MODULE_RECOVERY ON)
+set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON)
+set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
+set(SECP256K1_INSTALL OFF)
+set(SECP256K1_DISABLE_SHARED ON) #disales shared library output
+
+FetchContent_Declare(
+ libsecp256k1
+ GIT_REPOSITORY https://github.com/bitcoin-core/secp256k1
+ GIT_TAG 1ad5185cd42c0636104129fcc9f6a4bf9c67cc40 # release-0.4.1
+ GIT_PROGRESS TRUE
+)
+
+FetchContent_MakeAvailable(libsecp256k1)
+
+#Include mbedtls if enabled
+if(NC_FETCH_MBEDTLS)
+
+ set(ENABLE_PROGRAMS OFF)
+ set(ENABLE_TESTING OFF)
+ set(USE_SHARED_MBEDTLS_LIBRARY OFF)
+ set(USE_STATIC_MBEDTLS_LIBRARY ON)
+ set(DISABLE_PACKAGE_CONFIG_AND_INSTALL OFF)
+ set(MBEDTLS_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/mbedtls_custom_config.h" CACHE STRING "" FORCE)
+
+ FetchContent_Declare(
+ libmbedtls
+ GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
+ GIT_TAG v3.6.0
+ GIT_PROGRESS TRUE
+ )
+
+ FetchContent_MakeAvailable(libmbedtls)
+
+ set(CRYPTO_LIB "mbedtls") #enable linking to mbedtls
+endif()
+
+
+#-----------------------------
+# MAIN PROJECT
+#-----------------------------
+
project(noscrypt C)
-option(BUILD_TESTS "Build tests" TRUE)
+include_directories(include) #include the 'include' directory for the project
+set(CMAKE_C_STANDARD 90) #Setup the compiler options for c90 shared library
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(NOSCRYPT_SRCS
- "src/noscrypt.c"
+ "src/noscrypt.c"
+ "src/internal/nc-crypto.c" #pulls in c impl files as needed
)
set(NOSCRYPT_HEADERS
"src/noscrypt.h"
+ "src/platform.h"
+ "src/internal/nc-crypto.h"
+ "src/internal/nc-util.h"
)
-include_directories(include)
-
#static/shared library
add_library(${CMAKE_PROJECT_NAME} SHARED ${NOSCRYPT_SRCS} ${NOSCRYPT_HEADERS})
add_library(${CMAKE_PROJECT_NAME}_static STATIC ${NOSCRYPT_SRCS} ${NOSCRYPT_HEADERS})
+target_compile_features(${CMAKE_PROJECT_NAME} PUBLIC c_std_90) #force compiler to use c90 standard for library
-#Setup the compiler options for c90 shared library
-set(CMAKE_C_STANDARD 90)
-set(CMAKE_C_STANDARD_REQUIRED ON)
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+#link dependencies manually
+target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE secp256k1)
+target_link_libraries(${CMAKE_PROJECT_NAME}_static PRIVATE secp256k1)
+
+
+#############################################
+#
+# Configure crypto library linking
+#
+#############################################
+
+
+#if mbedtls linking is enabled target the library
+if(CRYPTO_LIB STREQUAL "mbedtls")
+
+ message(STATUS "Linking to MbedTLS crypto library")
+
+ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE mbedcrypto PRIVATE mbedtls)
+ target_link_libraries(${CMAKE_PROJECT_NAME}_static PRIVATE mbedcrypto PRIVATE mbedtls)
-target_compile_features(${CMAKE_PROJECT_NAME} PUBLIC c_std_90)
+ #enable mbedtls crypto library bindings
+ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE MBEDTLS_CRYPTO_LIB)
+
+elseif(CRYPTO_LIB STREQUAL "openssl")
+
+ #link to openssl
+ message(STATUS "Linking to OpenSSL crypto library")
+ target_link_libraries(myTarget PRIVATE OpenSSL::Crypto)
+
+ #enable openssl crypto library bindings
+ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE OPENSSL_CRYPTO_LIB)
+
+else()
+ #the library should be self sufficient in handling default crypto implementations
+
+endif()
-#if debug
add_compile_definitions($<$<CONFIG:Debug>:DEBUG>)
+add_compile_definitions(NOSCRYPT_EXPORTING) #enable exporting symbols
+
+if(NC_DISABLE_INPUT_VALIDATION)
+ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE NC_INPUT_VALIDATION_OFF)
+endif()
+
-#when building we are in libary mode, we need to export our symbols
-add_compile_definitions(NOSCRYPT_EXPORTING)
#setup flags for windows compilation
if(MSVC)
#global windows cl flags
- add_compile_options(
- /sdl #enable additional security checks
- /TC #compile as c
- /GS #buffer security check
+ target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
+ /sdl #enable additional security checks
+ /TC #compile as c
+ /GS #buffer security check
$<$<CONFIG:Debug>:/FC> #show full path in diagnostics
$<$<CONFIG:Debug>:/showIncludes> #show a list of all included header files during build
@@ -59,7 +157,7 @@ if(MSVC)
)
#set build macros
- add_compile_definitions(
+ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
$<$<CONFIG:DEBUG>:DEBUG>
$<$<CONFIG:RELEASE>:RELEASE>
)
@@ -67,62 +165,73 @@ if(MSVC)
#configure gcc flags
elseif(CMAKE_COMPILER_IS_GNUCC)
- add_compile_options(
- -Wextra
- -fstack-protector
-
- $<$<CONFIG:Debug>:-g>
- $<$<CONFIG:Debug>:-Og>
- $<$<CONFIG:Debug>:-Wall>
- $<$<CONFIG:Debug>:-Werror>
- $<$<CONFIG:Debug>:-Wall>
- $<$<CONFIG:Debug>:-pedantic>
- )
+ target_compile_definitions( ${CMAKE_PROJECT_NAME} PRIVATE -Wextra -fstack-protector)
+ #if debug build enable additional debug flags
+ if(build_type STREQUAL "debug")
+ target_compile_options(
+ ${CMAKE_PROJECT_NAME}
+ PRIVATE
+
+ -g
+ -0g
+ -Wall
+ -Werror
+ -pedantic
+ )
+ endif()
endif()
-# Setup secp256k1 shared libary
-unset(SECP256K1_LIB CACHE)
+#############################################
+#
+# Build/link monocypher
+#
+#############################################
-find_library(SECP256K1_LIB
- NAMES secp256k1 libsecp256k1 lib_secp256k1
- PATHS ${LOCAL_SECP256K1_DIR}/src
-)
+# Monocypher only provides a few fallback functions
+# for builds that don't use a more complete library
+# implementation.
-if(NOT SECP256K1_LIB)
- message(FATAL_ERROR "secp256k1 library not found on local system")
-endif()
+if(NC_INCLUDE_MONOCYPHER)
+ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE "vendor/monocypher")
-message(STATUS "secp256k1 library found at ${SECP256K1_LIB}")
-target_link_libraries(${CMAKE_PROJECT_NAME} ${SECP256K1_LIB})
+ #add monocypher source files
+ set(MONOCYPHER_SRCS
+ "vendor/monocypher/monocypher.c"
+ "vendor/monocypher/monocypher.h"
+ )
-#link mbedtls and mbedcrypto shared libraries
-unset(MBEDCRYPTO_LIB CACHE)
-unset(MBEDTLS_LIB CACHE)
+ #add monocypher as a static dep to the project
+ add_library(monocypher STATIC ${MONOCYPHER_SRCS})
+ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE monocypher)
-find_library(MBEDTLS_LIB
- NAMES mbedtls libmbedtls
- PATHS ${LOCAL_MBEDTLS_DIR}/library
-)
-find_library(MBEDCRYPTO_LIB
- NAMES mbedcrypto libmbedcrypto
- PATHS ${LOCAL_MBEDTLS_DIR}/library
-)
+ #enable monocypher crypto library bindings
+ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE NC_ENABLE_MONOCYPHER)
-if(NOT MBEDCRYPTO_LIB)
- message(FATAL_ERROR "mbedcrypto library not found on local system")
-endif()
-if(NOT MBEDTLS_LIB)
- message(FATAL_ERROR "mbedtls library not found on local system")
-endif()
+ #setup compiler options
+ target_compile_features(monocypher PRIVATE c_std_99) #targets c99
-message(STATUS "mbedtls library found at ${MBEDTLS_LIB}")
-message(STATUS "mbedcrypto library found at ${MBEDCRYPTO_LIB}")
+ if(MSVC)
+ target_compile_options(monocypher PRIVATE
+ /sdl #enable additional security checks
+ /TC #compile as c
+ /GS #buffer security check
+
+ $<$<CONFIG:Debug>:/FC> #show full path in diagnostics
+ $<$<CONFIG:Debug>:/showIncludes> #show a list of all included header files during build
+
+ #$<$<CONFIG:Debug>:/wd4820> #disable warnings for struct padding and spectre mitigation wuen WX is enabled
+ #$<$<CONFIG:Debug>:/wd5045> #disable warnings for spectre mitigation insertion
+ )
+ elseif(CMAKE_COMPILER_IS_GNUCC)
+ #from monocypher's Makefile
+ target_compile_options(monocypher PRIVATE -pedantic -Wall -Wextra -O3 -march=native)
+ endif()
+endif()
-target_link_libraries(${CMAKE_PROJECT_NAME} ${MBEDCRYPTO_LIB} ${MBEDTLS_LIB})
#TESTS
-if(BUILD_TESTS)
+if(NC_BUILD_TESTS)
#add test executable and link to library
add_executable(nctest tests/test.c)