diff --git a/CMakeLists.txt b/CMakeLists.txt index 7477033d2d..b321a4160e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,9 +4,11 @@ project(core) set(CORE_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}") +add_custom_target(tests) +get_property(all_tests GLOBAL PROPERTY TEST_TARGETS) + include(${CORE_ROOT_DIR}/common.cmake) -# platform-specific compile flags if(EMSCRIPTEN) add_subdirectory( "${CORE_ROOT_DIR}/OfficeUtils/js" zlib ) @@ -15,6 +17,7 @@ if(EMSCRIPTEN) add_subdirectory( "${CORE_ROOT_DIR}/Common/3dParty/hunspell" spell ) add_subdirectory( "${CORE_ROOT_DIR}/DesktopEditor/fontengine/js" fonts ) add_subdirectory( "${CORE_ROOT_DIR}/DesktopEditor/graphics/pro/js/" drawingfile ) + else() add_compile_options(-march=native) @@ -26,50 +29,10 @@ else() add_subdirectory( "${CORE_ROOT_DIR}/DesktopEditor/doctrenderer/app_builder" docbuilder ) add_subdirectory( "${CORE_ROOT_DIR}/PdfFile/Resources/CMapMemory" cmapbin ) - #[[ - set( ALL_ARTIFACTS - UnicodeConverter - kernel - kernel_network - Fb2File - PdfFile - HtmlFile2 - EpubFile - XpsFile - OFDFile - DjVuFile - DocxRenderer - doctrenderer - IWorkFile - HWPFile - graphics - x2tlib - allfontsgen - allthemesgen - pluginsmanager - docbuilder - x2t - ) - - add_custom_target(copy_artifacts ALL - COMMENT "Copying all artifacts into ${EO_CORE_OUTPUT_DIR}" - ) - - add_dependencies(copy_artifacts ${ALL_ARTIFACTS}) - - foreach(artifact ${ALL_ARTIFACTS}) - add_custom_command(TARGET copy_artifacts POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${EO_CORE_OUTPUT_DIR}" - COMMAND ${CMAKE_COMMAND} -E copy $ "${EO_CORE_OUTPUT_DIR}/" - COMMENT "Copying ${artifact} to ${EO_CORE_OUTPUT_DIR}" - ) - endforeach() + add_subdirectory( "${CORE_ROOT_DIR}/Common/3dParty/openssl/test" ) - add_custom_command(TARGET copy_artifacts POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${EO_CORE_OUTPUT_DIR}" - COMMAND /bin/sh -c "cp -P \"${EO_CORE_3RD_PARTY_INSTALL_DIR}/icu/lib\"/*.so* \"${EO_CORE_OUTPUT_DIR}/\"" - COMMENT "Copying ICU libs to ${EO_CORE_OUTPUT_DIR}" - ) - ]] + if(all_tests) + add_dependencies(tests ${all_tests}) + endif() endif() diff --git a/Common/3dParty/brotli/nc-fetch.sh b/Common/3dParty/brotli/nc-fetch.sh index de32637760..afc94fff71 100755 --- a/Common/3dParty/brotli/nc-fetch.sh +++ b/Common/3dParty/brotli/nc-fetch.sh @@ -1,6 +1,7 @@ #!/bin/bash install_dir="$1" +git_tag="v1.2.0" abort_op() { @@ -25,11 +26,7 @@ fi echo "Fetching Brotli" -mkdir -p "$install_dir" || abort_op "Failed to create brotli directory." -cd "$install_dir" -git init || abort_op "Git init failed (brotli)" -git remote add origin https://github.com/google/brotli.git || abort_op "Failed to add brotli remote" -git fetch --depth 1 origin a47d7475063eb223c87632eed806c0070e70da29 || abort_op "Failed to fetch a47d7475063eb223c87632eed806c0070e70da29" -git checkout FETCH_HEAD || abort_op "Check-out failed (brotli)" +git clone --depth=1 --branch $git_tag https://github.com/google/brotli.git "$install_dir" \ + || abort_op "Failed to clone brotli repo" echo "Brotli ready!" diff --git a/Common/3dParty/icu/nc-build.sh b/Common/3dParty/icu/nc-build.sh index 4b94edb305..6912bf679a 100755 --- a/Common/3dParty/icu/nc-build.sh +++ b/Common/3dParty/icu/nc-build.sh @@ -4,7 +4,6 @@ work_dir="$1" install_dir="$2" icu_major=$3 icu_minor=$4 -fetch_only=${5:-0} abort_op() { @@ -57,11 +56,8 @@ CXXFLAGS="-static-libstdc++ -static-libgcc" \ LDFLAGS='-Wl,-rpath,$$ORIGIN' \ || abort_op "Configure failed" -if [ "$fetch_only" -eq 0 ]; then - make -j10 && make install || abort_op "Build failed" +make -j10 && make install || abort_op "Build failed" - echo "ICU ready! (work dir will be removed)" - rm -rf "$work_dir" -fi +echo "ICU ready!" exit 0 diff --git a/Common/3dParty/openssl/nc-build.sh b/Common/3dParty/openssl/nc-build.sh index c28d1cd43d..ff97dcb99f 100755 --- a/Common/3dParty/openssl/nc-build.sh +++ b/Common/3dParty/openssl/nc-build.sh @@ -2,8 +2,11 @@ work_dir="$1" install_dir="$2" -keep_work=${3:-0} +keep_work=${3:-""} +script_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" +patches_dir="$script_dir/../../../DesktopEditor/graphics/pro/js/wasm/patches" +# DesktopEditor/graphics/pro/js/wasm/patches/fix-wasm-openssl.patch abort_op() { rm -rf "$work_dir" @@ -33,12 +36,16 @@ fi mkdir -p "$work_dir" || abort_op "Failed to create work dir: [$work_dir]" echo "Fetching OpenSSL repo into: [$work_dir]" -git clone --depth=1 --branch OpenSSL_1_1_1f https://github.com/openssl/openssl.git "$work_dir" \ +git clone --depth 1 --branch openssl-3.6.1 https://github.com/openssl/openssl.git "$work_dir" \ || abort_op "Git clone failed!" +echo "Patching OpenSSL" +cd "$work_dir" +git apply "$patches_dir/fix-wasm-openssl.patch" || abort_op "Failed to apply fix-wasm-openssl.patch" + echo "Building OpenSSL" cd "$work_dir" -./config enable-md2 no-shared no-asm --prefix=$install_dir --openssldir=$install_dir \ +./config enable-md2 no-shared no-asm no-afalgeng --prefix=$install_dir --openssldir=$install_dir \ || abort_op "Configuration failed!" make -j10 || abort_op "Build failed!" @@ -46,9 +53,12 @@ make -j10 || abort_op "Build failed!" echo "Installing OpenSSL to: [$install_dir]" make install || abort_op "Install failed!" -if [ "$keep_work" -eq 0 ]; then - echo "OpenSSL ready! (work dir will be removed)" +echo "OpenSSL ready!" + +if [ "$keep_work" == "dont_keep_workdir" ]; then + echo "Work dir will be removed." rm -rf "$work_dir" fi exit 0 + diff --git a/Common/3dParty/openssl/test/CMakeLists.txt b/Common/3dParty/openssl/test/CMakeLists.txt new file mode 100644 index 0000000000..bcd07cb559 --- /dev/null +++ b/Common/3dParty/openssl/test/CMakeLists.txt @@ -0,0 +1,71 @@ +cmake_minimum_required(VERSION 3.10) + +project(openssl_test) + +set(CORE_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../..") +set(OPENSSL_COMMON_SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/../common") + +include(${CORE_ROOT_DIR}/common.cmake) + +if(NOT TARGET kernel) + add_subdirectory(${CORE_ROOT_DIR}/Common kernel) +endif() + +message( "Fetch and build OpenSSL" ) +set(OPENSSL_3RDPARTY_DIR "${CORE_ROOT_DIR}/Common/3dParty/openssl") +set(OPENSSL_INSTALL_DIR "${EO_CORE_3RD_PARTY_INSTALL_DIR}/openssl_build_linux_64") +get_filename_component(OPENSSL_3RDPARTY_DIR_ABS "${OPENSSL_3RDPARTY_DIR}" ABSOLUTE) +get_filename_component(OPENSSL_INSTALL_DIR_ABS "${OPENSSL_INSTALL_DIR}" ABSOLUTE) +execute_process( + COMMAND_ECHO STDOUT + COMMAND ./nc-build.sh "${EO_CORE_3RD_PARTY_WORK_DIR}/openssl" "${OPENSSL_INSTALL_DIR}" + WORKING_DIRECTORY ${OPENSSL_3RDPARTY_DIR_ABS} +) + + +add_executable(openssl_test + ${OPENSSL_COMMON_SRC_DIR}/common_openssl.cpp + ${CMAKE_CURRENT_LIST_DIR}/main.cpp + + ${OPENSSL_COMMON_SRC_DIR}/common_openssl.h +) + +set_default_options(openssl_test) + +target_include_directories(openssl_test PRIVATE + ${OPENSSL_INSTALL_DIR}/include +) + +target_link_libraries(openssl_test PRIVATE + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libssl.a + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libcrypto.a +) + +target_link_libraries(openssl_test PUBLIC + kernel +) + +copy_icu_libs(openssl_test) + + + +target_link_libraries(openssl_test PRIVATE doctest::doctest) + +# Modify rpath so test binary can run properly +get_target_property(old_rpath openssl_test BUILD_RPATH) +if(old_rpath) + set(new_rpath "${old_rpath}:${EO_CORE_OUTPUT_DIR}") +else() + set(new_rpath "${EO_CORE_OUTPUT_DIR}") +endif() +set_target_properties(openssl_test PROPERTIES + BUILD_RPATH "${new_rpath}" + INSTALL_RPATH "${new_rpath}" +) + +register_test_target(openssl_tests) + +include(${doctest_SOURCE_DIR}/scripts/cmake/doctest.cmake) +doctest_discover_tests(openssl_test + TEST_PREFIX "openssl." +) diff --git a/Common/3dParty/openssl/test/main.cpp b/Common/3dParty/openssl/test/main.cpp index 3c9c663dab..a295c18471 100644 --- a/Common/3dParty/openssl/test/main.cpp +++ b/Common/3dParty/openssl/test/main.cpp @@ -30,27 +30,33 @@ * */ +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#include + +#include + #include "./../common/common_openssl.h" -int main(int argc, char *argv[]) +TEST_SUITE( "OpenSSL" ) { - argc; - argv; - if (true) + TEST_CASE( "SHA-256" ) { std::string sTestHashString = "knoejnrgijwenrgiojwnergjiwnerigjnwerojgnweorigjn"; unsigned int data_len = 0; unsigned char* data = NSOpenSSL::GetHash((unsigned char*)sTestHashString.c_str(), (unsigned int)sTestHashString.length(), OPENSSL_HASH_ALG_SHA256, data_len); std::string sResult = NSOpenSSL::Serialize(data, data_len, OPENSSL_SERIALIZE_TYPE_HEX); + NSOpenSSL::openssl_free(data); + + const std::string sExpectedResult = "913DD5544D5C726A40D551ACE85B29ABBBD4E2ADF2F4DA5BD07CEC07680CF5CD"; + CHECK( sResult == sExpectedResult ); } - if (true) + TEST_CASE( "RSA" ) { unsigned char* publicKey = NULL; unsigned char* privateKey = NULL; bool bRes = NSOpenSSL::RSA_GenerateKeys(publicKey, privateKey); - bRes; std::string sPublic((char*)publicKey); std::string sPrivate((char*)privateKey); @@ -58,37 +64,35 @@ int main(int argc, char *argv[]) NSOpenSSL::openssl_free(publicKey); NSOpenSSL::openssl_free(privateKey); - std::string sMessage = "Hello world"; + const std::string sMessage = "Hello world"; unsigned char* message_crypt = NULL; unsigned int message_crypt_len = 0; - bool bEncrypt = NSOpenSSL::RSA_EncryptPublic((unsigned char*)sPublic.c_str(), (unsigned char*)sMessage.c_str(), (unsigned int)sMessage.length(), message_crypt, message_crypt_len); - bEncrypt; + bool bEncrypt = NSOpenSSL::RSA_EncryptPublic((unsigned char*)sPublic.c_str(), (const unsigned char*)sMessage.c_str(), (unsigned int)sMessage.length(), message_crypt, message_crypt_len); unsigned char* message_decrypt = NULL; unsigned int message_decrypt_len = 0; bool bDecrypt = NSOpenSSL::RSA_DecryptPrivate((unsigned char*)sPrivate.c_str(), message_crypt, message_crypt_len, message_decrypt, message_decrypt_len); - bDecrypt; std::string sMessageOut((char*)message_decrypt, message_decrypt_len); NSOpenSSL::openssl_free(message_crypt); NSOpenSSL::openssl_free(message_decrypt); + + CHECK( sMessageOut == sMessage ); } - if (true) + TEST_CASE( "AES" ) { - std::string password = "{PASSWORD}"; - std::string message = "{MESSAGE}"; + const std::string password = "{PASSWORD}"; + const std::string message = "{MESSAGE}"; std::string message_crypted = ""; std::string message_decrypted = ""; NSOpenSSL::AES_Encrypt_desktop(password, message, message_crypted); NSOpenSSL::AES_Decrypt_desktop(password, message_crypted, message_decrypted); - message; + CHECK( message_decrypted == message ); } - - return 0; } diff --git a/Common/Network/CMakeLists.txt b/Common/Network/CMakeLists.txt index 899e7f274c..7709343618 100644 --- a/Common/Network/CMakeLists.txt +++ b/Common/Network/CMakeLists.txt @@ -114,8 +114,8 @@ target_include_directories(kernel_network PRIVATE ) target_link_libraries(kernel_network PRIVATE - ${OPENSSL_INSTALL_DIR_ABS}/lib/libssl.a - ${OPENSSL_INSTALL_DIR_ABS}/lib/libcrypto.a + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libssl.a + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libcrypto.a ) target_link_libraries(kernel_network PUBLIC diff --git a/DesktopEditor/doctrenderer/CMakeLists.txt b/DesktopEditor/doctrenderer/CMakeLists.txt index 6cee7fd322..473f8c0c6d 100644 --- a/DesktopEditor/doctrenderer/CMakeLists.txt +++ b/DesktopEditor/doctrenderer/CMakeLists.txt @@ -292,8 +292,8 @@ if(APPLE) endif() target_link_libraries(doctrenderer PRIVATE - ${OPENSSL_INSTALL_DIR_ABS}/lib/libssl.a - ${OPENSSL_INSTALL_DIR_ABS}/lib/libcrypto.a + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libssl.a + ${OPENSSL_INSTALL_DIR_ABS}/lib64/libcrypto.a ) target_link_libraries(doctrenderer PUBLIC diff --git a/DesktopEditor/fontengine/js/CMakeLists.txt b/DesktopEditor/fontengine/js/CMakeLists.txt index eb723f0db4..84699dff09 100644 --- a/DesktopEditor/fontengine/js/CMakeLists.txt +++ b/DesktopEditor/fontengine/js/CMakeLists.txt @@ -43,7 +43,9 @@ set(SOURCES ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/bit_reader.c ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/decode.c ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/huffman.c + ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/prefix.c ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/state.c + ${EO_CORE_3RD_PARTY_WORK_DIR}/brotli/c/dec/static_init.c ${DESKTOP_ROOT}/freetype-2.10.4/src/base/ftdebug.c ${DESKTOP_ROOT}/freetype-2.10.4/src/autofit/autofit.c diff --git a/DesktopEditor/graphics/cmake/CMakeLists.txt b/DesktopEditor/graphics/cmake/CMakeLists.txt index c90f24fa65..42d68034fa 100644 --- a/DesktopEditor/graphics/cmake/CMakeLists.txt +++ b/DesktopEditor/graphics/cmake/CMakeLists.txt @@ -995,9 +995,9 @@ add_library(graphics SHARED ${BROTLI_INSTALL_DIR}/c/dec/bit_reader.c ${BROTLI_INSTALL_DIR}/c/dec/decode.c ${BROTLI_INSTALL_DIR}/c/dec/huffman.c - # ${BROTLI_INSTALL_DIR}/c/dec/prefix.c + ${BROTLI_INSTALL_DIR}/c/dec/prefix.c ${BROTLI_INSTALL_DIR}/c/dec/state.c - # ${BROTLI_INSTALL_DIR}/c/dec/static_init.c + ${BROTLI_INSTALL_DIR}/c/dec/static_init.c ) set_default_options(graphics) diff --git a/DesktopEditor/graphics/pro/js/CMakeLists.txt b/DesktopEditor/graphics/pro/js/CMakeLists.txt index 777be06aa4..3d94a33768 100644 --- a/DesktopEditor/graphics/pro/js/CMakeLists.txt +++ b/DesktopEditor/graphics/pro/js/CMakeLists.txt @@ -27,19 +27,15 @@ add_custom_command( COMMAND bash ${CORE_ROOT}/Common/3dParty/icu/nc-build.sh "${EO_CORE_3RD_PARTY_WORK_DIR}/icu" "${EO_CORE_3RD_PARTY_INSTALL_DIR}/icu" - 74 2 1 + 74 2 COMMAND bash ${CORE_ROOT}/Common/3dParty/openssl/nc-build.sh "${EO_CORE_3RD_PARTY_WORK_DIR}/openssl" "${EO_CORE_3RD_PARTY_INSTALL_DIR}/openssl" - 1 COMMAND git -C ${EO_CORE_3RD_PARTY_WORK_DIR}/icu/icu apply ${CMAKE_CURRENT_SOURCE_DIR}/wasm/patches/fix-wasm-icu.patch - COMMAND git -C ${EO_CORE_3RD_PARTY_WORK_DIR}/openssl apply - ${CMAKE_CURRENT_SOURCE_DIR}/wasm/patches/fix-wasm-openssl.patch - COMMAND ${CMAKE_COMMAND} -E touch ${PATCH_STAMP} ) @@ -949,7 +945,7 @@ _ARM_ALIGN_ _tcsnicmp=strncmp _lseek=lseek _getcwd=getcwd NO_CONSOLE_IO USE_EXTERNAL_JPEG2000 USE_JPIP OPJ_STATIC FONT_ENGINE_DISABLE_FILESYSTEM IMAGE_CHECKER_DISABLE_XML -USE_OPENSSL_HASH DISABLE_FULL_DOCUMENT_CREATION DISABLE_FILESYSTEM +DISABLE_FULL_DOCUMENT_CREATION DISABLE_FILESYSTEM CRYPTOPP_DISABLE_ASM DISABLE_TYPE_MISMATCH ) diff --git a/DesktopEditor/graphics/pro/js/wasm/patches/fix-wasm-openssl.patch b/DesktopEditor/graphics/pro/js/wasm/patches/fix-wasm-openssl.patch index 616ed49619..24c8d53d1a 100644 --- a/DesktopEditor/graphics/pro/js/wasm/patches/fix-wasm-openssl.patch +++ b/DesktopEditor/graphics/pro/js/wasm/patches/fix-wasm-openssl.patch @@ -1,31 +1,31 @@ diff --git a/crypto/sha/sha512.c b/crypto/sha/sha512.c -index ca1f387a..099e80a5 100644 +index 4c3a3b6..f1a44f5 100644 --- a/crypto/sha/sha512.c +++ b/crypto/sha/sha512.c -@@ -501,7 +501,7 @@ static SHA_LONG64 __fastcall __pull64be(const void *x) +@@ -583,7 +583,7 @@ static SHA_LONG64 __fastcall __pull64be(const void *x) { static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, - size_t num) + size_t num) { - const SHA_LONG64 *W = in; -+ const SHA_LONG64 *W = (const SHA_LONG64*)in; ++ const SHA_LONG64 *W = (const SHA_LONG64 *)in; SHA_LONG64 A, E, T; SHA_LONG64 X[9 + 80], *F; int i; -@@ -563,7 +563,7 @@ static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, +@@ -645,7 +645,7 @@ static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, - size_t num) + size_t num) { - const SHA_LONG64 *W = in; -+ const SHA_LONG64 *W = (const SHA_LONG64*)in; ++ const SHA_LONG64 *W = (const SHA_LONG64 *)in; SHA_LONG64 a, b, c, d, e, f, g, h, s0, s1, T1, T2; SHA_LONG64 X[16]; int i; -@@ -644,7 +644,7 @@ static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, - static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, - size_t num) +@@ -737,7 +737,7 @@ static void sha512_block_data_order(SHA512_CTX *ctx, const void *in, + size_t num) + #endif { - const SHA_LONG64 *W = in; -+ const SHA_LONG64 *W = (const SHA_LONG64*)in; ++ const SHA_LONG64 *W = (const SHA_LONG64 *)in; SHA_LONG64 a, b, c, d, e, f, g, h, s0, s1, T1; SHA_LONG64 X[16]; int i; diff --git a/common.cmake b/common.cmake index 2d46bd303e..a213ebf165 100644 --- a/common.cmake +++ b/common.cmake @@ -135,7 +135,24 @@ endfunction() function(copy_icu_libs artifact) add_custom_command(TARGET ${artifact} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${EO_CORE_OUTPUT_DIR}" - COMMAND /bin/sh -c "cp -P --update=none \"${EO_CORE_3RD_PARTY_INSTALL_DIR}/icu/lib\"/*.so* \"${EO_CORE_OUTPUT_DIR}/\"" + COMMAND /bin/sh -c "cp -P \"${EO_CORE_3RD_PARTY_INSTALL_DIR}/icu/lib\"/*.so* \"${EO_CORE_OUTPUT_DIR}/\"" COMMENT "Copying ICU libs to ${EO_CORE_OUTPUT_DIR}" ) -endfunction() \ No newline at end of file +endfunction() + +include(FetchContent) +FetchContent_Declare( + doctest + GIT_REPOSITORY https://github.com/doctest/doctest.git + GIT_TAG v2.4.11 +) +FetchContent_MakeAvailable(doctest) + +enable_testing() + +set_property(GLOBAL PROPERTY TEST_TARGETS "") + +# Helper function to add test targets +function(register_test_target tgt) + set_property(GLOBAL APPEND PROPERTY TEST_TARGETS ${tgt}) +endfunction()