CMakeLists.txt 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. cmake_minimum_required(VERSION 3.6)
  2. project(GmSSL)
  3. SET(CMAKE_PROJECT_HOMEPAGE_URL "http://gmssl.org")
  4. set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
  5. set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
  6. SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  7. include_directories(include)
  8. set(src
  9. src/version.c
  10. src/debug.c
  11. src/sm4_common.c
  12. src/sm4_enc.c
  13. src/sm4_modes.c
  14. src/sm4_setkey.c
  15. src/sm3.c
  16. src/sm3_hmac.c
  17. src/sm3_kdf.c
  18. src/sm2_alg.c
  19. src/sm2_key.c
  20. src/sm2_lib.c
  21. src/sm9_alg.c
  22. src/sm9_key.c
  23. src/sm9_lib.c
  24. src/zuc.c
  25. src/zuc_modes.c
  26. src/aes.c
  27. src/aes_modes.c
  28. src/sha256.c
  29. src/sha512.c
  30. src/chacha20.c
  31. src/hash_drbg.c
  32. src/block_cipher.c
  33. src/digest.c
  34. src/hmac.c
  35. src/hkdf.c
  36. src/pbkdf2.c
  37. src/gf128.c
  38. src/gcm.c
  39. src/aead.c
  40. src/pkcs8.c
  41. src/ec.c
  42. src/rsa.c
  43. src/asn1.c
  44. src/hex.c
  45. src/base64.c
  46. src/pem.c
  47. src/x509_alg.c
  48. src/x509_cer.c
  49. src/x509_ext.c
  50. src/x509_req.c
  51. src/x509_crl.c
  52. src/x509_new.c
  53. src/cms.c
  54. src/sdf/sdf.c
  55. src/sdf/sdf_lib.c
  56. src/sdf/sdf_meth.c
  57. src/sdf/sdf_ext.c
  58. src/sdf/sdf_sansec.c
  59. src/skf/skf.c
  60. src/skf/skf_lib.c
  61. src/skf/skf_meth.c
  62. src/skf/skf_ext.c
  63. src/skf/skf_prn.c
  64. src/skf/skf_wisec.c
  65. src/socket.c
  66. src/tls.c
  67. src/tls_ext.c
  68. src/tls_trace.c
  69. src/tlcp.c
  70. src/tls12.c
  71. src/tls13.c
  72. src/file.c
  73. )
  74. set(tools
  75. tools/gmssl.c
  76. tools/version.c
  77. tools/sm4.c
  78. tools/sm3.c
  79. tools/sm3hmac.c
  80. tools/sm2keygen.c
  81. tools/sm2sign.c
  82. tools/sm2verify.c
  83. tools/sm2encrypt.c
  84. tools/sm2decrypt.c
  85. tools/sm9setup.c
  86. tools/sm9keygen.c
  87. tools/sm9sign.c
  88. tools/sm9verify.c
  89. tools/sm9encrypt.c
  90. tools/sm9decrypt.c
  91. tools/zuc.c
  92. tools/rand.c
  93. tools/pbkdf2.c
  94. tools/certgen.c
  95. tools/certparse.c
  96. tools/certverify.c
  97. tools/certrevoke.c
  98. tools/reqgen.c
  99. tools/reqparse.c
  100. tools/reqsign.c
  101. tools/crlgen.c
  102. tools/crlget.c
  103. tools/crlparse.c
  104. tools/crlverify.c
  105. tools/cmssign.c
  106. tools/cmsverify.c
  107. tools/cmsencrypt.c
  108. tools/cmsdecrypt.c
  109. tools/cmsparse.c
  110. tools/sdfutil.c
  111. tools/skfutil.c
  112. tools/tlcp_client.c
  113. tools/tlcp_server.c
  114. tools/tls12_client.c
  115. tools/tls12_server.c
  116. tools/tls13_client.c
  117. tools/tls13_server.c
  118. )
  119. set(tests
  120. sm4
  121. sm3
  122. sm2
  123. sm9
  124. zuc
  125. aes
  126. sha224
  127. sha256
  128. sha384
  129. sha512
  130. chacha20
  131. hash_drbg
  132. block_cipher
  133. digest
  134. hmac
  135. hkdf
  136. pbkdf2
  137. gf128
  138. gcm
  139. aead
  140. pkcs8
  141. ec
  142. asn1
  143. hex
  144. base64
  145. pem
  146. x509
  147. x509_oid
  148. x509_alg
  149. x509_str
  150. x509_ext
  151. x509_req
  152. x509_crl
  153. cms
  154. tls
  155. tls13
  156. )
  157. set(demos
  158. demo_sm2_encrypt
  159. demo_sm2_keygen
  160. demo_sm2_keyparse
  161. demo_sm2_private_key
  162. demo_sm2_private_key_parse
  163. demo_sm2_public_key
  164. demo_sm2_sign
  165. demo_sm2_sign_ctx
  166. demo_sm3
  167. demo_sm3_hmac
  168. demo_sm3_kdf
  169. demo_sm4
  170. demo_sm4_cbc
  171. demo_sm4_cbc_decrypt_update
  172. demo_sm4_cbc_encrypt_update
  173. demo_sm4_cbc_padding
  174. demo_sm4_ctr
  175. demo_sm4_ctr_encrypt_update
  176. demo_sm4_gcm
  177. demo_sm9_encrypt
  178. demo_sm9_keygen
  179. demo_sm9_sign
  180. # demo_tlcp_get
  181. # demo_tlcp_post
  182. # demo_wget
  183. demo_zuc
  184. )
  185. # when an option has been enabled, `cmake ..` will not refresh the value
  186. # use `cmake .. -DENABLE_XXX=OFF` to disable the option
  187. option(ENABLE_SM2_ALGOR_ID_ENCODE_NULL "Enable AlgorithmIdenifier with algorithm sm2sign_with_sm3 encode a NULL object as parameters" OFF)
  188. if (ENABLE_SM2_ALGOR_ID_ENCODE_NULL)
  189. message(STATUS "ENABLE_SM2_ALGOR_ID_ENCODE_NULL")
  190. add_definitions(-DSM2_ALGOR_ID_ENCODE_NULL)
  191. endif()
  192. option(ENABLE_SM2_PRIVATE_KEY_EXPORT "Enable export un-encrypted SM2 private key" OFF)
  193. if (ENABLE_SM2_PRIVATE_KEY_EXPORT)
  194. message(STATUS "ENABLE_SM2_PRIVATE_KEY_EXPORT")
  195. add_definitions(-DSM2_PRIVATE_KEY_EXPORT)
  196. list(APPEND demos demo_sm2_key_export)
  197. endif()
  198. option(ENABLE_TLS_DEBUG "Enable TLS and TLCP print debug message" OFF)
  199. if (ENABLE_TLS_DEBUG)
  200. message(STATUS "ENABLE_TLS_DEBUG")
  201. add_definitions(-DTLS_DEBUG)
  202. endif()
  203. option(ENABLE_SM3_AVX_BMI2 "Enable SM3 AVX+BMI2 assembly implementation" OFF)
  204. if (ENABLE_SM3_AVX_BMI2)
  205. message(STATUS "ENABLE_SM3_AVX_BMI2")
  206. add_definitions(-DSM3_AVX_BMI2)
  207. enable_language(ASM)
  208. list(APPEND src src/sm3_avx_bmi2.s)
  209. endif()
  210. option(ENABLE_SM4_AESNI_AVX "Enable SM4 AESNI+AVX assembly implementation" OFF)
  211. if (ENABLE_SM4_AESNI_AVX)
  212. message(STATUS "ENABLE_SM4_AESNI_AVX")
  213. add_definitions(-DSM4_AESNI_AVX)
  214. list(APPEND src src/sm4_aesni_avx.c)
  215. list(APPEND tests sm4_aesni_avx)
  216. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
  217. endif()
  218. option(ENABLE_SM2_EXTS "Enable SM2 Extensions" OFF)
  219. if (ENABLE_SM2_EXTS)
  220. message(STATUS "ENABLE_SM4_AESNI_AVX")
  221. list(APPEND src
  222. src/sm2_key_share.c
  223. src/sm2_recover.c
  224. src/sm2_blind.c
  225. src/sm2_ring.c
  226. src/sm2_elgamal.c
  227. src/sm2_commit.c)
  228. list(APPEND tests sm2_key_share sm2_blind sm2_ring sm2_elgamal sm2_commit)
  229. endif()
  230. option(ENABLE_BROKEN_CRYPTO "Enable broken crypto algorithms" OFF)
  231. if (ENABLE_BROKEN_CRYPTO)
  232. message(STATUS "ENABLE_BROKEN_CRYPTO")
  233. list(APPEND src src/des.c src/sha1.c src/md5.c src/rc4.c)
  234. list(APPEND tests des sha1 md5 rc4)
  235. endif()
  236. option(ENABLE_RDRND "Enable Intel RDRND instructions" OFF)
  237. if (${CMAKE_SYSTEM_PROCESSOR} MATCHES x86_64)
  238. set(ENABLE_RDRND ON)
  239. endif()
  240. if (ENABLE_RDRND)
  241. message(STATUS "ENABLE_RDRND")
  242. list(APPEND src src/rdrand.c)
  243. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mrdrnd -mrdseed")
  244. endif()
  245. option(ENABLE_GMT_0105_RNG "Enable GM/T 0105 Software RNG" OFF)
  246. if (ENABLE_GMT_0105_RNG)
  247. message(STATUS "ENABLE_GMT_0105_RNG")
  248. list(APPEND src src/sm3_rng.c src/sm4_cbc_mac.c src/sm4_rng.c)
  249. list(APPEND tests sm3_rng sm4_cbc_mac sm4_rng)
  250. endif()
  251. if (WIN32)
  252. list(APPEND src src/rand_win.c src/http_win.c)
  253. elseif (APPLE)
  254. list(APPEND src src/rand_apple.c src/http.c)
  255. elseif (ANDROID)
  256. list(APPEND src src/rand.c src/http.c)
  257. else()
  258. list(APPEND src src/rand_unix.c src/http.c)
  259. endif()
  260. option(ENABLE_HTTP_TESTS "Enable HTTP GET/POST related tests" OFF)
  261. if (ENABLE_HTTP_TESTS)
  262. message(STATUS "ENABLE_HTTP_TESTS")
  263. list(APPEND tests http http_crl)
  264. endif()
  265. option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
  266. if (CMAKE_C_COMPILER_ID MATCHES "MSVC")
  267. message(STATUS "CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS")
  268. set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # set before add_library
  269. endif()
  270. add_library(gmssl ${src})
  271. if (WIN32)
  272. target_link_libraries(gmssl -lws2_32)
  273. elseif (APPLE)
  274. target_link_libraries(gmssl dl)
  275. target_link_libraries(gmssl "-framework Security")
  276. #target_link_libraries(gmssl "-framework CoreFoundation") # rand_apple.c CFRelease()
  277. elseif (MINGW)
  278. target_link_libraries(gmssl PRIVATE wsock32)
  279. else()
  280. target_link_libraries(gmssl dl)
  281. endif()
  282. SET_TARGET_PROPERTIES(gmssl PROPERTIES VERSION 3.0 SOVERSION 3)
  283. install(TARGETS gmssl ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin)
  284. install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/gmssl DESTINATION include)
  285. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
  286. add_library(sdf_dummy SHARED src/sdf/sdf_dummy.c)
  287. set_target_properties(sdf_dummy PROPERTIES VERSION 3.0 SOVERSION 3)
  288. add_library(skf_dummy SHARED src/skf/skf_dummy.c)
  289. set_target_properties(skf_dummy PROPERTIES VERSION 3.0 SOVERSION 3)
  290. add_executable(gmssl-bin ${tools})
  291. target_link_libraries(gmssl-bin LINK_PUBLIC gmssl)
  292. set_target_properties(gmssl-bin PROPERTIES RUNTIME_OUTPUT_NAME gmssl)
  293. if (MINGW)
  294. target_link_libraries(gmssl-bin PRIVATE Ws2_32)
  295. endif()
  296. enable_testing()
  297. foreach(name ${tests})
  298. add_test(NAME ${name} COMMAND ${name}test)
  299. add_executable(${name}test tests/${name}test.c)
  300. target_link_libraries (${name}test LINK_PUBLIC gmssl)
  301. endforeach()
  302. foreach(name ${demos})
  303. add_executable(${name} demos/src/${name}.c)
  304. target_link_libraries(${name} LINK_PUBLIC gmssl)
  305. endforeach()
  306. install(TARGETS gmssl-bin RUNTIME DESTINATION bin)
  307. endif()
  308. if (CMAKE_C_COMPILER_ID MATCHES "MSVC")
  309. set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT gmssl-bin)
  310. set(CMAKE_INSTALL_PREFIX "C:/Program Files/GmSSL") # change by `cmake -DCMAKE_INSTALL_PREFIX=C:\path\to\install`
  311. # run `set path=%path%;C:\Program Files\GmSSL\bin`
  312. add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
  313. # target_compile_options(gmssl PRIVATE /wd4996)
  314. # target_compile_options(gmssl-bin PRIVATE /wd4996)
  315. endif()
  316. if (UNIX)
  317. # packaging
  318. include(LinuxPacking)
  319. include(DebPacking)
  320. include(RpmPacking)
  321. include(CPack)
  322. endif (UNIX)