include_directories(../include) if(UNIX) if (${ARCH} STREQUAL "aarch64") # The "armx" Perl scripts look for "64" in the style argument # in order to decide whether to generate 32- or 64-bit asm. if (APPLE) set(PERLASM_STYLE ios64) else() set(PERLASM_STYLE linux64) endif() elseif (${ARCH} STREQUAL "arm") if (APPLE) set(PERLASM_STYLE ios32) else() set(PERLASM_STYLE linux32) endif() elseif (${ARCH} STREQUAL "ppc64le") set(PERLASM_STYLE ppc64le) else() if (${ARCH} STREQUAL "x86") set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2") endif() if (APPLE) set(PERLASM_STYLE macosx) else() set(PERLASM_STYLE elf) endif() endif() set(ASM_EXT S) enable_language(ASM) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") # CMake does not add -isysroot and -arch flags to assembly. if (APPLE) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") foreach(arch ${CMAKE_OSX_ARCHITECTURES}) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") endforeach() endif() else() if (CMAKE_CL_64) message("Using nasm") set(PERLASM_STYLE nasm) else() message("Using win32n") set(PERLASM_STYLE win32n) set(PERLASM_FLAGS "-DOPENSSL_IA32_SSE2") endif() # On Windows, we use the NASM output, specifically built with Yasm. set(ASM_EXT asm) enable_language(ASM_NASM) endif() function(perlasm dest src) add_custom_command( OUTPUT ${dest} COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${PERLASM_STYLE} ${PERLASM_FLAGS} ${ARGN} ${dest} DEPENDS ${src} ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/ppc-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86masm.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86nasm.pl WORKING_DIRECTORY . ) endfunction() # Level 0.1 - depends on nothing outside this set. add_subdirectory(stack) add_subdirectory(lhash) add_subdirectory(err) add_subdirectory(buf) add_subdirectory(base64) add_subdirectory(bytestring) add_subdirectory(pool) # Level 0.2 - depends on nothing but itself add_subdirectory(rc4) add_subdirectory(conf) add_subdirectory(chacha) add_subdirectory(poly1305) add_subdirectory(curve25519) # Level 1, depends only on 0.* add_subdirectory(digest_extra) add_subdirectory(cipher) add_subdirectory(rand_extra) add_subdirectory(bio) add_subdirectory(bn_extra) add_subdirectory(obj) add_subdirectory(asn1) # Level 2 add_subdirectory(engine) add_subdirectory(dh) add_subdirectory(dsa) add_subdirectory(rsa) add_subdirectory(ec) add_subdirectory(ecdh) add_subdirectory(ecdsa) add_subdirectory(hmac_extra) # Level 3 add_subdirectory(cmac) add_subdirectory(evp) add_subdirectory(hkdf) add_subdirectory(pem) add_subdirectory(x509) add_subdirectory(x509v3) # Level 4 add_subdirectory(pkcs7) add_subdirectory(pkcs8) # Test support code add_subdirectory(test) add_subdirectory(fipsmodule) add_library( crypto_base OBJECT cpu-aarch64-linux.c cpu-arm.c cpu-arm-linux.c cpu-intel.c cpu-ppc64le.c crypto.c ex_data.c mem.c refcount_c11.c refcount_lock.c thread.c thread_none.c thread_pthread.c thread_win.c ) if(FIPS) SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES EXTERNAL_OBJECT true) SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES GENERATED true) set( CRYPTO_FIPS_OBJECTS fipsmodule/bcm.o ) endif() add_library( crypto $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ${CRYPTO_FIPS_OBJECTS} ) if(FIPS) add_dependencies(crypto bcm_o_target) endif() SET_TARGET_PROPERTIES(crypto PROPERTIES LINKER_LANGUAGE C) if(NOT MSVC AND NOT ANDROID) target_link_libraries(crypto pthread) endif() add_executable( thread_test thread_test.c $ ) target_link_libraries(thread_test crypto) add_dependencies(all_tests thread_test) add_executable( refcount_test refcount_test.cc ) target_link_libraries(refcount_test crypto) add_dependencies(all_tests refcount_test) # TODO(davidben): Convert the remaining tests to GTest. add_executable( crypto_test asn1/asn1_test.cc base64/base64_test.cc bio/bio_test.cc bytestring/bytestring_test.cc chacha/chacha_test.cc cmac/cmac_test.cc compiler_test.cc constant_time_test.cc curve25519/spake25519_test.cc curve25519/x25519_test.cc dh/dh_test.cc dsa/dsa_test.cc ec/ec_test.cc err/err_test.cc evp/evp_extra_test.cc fipsmodule/rand/ctrdrbg_test.cc rsa/rsa_test.cc $ $ ) target_link_libraries(crypto_test crypto gtest) if (WIN32) target_link_libraries(crypto_test ws2_32) endif() add_dependencies(all_tests crypto_test)