CMakeLists.txt 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. find_package(GTest)
  2. if(GTest_FOUND)
  3. if(NOT TARGET GTest::gtest_main AND TARGET GTest::Main)
  4. # CMake <3.20
  5. add_library(GTest::gtest_main INTERFACE IMPORTED)
  6. target_link_libraries(GTest::gtest_main INTERFACE GTest::Main)
  7. endif()
  8. else()
  9. if(POLICY CMP0135)
  10. cmake_policy(SET CMP0135 NEW)
  11. endif()
  12. include(FetchContent)
  13. set(BUILD_GMOCK OFF)
  14. set(INSTALL_GTEST OFF)
  15. set(gtest_force_shared_crt ON)
  16. FetchContent_Declare(
  17. gtest
  18. URL https://github.com/google/googletest/archive/main.tar.gz
  19. )
  20. FetchContent_MakeAvailable(gtest)
  21. endif()
  22. find_package(CURL REQUIRED)
  23. add_executable(httplib-test test.cc include_httplib.cc $<$<BOOL:${WIN32}>:include_windows_h.cc>)
  24. target_compile_options(httplib-test PRIVATE "$<$<CXX_COMPILER_ID:MSVC>:/utf-8;/bigobj>")
  25. target_link_libraries(httplib-test PRIVATE httplib GTest::gtest_main CURL::libcurl)
  26. gtest_discover_tests(httplib-test)
  27. # It overrides the heartbeat macros, which a compiled library has fixed
  28. if(NOT HTTPLIB_COMPILE)
  29. add_executable(httplib-heartbeat-test test_websocket_heartbeat.cc)
  30. target_compile_options(httplib-heartbeat-test PRIVATE "$<$<CXX_COMPILER_ID:MSVC>:/utf-8;/bigobj>")
  31. target_link_libraries(httplib-heartbeat-test PRIVATE httplib GTest::gtest_main)
  32. gtest_discover_tests(httplib-heartbeat-test)
  33. endif()
  34. file(
  35. COPY www www2 www3 ca-bundle.crt image.jpg
  36. DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
  37. )
  38. if(HTTPLIB_IS_USING_OPENSSL)
  39. if (OPENSSL_VERSION VERSION_LESS "3.2.0")
  40. set(OPENSSL_X509_FLAG "-x509")
  41. else()
  42. set(OPENSSL_X509_FLAG "-x509v1")
  43. endif()
  44. find_program(OPENSSL_COMMAND
  45. NAMES openssl
  46. PATHS ${OPENSSL_INCLUDE_DIR}/../bin
  47. REQUIRED
  48. )
  49. execute_process(
  50. COMMAND ${OPENSSL_COMMAND} genrsa 2048
  51. OUTPUT_FILE key.pem
  52. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  53. COMMAND_ERROR_IS_FATAL ANY
  54. )
  55. execute_process(
  56. COMMAND ${OPENSSL_COMMAND} req -new -batch -config ${CMAKE_CURRENT_LIST_DIR}/test.conf -key key.pem
  57. COMMAND ${OPENSSL_COMMAND} x509 -days 3650 -req -signkey key.pem
  58. OUTPUT_FILE cert.pem
  59. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  60. COMMAND_ERROR_IS_FATAL ANY
  61. )
  62. execute_process(
  63. COMMAND ${OPENSSL_COMMAND} req ${OPENSSL_X509_FLAG} -new -config ${CMAKE_CURRENT_LIST_DIR}/test.conf -key key.pem -sha256 -days 3650 -nodes -out cert2.pem -extensions SAN
  64. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  65. COMMAND_ERROR_IS_FATAL ANY
  66. )
  67. execute_process(
  68. COMMAND ${OPENSSL_COMMAND} genrsa 2048
  69. OUTPUT_FILE rootCA.key.pem
  70. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  71. COMMAND_ERROR_IS_FATAL ANY
  72. )
  73. execute_process(
  74. COMMAND ${OPENSSL_COMMAND} req ${OPENSSL_X509_FLAG} -new -batch -config ${CMAKE_CURRENT_LIST_DIR}/test.rootCA.conf -key rootCA.key.pem -days 1024
  75. OUTPUT_FILE rootCA.cert.pem
  76. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  77. COMMAND_ERROR_IS_FATAL ANY
  78. )
  79. execute_process(
  80. COMMAND ${OPENSSL_COMMAND} genrsa 2048
  81. OUTPUT_FILE client.key.pem
  82. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  83. COMMAND_ERROR_IS_FATAL ANY
  84. )
  85. execute_process(
  86. COMMAND ${OPENSSL_COMMAND} req -new -batch -config ${CMAKE_CURRENT_LIST_DIR}/test.conf -key client.key.pem
  87. COMMAND ${OPENSSL_COMMAND} x509 -days 370 -req -CA rootCA.cert.pem -CAkey rootCA.key.pem -CAcreateserial
  88. OUTPUT_FILE client.cert.pem
  89. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  90. COMMAND_ERROR_IS_FATAL ANY
  91. )
  92. execute_process(
  93. COMMAND ${OPENSSL_COMMAND} genrsa -passout pass:test123! 2048
  94. OUTPUT_FILE key_encrypted.pem
  95. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  96. COMMAND_ERROR_IS_FATAL ANY
  97. )
  98. execute_process(
  99. COMMAND ${OPENSSL_COMMAND} req -new -batch -config ${CMAKE_CURRENT_LIST_DIR}/test.conf -key key_encrypted.pem
  100. COMMAND ${OPENSSL_COMMAND} x509 -days 3650 -req -signkey key_encrypted.pem
  101. OUTPUT_FILE cert_encrypted.pem
  102. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  103. COMMAND_ERROR_IS_FATAL ANY
  104. )
  105. # Encrypted client key: make an unencrypted key + cert first, then wrap the
  106. # same key two ways. Mbed TLS 4.x dropped DES/PBES1, while Ubuntu's Mbed TLS
  107. # 2.28 has no PBES2-AES, so ship both and let test.cc pick by version.
  108. execute_process(
  109. COMMAND ${OPENSSL_COMMAND} genrsa -out client_encrypted.tmp.key.pem 2048
  110. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  111. COMMAND_ERROR_IS_FATAL ANY
  112. )
  113. execute_process(
  114. COMMAND ${OPENSSL_COMMAND} req -new -batch -config ${CMAKE_CURRENT_LIST_DIR}/test.conf -key client_encrypted.tmp.key.pem
  115. COMMAND ${OPENSSL_COMMAND} x509 -days 370 -req -CA rootCA.cert.pem -CAkey rootCA.key.pem -CAcreateserial
  116. OUTPUT_FILE client_encrypted.cert.pem
  117. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  118. COMMAND_ERROR_IS_FATAL ANY
  119. )
  120. execute_process(
  121. COMMAND ${OPENSSL_COMMAND} pkcs8 -topk8 -v2 aes-256-cbc -in client_encrypted.tmp.key.pem -passout pass:test012! -out client_encrypted.key.pem
  122. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  123. COMMAND_ERROR_IS_FATAL ANY
  124. )
  125. execute_process(
  126. COMMAND ${OPENSSL_COMMAND} pkcs8 -topk8 -v1 PBE-SHA1-3DES -in client_encrypted.tmp.key.pem -passout pass:test012! -out client_encrypted_pbes1.key.pem
  127. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  128. COMMAND_ERROR_IS_FATAL ANY
  129. )
  130. file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/client_encrypted.tmp.key.pem)
  131. # Certificates for IP-host hostname verification regression tests.
  132. # cert_ip_cn.pem: CN is an IPv4 literal with NO subjectAltName. An IP host
  133. # must NOT be authenticated via the CN, so verifying it
  134. # against this cert must fail.
  135. execute_process(
  136. COMMAND ${OPENSSL_COMMAND} req -x509 -key key.pem -sha256 -days 3650 -nodes -subj /CN=127.0.0.1 -out cert_ip_cn.pem
  137. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  138. COMMAND_ERROR_IS_FATAL ANY
  139. )
  140. # cert_ipv6.pem: CN is an IPv6 literal plus an IPv6 iPAddress SAN for a
  141. # different address. The SAN address must match; the CN
  142. # address must be ignored.
  143. execute_process(
  144. COMMAND ${OPENSSL_COMMAND} req -x509 -key key.pem -sha256 -days 3650 -nodes -subj /CN=::1 -addext subjectAltName=IP:2001:db8::1 -out cert_ipv6.pem
  145. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  146. COMMAND_ERROR_IS_FATAL ANY
  147. )
  148. # cert_san_types.pem: the bytes of each SAN read as the other type:
  149. # DNS:a.zz is 97.46.122.122, IP:42.46.122.122 is "*.zz".
  150. execute_process(
  151. COMMAND ${OPENSSL_COMMAND} req -x509 -key key.pem -sha256 -days 3650 -nodes -subj /CN=san-types -addext subjectAltName=DNS:a.zz,IP:42.46.122.122 -out cert_san_types.pem
  152. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  153. COMMAND_ERROR_IS_FATAL ANY
  154. )
  155. # cert_wildcard_san.pem: a leftmost wildcard next to one that is not
  156. # leftmost. "*.leftmost.example.test" matches a single
  157. # label; the wildcard in "www.*.example.test" must not be
  158. # honoured.
  159. execute_process(
  160. COMMAND ${OPENSSL_COMMAND} req -x509 -key key.pem -sha256 -days 3650 -nodes -subj /CN=wildcard-san -addext subjectAltName=DNS:*.leftmost.example.test,DNS:www.*.example.test -out cert_wildcard_san.pem
  161. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  162. COMMAND_ERROR_IS_FATAL ANY
  163. )
  164. endif()
  165. add_subdirectory(fuzzing)