]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - CMakeLists.txt
rt library for clock_gettime
[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 list(APPEND CMAKE_REQUIRED_LIBRARIES rt)
29
30 include (TestBigEndian)
31 TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
32 if(IS_BIG_ENDIAN)
33  message(STATUS "BIG_ENDIAN")
34 else()
35  message(STATUS "LITTLE_ENDIAN")
36  add_definitions(-DL_ENDIAN)
37 endif()
38
39 set(BIN_DIRECTORY bin)
40
41 set(OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${BIN_DIRECTORY})
42
43 #set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
44 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
45 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
46
47 # Remove when https://gitlab.kitware.com/cmake/cmake/issues/18525 is addressed
48 set(OPENSSL_ENGINES_DIR "" CACHE PATH "OpenSSL Engines Directory")
49 if ("${OPENSSL_ENGINES_DIR}" STREQUAL "")
50         include(FindPkgConfig)
51         pkg_get_variable(OPENSSL_ENGINES_DIR libcrypto enginesdir)
52         if ("${OPENSSL_ENGINES_DIR}" STREQUAL "")
53                 message( FATAL_ERROR "Unable to discover the OpenSSL engines directory. Provide the path using -DOPENSSL_ENGINES_DIR" )
54         endif()
55 endif()
56
57 set(GOST_89_SOURCE_FILES
58         gost89.c
59         gost89.h
60         )
61
62 set(GOST_HASH_SOURCE_FILES
63         gosthash.c
64         gosthash.h
65         )
66
67 set(GOST_HASH_2012_SOURCE_FILES
68         gosthash2012.c
69         gosthash2012.h
70         gosthash2012_const.h
71         gosthash2012_precalc.h
72         gosthash2012_ref.h
73         gosthash2012_sse2.h
74         )
75
76 set(GOST_GRASSHOPPER_SOURCE_FILES
77         gost_grasshopper.h
78         gost_grasshopper_core.h
79         gost_grasshopper_core.c
80         gost_grasshopper_defines.h
81         gost_grasshopper_defines.c
82         gost_grasshopper_math.h
83         gost_grasshopper_galois_precompiled.c
84         gost_grasshopper_precompiled.c
85         gost_grasshopper_cipher.h
86         gost_grasshopper_cipher.c
87         )
88
89 set(GOST_CORE_SOURCE_FILES
90         e_gost_err.c
91         e_gost_err.h
92         gost_asn1.c
93         gost_crypt.c
94         gost_ctl.c
95         gost_eng.c
96         gost_keywrap.c
97         gost_keywrap.h
98         gost_lcl.h
99         gost_params.c
100         gost_keyexpimp.c
101         )
102
103 set(GOST_EC_SOURCE_FILES
104         gost_ec_keyx.c
105         gost_ec_sign.c
106         )
107
108 set (GOST_OMAC_SOURCE_FILES
109         gost_omac.c
110         gost_omac_acpkm.c
111         )
112
113 set(GOST_LIB_SOURCE_FILES
114         ${GOST_89_SOURCE_FILES}
115         ${GOST_HASH_SOURCE_FILES}
116         ${GOST_HASH_2012_SOURCE_FILES}
117         ${GOST_GRASSHOPPER_SOURCE_FILES}
118         ${GOST_EC_SOURCE_FILES}
119         ${GOST_OMAC_SOURCE_FILES}
120         )
121
122 set(GOST_ENGINE_SOURCE_FILES
123         ${GOST_CORE_SOURCE_FILES}
124         gost_ameth.c
125         gost_md.c
126         gost_md2012.c
127         gost_pmeth.c
128         gost_omac.c
129         gost_omac_acpkm.c
130         )
131
132 add_executable(test_curves test_curves.c)
133 target_link_libraries(test_curves gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
134 add_test(NAME curves
135         COMMAND test_curves)
136
137 add_executable(test_params test_params.c)
138 target_link_libraries(test_params gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
139 add_test(NAME parameters
140         COMMAND test_params)
141
142 add_executable(test_sign test_sign.c)
143 target_link_libraries(test_sign gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
144 add_test(NAME sign/verify
145         COMMAND test_sign)
146
147 add_executable(test_context test_context.c)
148 target_link_libraries(test_context gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
149 add_test(NAME context
150         COMMAND test_context)
151
152 add_executable(test_grasshopper test_grasshopper.c)
153 target_link_libraries(test_grasshopper gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
154 add_test(NAME grasshopper
155         COMMAND test_grasshopper)
156
157 add_executable(test_keyexpimp test_keyexpimp.c)
158 #target_compile_definitions(test_keyexpimp PUBLIC -DOPENSSL_LOAD_CONF)
159 target_link_libraries(test_keyexpimp gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
160 add_test(NAME keyexpimp
161         COMMAND test_keyexpimp)
162
163 add_executable(test_gost89 test_gost89.c)
164 target_link_libraries(test_gost89 gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
165 add_test(NAME gost89
166         COMMAND test_gost89)
167
168 if(NOT ASAN)
169 add_test(NAME engine
170         COMMAND perl run_tests
171         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test)
172 set_tests_properties(engine PROPERTIES ENVIRONMENT
173         "OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR};OPENSSL_ENGINES=${OUTPUT_DIRECTORY}")
174 endif()
175
176 add_executable(sign benchmark/sign.c)
177 target_link_libraries(sign gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
178
179 add_library(gost_core STATIC ${GOST_LIB_SOURCE_FILES})
180 set_target_properties(gost_core PROPERTIES POSITION_INDEPENDENT_CODE ON)
181
182 add_library(gost_engine MODULE ${GOST_ENGINE_SOURCE_FILES})
183 set_target_properties(gost_engine PROPERTIES PREFIX "" OUTPUT_NAME "gost")
184 target_link_libraries(gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY})
185
186 set(GOST_SUM_SOURCE_FILES
187         gostsum.c
188         )
189
190 add_executable(gostsum ${GOST_SUM_SOURCE_FILES})
191 target_link_libraries(gostsum gost_core)
192
193 set(GOST_12_SUM_SOURCE_FILES
194         gost12sum.c
195         )
196
197 add_executable(gost12sum ${GOST_12_SUM_SOURCE_FILES})
198 target_link_libraries(gost12sum gost_core)
199
200 set_source_files_properties(tags PROPERTIES GENERATED true)
201 add_custom_target(tags
202     COMMAND ctags -R . ${OPENSSL_ROOT_DIR}
203     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
204
205 add_executable(test_tlstree test_tlstree.c)
206 target_link_libraries(test_tlstree PUBLIC ${OPENSSL_CRYPTO_LIBRARY})
207
208 # install
209 set(OPENSSL_MAN_INSTALL_DIR ${CMAKE_INSTALL_MANDIR}/man1)
210
211 install(TARGETS gost_engine gostsum gost12sum EXPORT GostEngineConfig
212         LIBRARY  DESTINATION ${OPENSSL_ENGINES_DIR}
213         RUNTIME  DESTINATION ${CMAKE_INSTALL_BINDIR})
214 install(FILES gostsum.1 gost12sum.1 DESTINATION ${OPENSSL_MAN_INSTALL_DIR})
215 if (MSVC)
216  install(FILES $<TARGET_PDB_FILE:gost_engine> DESTINATION ${OPENSSL_ENGINES_DIR} OPTIONAL)
217  install(FILES $<TARGET_PDB_FILE:gostsum> $<TARGET_PDB_FILE:gost12sum> DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
218 endif()