diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..d6c92dba --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,414 @@ +project(libecc) + +include_directories(include) + +# Define options +option(PLATFORM_INCLUDE_STDLIB "Platform provides STDLIB" ON) +option(OPTION_SPECIFY_CONFIG "Customise libecc configuration" ON) +option(OPTION_BUILD_SELF_TEST "Build libecc ec-self-tests" ON) +option(OPTION_BUILD_UTILITY "Build libecc ec-utils" ON) +# Supported curves +option(OPTION_SUPPORT_CURVE_BIGN256V1 "Support EC Curve BIGN256V1" ON) +option(OPTION_SUPPORT_CURVE_BIGN384V1 "Support EC Curve BIGN384V1" ON) +option(OPTION_SUPPORT_CURVE_BIGN512V1 "Support EC Curve BIGN512V1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP192R1 "Support EC Curve BRAINPOOLP192R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP224R1 "Support EC Curve BRAINPOOLP224R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP256R1 "Support EC Curve BRAINPOOLP256R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP320R1 "Support EC Curve BRAINPOOLP320R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP384R1 "Support EC Curve BRAINPOOLP384R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP521R1 "Support EC Curve BRAINPOOLP521R1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP192T1 "Support EC Curve BRAINPOOLP192T1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP224T1 "Support EC Curve BRAINPOOLP224T1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP256T1 "Support EC Curve BRAINPOOLP256T1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP320T1 "Support EC Curve BRAINPOOLP320T1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP384T1 "Support EC Curve BRAINPOOLP384T1" ON) +option(OPTION_SUPPORT_CURVE_BRAINPOOLP521T1 "Support EC Curve BRAINPOOLP521T1" ON) +option(OPTION_SUPPORT_CURVE_FRP256V1 "Support EC Curve FRP256V1" ON) +option(OPTION_SUPPORT_CURVE_GOST256 "Support EC Curve GOST256" ON) +option(OPTION_SUPPORT_CURVE_GOST512 "Support EC Curve GOST512" ON) +option(OPTION_SUPPORT_CURVE_SECP192R1 "Support EC Curve SECP192R1" ON) +option(OPTION_SUPPORT_CURVE_SECP224R1 "Support EC Curve SECP224R1" ON) +option(OPTION_SUPPORT_CURVE_SECP256R1 "Support EC Curve SECP256R1" ON) +option(OPTION_SUPPORT_CURVE_SECP384R1 "Support EC Curve SECP384R1" ON) +option(OPTION_SUPPORT_CURVE_SECP521R1 "Support EC Curve SECP521R1" ON) +option(OPTION_SUPPORT_CURVE_SECP192K1 "Support EC Curve SECP192K1" ON) +option(OPTION_SUPPORT_CURVE_SECP224K1 "Support EC Curve SECP224K1" ON) +option(OPTION_SUPPORT_CURVE_SECP256K1 "Support EC Curve SECP256K1" ON) +option(OPTION_SUPPORT_CURVE_SM2P256TEST "Support EC Curve SM2P256TEST" ON) +option(OPTION_SUPPORT_CURVE_SM2P256V1 "Support EC Curve SM2P256V1" ON) +option(OPTION_SUPPORT_CURVE_WEI25519 "Support EC Curve WEI25519" ON) +option(OPTION_SUPPORT_CURVE_WEI448 "Support EC Curve WEI448" ON) +# Supported hash algorithms +option(OPTION_SUPPORT_HASH_SHA224 "Support Hash SHA224" ON) +option(OPTION_SUPPORT_HASH_SHA256 "Support Hash SHA256" ON) +option(OPTION_SUPPORT_HASH_SHA384 "Support Hash SHA384" ON) +option(OPTION_SUPPORT_HASH_SHA512 "Support Hash SHA512" ON) +option(OPTION_SUPPORT_HASH_SHA512_224 "Support Hash SHA512_224" ON) +option(OPTION_SUPPORT_HASH_SHA512_256 "Support Hash SHA512_256" ON) +option(OPTION_SUPPORT_HASH_SHA3_224 "Support Hash SHA3_224" ON) +option(OPTION_SUPPORT_HASH_SHA3_256 "Support Hash SHA3_256" ON) +option(OPTION_SUPPORT_HASH_SHA3_384 "Support Hash SHA3_384" ON) +option(OPTION_SUPPORT_HASH_SHA3_512 "Support Hash SHA3_512" ON) +option(OPTION_SUPPORT_HASH_SM3 "Support Hash SM3" ON) +option(OPTION_SUPPORT_HASH_SHAKE256 "Support Hash SHAKE256" ON) +option(OPTION_SUPPORT_HASH_STREEBOG256 "Support Hash STREEBOG256" ON) +option(OPTION_SUPPORT_HASH_STREEBOG512 "Support Hash STREEBOG512" ON) +option(OPTION_SUPPORT_HASH_RIPEMD160 "Support Hash RIPEMD160" ON) +option(OPTION_SUPPORT_HASH_BELT_HASH "Support Hash BELT_HASH" ON) +option(OPTION_SUPPORT_HASH_BASH224 "Support Hash BASH224" ON) +option(OPTION_SUPPORT_HASH_BASH256 "Support Hash BASH256" ON) +option(OPTION_SUPPORT_HASH_BASH384 "Support Hash BASH384" ON) +option(OPTION_SUPPORT_HASH_BASH512 "Support Hash BASH512" ON) +option(OPTION_SUPPORT_HASH_HMAC "Support Hash HMAC" ON) +# Supported sig/verif schemes +option(OPTION_SUPPORT_SIG_ECDSA "Support signature/verification scheme ECDSA" ON) +option(OPTION_SUPPORT_SIG_ECKCDSA "Support signature/verification scheme ECKDSA" ON) +option(OPTION_SUPPORT_SIG_ECSDSA "Support signature/verification scheme ECSDSA" ON) +option(OPTION_SUPPORT_SIG_ECOSDSA "Support signature/verification scheme ECOSDSA" ON) +option(OPTION_SUPPORT_SIG_ECFSDSA "Support signature/verification scheme ECFSDSA" ON) +option(OPTION_SUPPORT_SIG_ECGDSA "Support signature/verification scheme ECGDSA" ON) +option(OPTION_SUPPORT_SIG_ECRDSA "Support signature/verification scheme ECRDSA" ON) +option(OPTION_SUPPORT_SIG_ECSM2 "Support signature/verification scheme SM2" ON) +option(OPTION_SUPPORT_SIG_EDDSA25519 "Support signature/verification scheme EDDSA25519" ON) +option(OPTION_SUPPORT_SIG_EDDSA448 "Support signature/verification scheme EDDSA448" ON) +option(OPTION_SUPPORT_SIG_DECDSA "Support signature/verification scheme DECDSA" ON) +option(OPTION_SUPPORT_SIG_BIGN "Support signature/verification scheme BIGN" ON) +option(OPTION_SUPPORT_SIG_DBIGN "Support signature/verification scheme DBIGN" ON) +option(OPTION_SUPPORT_SIG_BIP0340 "Support signature/verification scheme BIP0340" ON) +# Supported ECDH schemes +option(OPTION_SUPPORT_ECDH_ECCCDH "Support ECDH scheme ECCCDH" ON) +option(OPTION_SUPPORT_ECDH_X25519 "Support ECDH scheme X25519" ON) +option(OPTION_SUPPORT_ECDH_X448 "Support ECDH scheme X448" ON) + +if (OPTION_SPECIFY_CONFIG) + add_definitions(-DWITH_LIBECC_CONFIG_OVERRIDE) + # Supported curves + if (OPTION_SUPPORT_CURVE_BIGN256V1) + add_definitions(-DWITH_CURVE_BIGN256V1) + endif(OPTION_SUPPORT_CURVE_BIGN256V1) + if (OPTION_SUPPORT_CURVE_BIGN384V1) + add_definitions(-DWITH_CURVE_BIGN384V1) + endif(OPTION_SUPPORT_CURVE_BIGN384V1) + if (OPTION_SUPPORT_CURVE_BIGN512V1) + add_definitions(-DWITH_CURVE_BIGN512V1) + endif(OPTION_SUPPORT_CURVE_BIGN512V1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP192R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP192R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP192R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP224R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP224R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP224R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP256R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP256R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP256R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP320R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP320R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP320R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP384R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP384R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP384R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP521R1) + add_definitions(-DWITH_CURVE_BRAINPOOLP521R1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP521R1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP192T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP192T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP192T1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP224T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP224T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP224T1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP256T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP256T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP256T1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP320T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP320T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP320T1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP384T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP384T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP384T1) + if (OPTION_SUPPORT_CURVE_BRAINPOOLP521T1) + add_definitions(-DWITH_CURVE_BRAINPOOLP521T1) + endif(OPTION_SUPPORT_CURVE_BRAINPOOLP521T1) + if (OPTION_SUPPORT_CURVE_FRP256V1) + add_definitions(-DWITH_CURVE_FRP256V1) + endif(OPTION_SUPPORT_CURVE_FRP256V1) + if (OPTION_SUPPORT_CURVE_GOST256) + add_definitions(-DWITH_CURVE_GOST256) + endif(OPTION_SUPPORT_CURVE_GOST256) + if (OPTION_SUPPORT_CURVE_GOST512) + add_definitions(-DWITH_CURVE_GOST512) + endif(OPTION_SUPPORT_CURVE_GOST512) + if (OPTION_SUPPORT_CURVE_SECP192K1) + add_definitions(-DWITH_CURVE_SECP192K1) + endif(OPTION_SUPPORT_CURVE_SECP192K1) + if (OPTION_SUPPORT_CURVE_SECP224K1) + add_definitions(-DWITH_CURVE_SECP224K1) + endif(OPTION_SUPPORT_CURVE_SECP224K1) + if (OPTION_SUPPORT_CURVE_SECP256K1) + add_definitions(-DWITH_CURVE_SECP256K1) + endif(OPTION_SUPPORT_CURVE_SECP256K1) + if (OPTION_SUPPORT_CURVE_SECP192R1) + add_definitions(-DWITH_CURVE_SECP192R1) + endif(OPTION_SUPPORT_CURVE_SECP192R1) + if (OPTION_SUPPORT_CURVE_SECP224R1) + add_definitions(-DWITH_CURVE_SECP224R1) + endif(OPTION_SUPPORT_CURVE_SECP224R1) + if (OPTION_SUPPORT_CURVE_SECP256R1) + add_definitions(-DWITH_CURVE_SECP256R1) + endif(OPTION_SUPPORT_CURVE_SECP256R1) + if (OPTION_SUPPORT_CURVE_SECP384R1) + add_definitions(-DWITH_CURVE_SECP384R1) + endif(OPTION_SUPPORT_CURVE_SECP384R1) + if (OPTION_SUPPORT_CURVE_SECP521R1) + add_definitions(-DWITH_CURVE_SECP521R1) + endif(OPTION_SUPPORT_CURVE_SECP521R1) + if (OPTION_SUPPORT_CURVE_SM2P256TEST) + add_definitions(-DWITH_CURVE_SM2P256TEST) + endif(OPTION_SUPPORT_CURVE_SM2P256TEST) + if (OPTION_SUPPORT_CURVE_SM2P256V1) + add_definitions(-DWITH_CURVE_SM2P256V1) + endif(OPTION_SUPPORT_CURVE_SM2P256V1) + if (OPTION_SUPPORT_CURVE_WEI25519) + add_definitions(-DWITH_CURVE_WEI25519) + endif(OPTION_SUPPORT_CURVE_WEI25519) + if (OPTION_SUPPORT_CURVE_WEI448) + add_definitions(-DWITH_CURVE_WEI448) + endif(OPTION_SUPPORT_CURVE_WEI448) + # Supported hash algorithms + if (OPTION_SUPPORT_HASH_SHA224) + add_definitions(-DWITH_HASH_SHA224) + endif(OPTION_SUPPORT_HASH_SHA224) + if (OPTION_SUPPORT_HASH_SHA256) + add_definitions(-DWITH_HASH_SHA256) + endif(OPTION_SUPPORT_HASH_SHA256) + if (OPTION_SUPPORT_HASH_SHA384) + add_definitions(-DWITH_HASH_SHA384) + endif(OPTION_SUPPORT_HASH_SHA384) + if (OPTION_SUPPORT_HASH_SHA512) + add_definitions(-DWITH_HASH_SHA512) + endif(OPTION_SUPPORT_HASH_SHA512) + if (OPTION_SUPPORT_HASH_SHA512_224) + add_definitions(-DWITH_HASH_SHA512_224) + endif(OPTION_SUPPORT_HASH_SHA512_224) + if (OPTION_SUPPORT_HASH_SHA512_256) + add_definitions(-DWITH_HASH_SHA512_256) + endif(OPTION_SUPPORT_HASH_SHA512_256) + if (OPTION_SUPPORT_HASH_SHA3_224) + add_definitions(-DWITH_HASH_SHA3_224) + endif(OPTION_SUPPORT_HASH_SHA3_224) + if (OPTION_SUPPORT_HASH_SHA3_256) + add_definitions(-DWITH_HASH_SHA3_256) + endif(OPTION_SUPPORT_HASH_SHA3_256) + if (OPTION_SUPPORT_HASH_SHA3_384) + add_definitions(-DWITH_HASH_SHA3_384) + endif(OPTION_SUPPORT_HASH_SHA3_384) + if (OPTION_SUPPORT_HASH_SHA3_512) + add_definitions(-DWITH_HASH_SHA3_512) + endif(OPTION_SUPPORT_HASH_SHA3_512) + if (OPTION_SUPPORT_HASH_SM3) + add_definitions(-DWITH_HASH_SM3) + endif(OPTION_SUPPORT_HASH_SM3) + if (OPTION_SUPPORT_HASH_SHAKE256) + add_definitions(-DWITH_HASH_SHAKE256) + endif(OPTION_SUPPORT_HASH_SHAKE256) + if (OPTION_SUPPORT_HASH_STREEBOG256) + add_definitions(-DWITH_HASH_STREEBOG256) + endif(OPTION_SUPPORT_HASH_STREEBOG256) + if (OPTION_SUPPORT_HASH_STREEBOG512) + add_definitions(-DWITH_HASH_STREEBOG512) + endif(OPTION_SUPPORT_HASH_STREEBOG512) + if (OPTION_SUPPORT_HASH_RIPEMD160) + add_definitions(-DWITH_HASH_RIPEMD160) + endif(OPTION_SUPPORT_HASH_RIPEMD160) + if (OPTION_SUPPORT_HASH_BELT_HASH) + add_definitions(-DWITH_HASH_BELT_HASH) + endif(OPTION_SUPPORT_HASH_BELT_HASH) + if (OPTION_SUPPORT_HASH_BASH224) + add_definitions(-DWITH_HASH_BASH224) + endif(OPTION_SUPPORT_HASH_BASH224) + if (OPTION_SUPPORT_HASH_BASH256) + add_definitions(-DWITH_HASH_BASH256) + endif(OPTION_SUPPORT_HASH_BASH256) + if (OPTION_SUPPORT_HASH_BASH384) + add_definitions(-DWITH_HASH_BASH384) + endif(OPTION_SUPPORT_HASH_BASH384) + if (OPTION_SUPPORT_HASH_BASH512) + add_definitions(-DWITH_HASH_BASH512) + endif(OPTION_SUPPORT_HASH_BASH512) + if (OPTION_SUPPORT_HASH_HMAC) + add_definitions(-DWITH_HMAC) + endif(OPTION_SUPPORT_HASH_HMAC) + # Supported sig/verif schemes + if (OPTION_SUPPORT_SIG_ECDSA) + add_definitions(-DWITH_SIG_ECDSA) + endif(OPTION_SUPPORT_SIG_ECDSA) + if (OPTION_SUPPORT_SIG_ECKCDSA) + add_definitions(-DWITH_SIG_ECKCDSA) + endif(OPTION_SUPPORT_SIG_ECKCDSA) + if (OPTION_SUPPORT_SIG_ECSDSA) + add_definitions(-DWITH_SIG_ECSDSA) + endif(OPTION_SUPPORT_SIG_ECSDSA) + if (OPTION_SUPPORT_SIG_ECOSDSA) + add_definitions(-DWITH_SIG_ECOSDSA) + endif(OPTION_SUPPORT_SIG_ECOSDSA) + if (OPTION_SUPPORT_SIG_ECFSDSA) + add_definitions(-DWITH_SIG_ECFSDSA) + endif(OPTION_SUPPORT_SIG_ECFSDSA) + if (OPTION_SUPPORT_SIG_ECGDSA) + add_definitions(-DWITH_SIG_ECGDSA) + endif(OPTION_SUPPORT_SIG_ECGDSA) + if (OPTION_SUPPORT_SIG_ECRDSA) + add_definitions(-DWITH_SIG_ECRDSA) + endif(OPTION_SUPPORT_SIG_ECRDSA) + if (OPTION_SUPPORT_SIG_SM2) + add_definitions(-DWITH_SIG_SM2) + endif(OPTION_SUPPORT_SIG_SM2) + if (OPTION_SUPPORT_SIG_EDDSA25519) + add_definitions(-DWITH_SIG_EDDSA25519) + endif(OPTION_SUPPORT_SIG_EDDSA25519) + if (OPTION_SUPPORT_SIG_EDDSA448) + add_definitions(-DWITH_SIG_EDDSA448) + endif(OPTION_SUPPORT_SIG_EDDSA448) + if (OPTION_SUPPORT_SIG_DECDSA) + add_definitions(-DWITH_SIG_DECDSA) + endif(OPTION_SUPPORT_SIG_DECDSA) + if (OPTION_SUPPORT_SIG_BIGN) + add_definitions(-DWITH_SIG_BIGN) + endif(OPTION_SUPPORT_SIG_BIGN) + if (OPTION_SUPPORT_SIG_DBIGN) + add_definitions(-DWITH_SIG_DBIGN) + endif(OPTION_SUPPORT_SIG_DBIGN) + if (OPTION_SUPPORT_SIG_BIP0340) + add_definitions(-DWITH_SIG_BIP0340) + endif(OPTION_SUPPORT_SIG_BIP0340) + # Supported ECDH schemes + if (OPTION_SUPPORT_ECDH_ECCCDH) + add_definitions(-DWITH_ECCCDH) + endif(OPTION_SUPPORT_ECDH_ECCCDH) + if (OPTION_SUPPORT_ECDH_X25519) + add_definitions(-DWITH_X25519) + endif(OPTION_SUPPORT_ECDH_X25519) + if (OPTION_SUPPORT_ECDH_X448) + add_definitions(-DWITH_X448) + endif(OPTION_SUPPORT_ECDH_X448) +endif(OPTION_SPECIFY_CONFIG) +include(CheckCXXSourceCompiles) + +if (CMAKE_GENERATOR MATCHES "Visual Studio") + if(CMAKE_CL_64) + add_definitions(-D__x86_64__) + else() + add_definitions(-D__i386__) + endif() +endif() + +if (PLATFORM_INCLUDE_STDLIB) + add_definitions(-DWITH_STDLIB) +endif() + +# Set platform variables +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + add_definitions(-D__WIN32__) +endif() + +# external dependencies +file(GLOB EXT_DEPS_SRC src/external_deps/*.c) + +# utils module (for the ARITH layer, we only need +# NN and FP - and not curves - related stuff. Same goes +# for EC and SIGN. Hence the distinction between three +# sets of utils objects. +file(GLOB UTILS_ARITH_SRC src/utils/utils.c + src/utils/utils_rand.c + src/utils/*_nn.c + src/utils/*_fp.c + src/utils/*_buf.c) +file(GLOB UTILS_EC_SRC src/utils/*_curves.c) +file(GLOB UTILS_SIGN_SRC src/utils/*_keys.c) + +# nn module +file(GLOB NN_SRC src/nn/n*.c) + +# fp module +file(GLOB FP_SRC src/fp/fp*.c) + +# curve module +file(GLOB CURVES_SRC src/curves/*.c) + +# Hash module +file(GLOB HASH_SRC src/hash/sha*.c + src/hash/bash*.c + src/hash/hash_algs.c + src/hash/sm3.c + src/hash/streebog.c + src/hash/ripemd160.c + src/hash/belt-hash.c + src/hash/hmac.c) + +# Key/Signature/Verification/ECDH module +file(GLOB SIG_SRC src/sig/*dsa.c + src/sig/ecdsa_common.c + src/sig/ecsdsa_common.c + src/sig/sig_algs.c + src/sig/sm2.c + src/sig/bign_common.c + src/sig/bign.c + src/sig/dbign.c + src/sig/bip0340.c) +file(GLOB ECDH_SRC src/ecdh/*.c) +file(GLOB KEY_SRC src/sig/ec_key.c) + +# Test elements +file(GLOB TESTS_OBJECTS_CORE_SRC src/tests/ec_self_tests_core.c) +file(GLOB TESTS_OBJECTS_SELF_SRC src/tests/ec_self_tests.c) +file(GLOB TESTS_OBJECTS_UTILS_SRC src/tests/ec_utils.c) + +set(LIBARITH_SRC ${FP_SRC} ${NN_SRC} ${UTILS_ARITH_SRC}) +set(LIBEC_SRC ${LIBARITH_SRC} ${CURVES_SRC} ${UTILS_EC_SRC}) +set(LIBSIGN_SRC ${LIBEC_SRC} ${HASH_SRC} ${SIG_SRC} ${KEY_SRC} ${UTILS_SIGN_SRC} ${ECDH_SRC}) + +set(EC_SELF_TESTS_SRC ${TESTS_OBJECTS_CORE_SRC} ${TESTS_OBJECTS_SELF_SRC} ${EXT_DEPS_SRC}) +set(EC_UTILS_SRC ${TESTS_OBJECTS_CORE_SRC} ${TESTS_OBJECTS_UTILS_SRC} ${EXT_DEPS_SRC}) + +# --- Static Libraries --- +if (NOT BUILD_SHARED_LIBS) + add_library(arith STATIC ${LIBARITH_SRC}) + add_library(ec STATIC ${LIBEC_SRC}) + add_library(sign STATIC ${LIBSIGN_SRC}) +endif(NOT BUILD_SHARED_LIBS) + +# --- Dynamic Libraries --- +if (BUILD_SHARED_LIBS) + add_library(arith_dyn SHARED ${LIBARITH_SRC}) + add_library(ec_dyn SHARED ${LIBEC_SRC}) + add_library(sign_dyn SHARED ${LIBSIGN_SRC}) +endif(BUILD_SHARED_LIBS) + +# --- Executables (Static linkage with libsign object files) --- +if (NOT BUILD_SHARED_LIBS) + if (OPTION_BUILD_SELF_TEST) + add_executable(ec_self_tests ${EC_SELF_TESTS_SRC}) + target_link_libraries(ec_self_tests sign) + endif (OPTION_BUILD_SELF_TEST) + if (OPTION_BUILD_UTILITY) + add_executable(ec_utils ${EC_UTILS_SRC}) + target_link_libraries(ec_utils sign) + endif (OPTION_BUILD_UTILITY) +endif(NOT BUILD_SHARED_LIBS) + +# --- Excutables (Dynamic linkage with libsign shared library) --- +if (BUILD_SHARED_LIBS) + if (OPTION_BUILD_SELF_TEST) + add_executable(ec_self_tests_dyn ${EC_SELF_TESTS_SRC}) + target_link_libraries(ec_self_tests_dyn sign_dyn) + endif (OPTION_BUILD_SELF_TEST) + if (OPTION_BUILD_UTILITY) + add_executable(ec_utils_dyn ${EC_UTILS_SRC}) + target_link_libraries(ec_utils_dyn sign_dyn) + endif (OPTION_BUILD_UTILITY) +endif(BUILD_SHARED_LIBS) + +# All source files, used to construct general rules +set(SRC ${EXT_DEPS_SRC} ${UTILS_ARITH_SRC} ${UTILS_EC_SRC} ${UTILS_SIGN_SRC} + ${NN_SRC} ${FP_SRC} ${CURVES_SRC} ${HASH_SRC} ${SIG_SRC} ${ECDH_SRC} + ${KEY_SRC} ${TESTS_OBJECTS_CORE_SRC} ${TESTS_OBJECTS_SELF_SRC} + ${TESTS_OBJECTS_UTILS_SRC})