]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - CMakeLists.txt
Merge pull request #117 from vt-alt/asan
[openssl-gost/engine.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
2 project(gost-engine LANGUAGES C)
3
4 include(GNUInstallDirs)
5
6 enable_testing()
7
8 find_package(OpenSSL 1.1.1 REQUIRED)
9 include_directories(${OPENSSL_INCLUDE_DIR})
10
11 if (CMAKE_C_COMPILER_ID MATCHES "Clang")
12  add_compile_options(-Qunused-arguments)
13 elseif(CMAKE_C_COMPILER_ID MATCHES "GNU")
14  add_compile_options(-O2 -Werror -Wall -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -ggdb)
15 elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
16  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
17  add_definitions(-D_CRT_DEPRECATED_NO_WARNINGS)
18  add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
19  add_compile_options(/MP /WX /W4 /wd4100 /wd4267 /wd4206 /wd4706 /wd4244 /wd4115)
20 endif()
21
22 if (ASAN)
23   message(STATUS "address sanitizer enabled")
24   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -g3 -fno-omit-frame-pointer")
25 endif()
26
27 set(CMAKE_C_STANDARD 90)
28
29 include (TestBigEndian)
30 TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
31 if(IS_BIG_ENDIAN)
32  message(STATUS "BIG_ENDIAN")
33 else()
34  message(STATUS "LITTLE_ENDIAN")
35  add_definitions(-DL_ENDIAN)
36 endif()
37
38 set(BIN_DIRECTORY bin)
39
40 set(OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${BIN_DIRECTORY})
41
42 #set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
43 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
44 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
45
46 # Remove when https://gitlab.kitware.com/cmake/cmake/issues/18525 is addressed
47 set(OPENSSL_ENGINES_DIR "" CACHE PATH "OpenSSL Engines Directory")
48 if ("${OPENSSL_ENGINES_DIR}" STREQUAL "")
49         include(FindPkgConfig)
50         pkg_get_variable(OPENSSL_ENGINES_DIR libcrypto enginesdir)
51         if ("${OPENSSL_ENGINES_DIR}" STREQUAL "")
52                 message( FATAL_ERROR "Unable to discover the OpenSSL engines directory. Provide the path using -DOPENSSL_ENGINES_DIR" )
53         endif()
54 endif()
55
56 set(GOST_89_SOURCE_FILES
57         gost89.c
58         gost89.h
59         )
60
61 set(GOST_HASH_SOURCE_FILES
62         gosthash.c
63         gosthash.h
64         )
65
66 set(GOST_HASH_2012_SOURCE_FILES
67         gosthash2012.c
68         gosthash2012.h
69         gosthash2012_const.h
70         gosthash2012_precalc.h
71         gosthash2012_ref.h
72         gosthash2012_sse2.h
73         )
74
75 set(GOST_GRASSHOPPER_SOURCE_FILES
76         gost_grasshopper.h
77         gost_grasshopper_core.h
78         gost_grasshopper_core.c
79         gost_grasshopper_defines.h
80         gost_grasshopper_defines.c
81         gost_grasshopper_math.h
82         gost_grasshopper_galois_precompiled.c
83         gost_grasshopper_precompiled.c
84         gost_grasshopper_cipher.h
85         gost_grasshopper_cipher.c
86         )
87
88 set(GOST_CORE_SOURCE_FILES
89         e_gost_err.c
90         e_gost_err.h
91         gost_asn1.c
92         gost_crypt.c
93         gost_ctl.c
94         gost_eng.c
95         gost_keywrap.c
96         gost_keywrap.h
97         gost_lcl.h
98         gost_params.c
99         gost_keyexpimp.c
100         )
101
102 set(GOST_EC_SOURCE_FILES
103         gost_ec_keyx.c
104         gost_ec_sign.c
105         )
106
107 set (GOST_OMAC_SOURCE_FILES
108         gost_omac.c
109         gost_omac_acpkm.c
110         )
111
112 set(GOST_LIB_SOURCE_FILES
113         ${GOST_89_SOURCE_FILES}
114         ${GOST_HASH_SOURCE_FILES}
115         ${GOST_HASH_2012_SOURCE_FILES}
116         ${GOST_GRASSHOPPER_SOURCE_FILES}
117         ${GOST_EC_SOURCE_FILES}
118         ${GOST_OMAC_SOURCE_FILES}
119         )
120
121 set(GOST_ENGINE_SOURCE_FILES
122         ${GOST_CORE_SOURCE_FILES}
123         gost_ameth.c
124         gost_md.c
125         gost_md2012.c
126         gost_pmeth.c
127         gost_omac.c
128         gost_omac_acpkm.c
129         )
130
131 add_executable(test_curves test_curves.c)
132 target_link_libraries(test_curves gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
133 add_test(NAME curves
134         COMMAND test_curves)
135
136 add_executable(test_params test_params.c)
137 target_link_libraries(test_params gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
138 add_test(NAME parameters
139         COMMAND test_params)
140
141 add_executable(test_sign test_sign.c)
142 target_link_libraries(test_sign gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
143 add_test(NAME sign/verify
144         COMMAND test_sign)
145
146 add_executable(test_context test_context.c)
147 target_link_libraries(test_context gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
148 add_test(NAME context
149         COMMAND test_context)
150
151 add_executable(test_grasshopper test_grasshopper.c)
152 target_link_libraries(test_grasshopper gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
153 add_test(NAME grasshopper
154         COMMAND test_grasshopper)
155
156 add_executable(test_keyexpimp test_keyexpimp.c)
157 #target_compile_definitions(test_keyexpimp PUBLIC -DOPENSSL_LOAD_CONF)
158 target_link_libraries(test_keyexpimp gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
159 add_test(NAME keyexpimp
160         COMMAND test_keyexpimp)
161
162 add_executable(test_gost89 test_gost89.c)
163 target_link_libraries(test_gost89 gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
164 add_test(NAME gost89
165         COMMAND test_gost89)
166
167 if(NOT ASAN)
168 add_test(NAME engine
169         COMMAND perl run_tests
170         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test)
171 set_tests_properties(engine PROPERTIES ENVIRONMENT
172         "OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR};OPENSSL_ENGINES=${OUTPUT_DIRECTORY}")
173 endif()
174
175 add_executable(sign benchmark/sign.c)
176 target_link_libraries(sign gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
177
178 add_library(gost_core STATIC ${GOST_LIB_SOURCE_FILES})
179 set_target_properties(gost_core PROPERTIES POSITION_INDEPENDENT_CODE ON)
180
181 add_library(gost_engine MODULE ${GOST_ENGINE_SOURCE_FILES})
182 set_target_properties(gost_engine PROPERTIES PREFIX "" OUTPUT_NAME "gost")
183 target_link_libraries(gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
184
185 set(GOST_SUM_SOURCE_FILES
186         gostsum.c
187         )
188
189 add_executable(gostsum ${GOST_SUM_SOURCE_FILES})
190 target_link_libraries(gostsum gost_core)
191
192 set(GOST_12_SUM_SOURCE_FILES
193         gost12sum.c
194         )
195
196 add_executable(gost12sum ${GOST_12_SUM_SOURCE_FILES})
197 target_link_libraries(gost12sum gost_core)
198
199 set_source_files_properties(tags PROPERTIES GENERATED true)
200 add_custom_target(tags
201     COMMAND ctags -R . ${OPENSSL_ROOT_DIR}
202     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
203
204 add_executable(test_tlstree test_tlstree.c)
205 target_link_libraries(test_tlstree PUBLIC ${OPENSSL_CRYPTO_LIBRARY})
206
207 # install
208 set(OPENSSL_MAN_INSTALL_DIR ${CMAKE_INSTALL_MANDIR}/man1)
209
210 install(TARGETS gost_engine gostsum gost12sum EXPORT GostEngineConfig
211         LIBRARY  DESTINATION ${OPENSSL_ENGINES_DIR}
212         RUNTIME  DESTINATION ${CMAKE_INSTALL_BINDIR})
213 install(FILES gostsum.1 gost12sum.1 DESTINATION ${OPENSSL_MAN_INSTALL_DIR})
214 if (MSVC)
215  install(FILES $<TARGET_PDB_FILE:gost_engine> DESTINATION ${OPENSSL_ENGINES_DIR} OPTIONAL)
216  install(FILES $<TARGET_PDB_FILE:gostsum> $<TARGET_PDB_FILE:gost12sum> DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
217 endif()