1option(USE_STATIC_MBEDTLS_LIBRARY "Build Mbed TLS static library." ON)
2option(USE_SHARED_MBEDTLS_LIBRARY "Build Mbed TLS shared library." OFF)
3option(LINK_WITH_PTHREAD "Explicitly link Mbed TLS library to pthread." OFF)
4option(LINK_WITH_TRUSTED_STORAGE "Explicitly link Mbed TLS library to trusted_storage." OFF)
5
6# Set the project root directory if it's not already defined, as may happen if
7# the library folder is included directly by a parent project, without
8# including the top level CMakeLists.txt.
9if(NOT DEFINED MBEDTLS_DIR)
10    set(MBEDTLS_DIR ${CMAKE_SOURCE_DIR})
11endif()
12
13set(src_crypto
14    aes.c
15    aesni.c
16    aesce.c
17    aria.c
18    asn1parse.c
19    asn1write.c
20    base64.c
21    bignum.c
22    bignum_core.c
23    bignum_mod.c
24    bignum_mod_raw.c
25    block_cipher.c
26    camellia.c
27    ccm.c
28    chacha20.c
29    chachapoly.c
30    cipher.c
31    cipher_wrap.c
32    constant_time.c
33    cmac.c
34    ctr_drbg.c
35    des.c
36    dhm.c
37    ecdh.c
38    ecdsa.c
39    ecjpake.c
40    ecp.c
41    ecp_curves.c
42    ecp_curves_new.c
43    entropy.c
44    entropy_poll.c
45    error.c
46    gcm.c
47    hkdf.c
48    hmac_drbg.c
49    lmots.c
50    lms.c
51    md.c
52    md5.c
53    memory_buffer_alloc.c
54    nist_kw.c
55    oid.c
56    padlock.c
57    pem.c
58    pk.c
59    pk_ecc.c
60    pk_wrap.c
61    pkcs12.c
62    pkcs5.c
63    pkparse.c
64    pkwrite.c
65    platform.c
66    platform_util.c
67    poly1305.c
68    psa_crypto.c
69    psa_crypto_aead.c
70    psa_crypto_cipher.c
71    psa_crypto_client.c
72    psa_crypto_driver_wrappers_no_static.c
73    psa_crypto_ecp.c
74    psa_crypto_ffdh.c
75    psa_crypto_hash.c
76    psa_crypto_mac.c
77    psa_crypto_pake.c
78    psa_crypto_rsa.c
79    psa_crypto_se.c
80    psa_crypto_slot_management.c
81    psa_crypto_storage.c
82    psa_its_file.c
83    psa_util.c
84    ripemd160.c
85    rsa.c
86    rsa_alt_helpers.c
87    sha1.c
88    sha256.c
89    sha512.c
90    sha3.c
91    threading.c
92    timing.c
93    version.c
94    version_features.c
95)
96
97set(src_x509
98    pkcs7.c
99    x509.c
100    x509_create.c
101    x509_crl.c
102    x509_crt.c
103    x509_csr.c
104    x509write.c
105    x509write_crt.c
106    x509write_csr.c
107)
108
109set(src_tls
110    debug.c
111    mps_reader.c
112    mps_trace.c
113    net_sockets.c
114    ssl_cache.c
115    ssl_ciphersuites.c
116    ssl_client.c
117    ssl_cookie.c
118    ssl_debug_helpers_generated.c
119    ssl_msg.c
120    ssl_ticket.c
121    ssl_tls.c
122    ssl_tls12_client.c
123    ssl_tls12_server.c
124    ssl_tls13_keys.c
125    ssl_tls13_server.c
126    ssl_tls13_client.c
127    ssl_tls13_generic.c
128)
129
130if(GEN_FILES)
131    find_package(Perl REQUIRED)
132
133    file(GLOB error_headers ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls/*.h)
134    add_custom_command(
135        OUTPUT
136            ${CMAKE_CURRENT_BINARY_DIR}/error.c
137        COMMAND
138            ${PERL_EXECUTABLE}
139                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_errors.pl
140                ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls
141                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files
142                ${CMAKE_CURRENT_BINARY_DIR}/error.c
143        DEPENDS
144            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_errors.pl
145            ${error_headers}
146            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/error.fmt
147    )
148
149    add_custom_command(
150        OUTPUT
151            ${CMAKE_CURRENT_BINARY_DIR}/version_features.c
152        COMMAND
153            ${PERL_EXECUTABLE}
154                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_features.pl
155                ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls
156                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files
157                ${CMAKE_CURRENT_BINARY_DIR}/version_features.c
158        DEPENDS
159            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_features.pl
160            ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls/mbedtls_config.h
161            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/version_features.fmt
162    )
163
164    add_custom_command(
165        OUTPUT
166            ${CMAKE_CURRENT_BINARY_DIR}/ssl_debug_helpers_generated.c
167        COMMAND
168            ${MBEDTLS_PYTHON_EXECUTABLE}
169                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_ssl_debug_helpers.py
170                --mbedtls-root ${CMAKE_CURRENT_SOURCE_DIR}/..
171                ${CMAKE_CURRENT_BINARY_DIR}
172        DEPENDS
173            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_ssl_debug_helpers.py
174            ${error_headers}
175    )
176
177    add_custom_command(
178        OUTPUT
179            ${CMAKE_CURRENT_BINARY_DIR}/psa_crypto_driver_wrappers.h
180            ${CMAKE_CURRENT_BINARY_DIR}/psa_crypto_driver_wrappers_no_static.c
181        COMMAND
182            ${MBEDTLS_PYTHON_EXECUTABLE}
183                ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_driver_wrappers.py
184                ${CMAKE_CURRENT_BINARY_DIR}
185        DEPENDS
186            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_driver_wrappers.py
187            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/driver_templates/psa_crypto_driver_wrappers.h.jinja
188            ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/driver_templates/psa_crypto_driver_wrappers_no_static.c.jinja
189    )
190
191
192else()
193    link_to_source(error.c)
194    link_to_source(version_features.c)
195    link_to_source(ssl_debug_helpers_generated.c)
196    link_to_source(psa_crypto_driver_wrappers_no_static.c)
197endif()
198
199if(CMAKE_COMPILER_IS_GNUCC)
200    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes")
201endif(CMAKE_COMPILER_IS_GNUCC)
202
203if(CMAKE_COMPILER_IS_CLANG)
204    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code")
205endif(CMAKE_COMPILER_IS_CLANG)
206
207if(CMAKE_COMPILER_IS_MSVC)
208    option(MSVC_STATIC_RUNTIME "Build the libraries with /MT compiler flag" OFF)
209    if(MSVC_STATIC_RUNTIME)
210        foreach(flag_var
211            CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
212            CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
213            CMAKE_C_FLAGS_CHECK)
214            string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
215        endforeach(flag_var)
216    endif()
217endif()
218
219if(WIN32)
220    set(libs ${libs} ws2_32 bcrypt)
221endif(WIN32)
222
223if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
224    SET(CMAKE_C_ARCHIVE_CREATE   "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
225    SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
226    SET(CMAKE_C_ARCHIVE_FINISH   "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
227    SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
228endif()
229
230if(HAIKU)
231    set(libs ${libs} network)
232endif(HAIKU)
233
234if(LINK_WITH_PTHREAD)
235    set(libs ${libs} ${CMAKE_THREAD_LIBS_INIT})
236endif()
237
238if(LINK_WITH_TRUSTED_STORAGE)
239    set(libs ${libs} trusted_storage)
240endif()
241
242if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)
243    message(FATAL_ERROR "Need to choose static or shared mbedtls build!")
244endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)
245
246set(mbedtls_target    "${MBEDTLS_TARGET_PREFIX}mbedtls")
247set(mbedx509_target   "${MBEDTLS_TARGET_PREFIX}mbedx509")
248set(mbedcrypto_target "${MBEDTLS_TARGET_PREFIX}mbedcrypto")
249
250set(mbedtls_target    ${mbedtls_target}    PARENT_SCOPE)
251set(mbedx509_target   ${mbedx509_target}   PARENT_SCOPE)
252set(mbedcrypto_target ${mbedcrypto_target} PARENT_SCOPE)
253
254if (USE_STATIC_MBEDTLS_LIBRARY)
255    set(mbedtls_static_target    ${mbedtls_target})
256    set(mbedx509_static_target   ${mbedx509_target})
257    set(mbedcrypto_static_target ${mbedcrypto_target})
258endif()
259
260set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target})
261
262if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
263    string(APPEND mbedtls_static_target    "_static")
264    string(APPEND mbedx509_static_target   "_static")
265    string(APPEND mbedcrypto_static_target "_static")
266
267    list(APPEND target_libraries
268        ${mbedcrypto_static_target}
269        ${mbedx509_static_target}
270        ${mbedtls_static_target})
271endif()
272
273set(p256m_target "${MBEDTLS_TARGET_PREFIX}p256m")
274set(everest_target "${MBEDTLS_TARGET_PREFIX}everest")
275
276if(USE_STATIC_MBEDTLS_LIBRARY)
277    add_library(${mbedcrypto_static_target} STATIC ${src_crypto})
278    set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto)
279    target_link_libraries(${mbedcrypto_static_target} PUBLIC ${libs})
280
281    if(TARGET ${everest_target})
282        target_link_libraries(${mbedcrypto_static_target} PUBLIC ${everest_target})
283    endif()
284
285    if(TARGET ${p256m_target})
286        target_link_libraries(${mbedcrypto_static_target} PUBLIC ${p256m_target})
287    endif()
288
289    add_library(${mbedx509_static_target} STATIC ${src_x509})
290    set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509)
291    target_link_libraries(${mbedx509_static_target} PUBLIC ${libs} ${mbedcrypto_static_target})
292
293    add_library(${mbedtls_static_target} STATIC ${src_tls})
294    set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls)
295    target_link_libraries(${mbedtls_static_target} PUBLIC ${libs} ${mbedx509_static_target})
296endif(USE_STATIC_MBEDTLS_LIBRARY)
297
298if(USE_SHARED_MBEDTLS_LIBRARY)
299    set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR})
300    add_library(${mbedcrypto_target} SHARED ${src_crypto})
301    set_target_properties(${mbedcrypto_target} PROPERTIES VERSION 3.6.0 SOVERSION 16)
302    target_link_libraries(${mbedcrypto_target} PUBLIC ${libs})
303
304    if(TARGET ${everest_target})
305        target_link_libraries(${mbedcrypto_target} PUBLIC ${everest_target})
306    endif()
307
308    if(TARGET ${p256m_target})
309        target_link_libraries(${mbedcrypto_target} PUBLIC ${p256m_target})
310    endif()
311
312    add_library(${mbedx509_target} SHARED ${src_x509})
313    set_target_properties(${mbedx509_target} PROPERTIES VERSION 3.6.0 SOVERSION 7)
314    target_link_libraries(${mbedx509_target} PUBLIC ${libs} ${mbedcrypto_target})
315
316    add_library(${mbedtls_target} SHARED ${src_tls})
317    set_target_properties(${mbedtls_target} PROPERTIES VERSION 3.6.0 SOVERSION 21)
318    target_link_libraries(${mbedtls_target} PUBLIC ${libs} ${mbedx509_target})
319endif(USE_SHARED_MBEDTLS_LIBRARY)
320
321foreach(target IN LISTS target_libraries)
322    add_library(MbedTLS::${target} ALIAS ${target})  # add_subdirectory support
323    # Include public header files from /include and other directories
324    # declared by /3rdparty/**/CMakeLists.txt. Include private header files
325    # from /library and others declared by /3rdparty/**/CMakeLists.txt.
326    # /library needs to be listed explicitly when building .c files outside
327    # of /library (which currently means: under /3rdparty).
328    target_include_directories(${target}
329        PUBLIC $<BUILD_INTERFACE:${MBEDTLS_DIR}/include/>
330               $<INSTALL_INTERFACE:include/>
331        PRIVATE ${MBEDTLS_DIR}/library/
332                # Needed to include psa_crypto_driver_wrappers.h
333                ${CMAKE_CURRENT_BINARY_DIR})
334    # Pass-through MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE
335    if(MBEDTLS_CONFIG_FILE)
336        target_compile_definitions(${target}
337            PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}")
338    endif()
339    if(MBEDTLS_USER_CONFIG_FILE)
340        target_compile_definitions(${target}
341            PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}")
342    endif()
343    install(
344        TARGETS ${target}
345        EXPORT MbedTLSTargets
346        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
347        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
348        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
349        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
350endforeach(target)
351
352set(lib_target "${MBEDTLS_TARGET_PREFIX}lib")
353
354add_custom_target(${lib_target} DEPENDS ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target})
355if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
356    add_dependencies(${lib_target} ${mbedcrypto_static_target} ${mbedx509_static_target} ${mbedtls_static_target})
357endif()
358