1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi * Test dynamic loading of libmbed*
3*62c56f98SSadaf Ebrahimi *
4*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi */
7*62c56f98SSadaf Ebrahimi
8*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h"
9*62c56f98SSadaf Ebrahimi
10*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
13*62c56f98SSadaf Ebrahimi #include "mbedtls/x509_crt.h"
14*62c56f98SSadaf Ebrahimi #endif
15*62c56f98SSadaf Ebrahimi
16*62c56f98SSadaf Ebrahimi #if defined(__APPLE__)
17*62c56f98SSadaf Ebrahimi #define SO_SUFFIX ".dylib"
18*62c56f98SSadaf Ebrahimi #else
19*62c56f98SSadaf Ebrahimi #define SO_SUFFIX ".so"
20*62c56f98SSadaf Ebrahimi #endif
21*62c56f98SSadaf Ebrahimi
22*62c56f98SSadaf Ebrahimi #define CRYPTO_SO_FILENAME "libmbedcrypto" SO_SUFFIX
23*62c56f98SSadaf Ebrahimi #define X509_SO_FILENAME "libmbedx509" SO_SUFFIX
24*62c56f98SSadaf Ebrahimi #define TLS_SO_FILENAME "libmbedtls" SO_SUFFIX
25*62c56f98SSadaf Ebrahimi
26*62c56f98SSadaf Ebrahimi #include <dlfcn.h>
27*62c56f98SSadaf Ebrahimi
28*62c56f98SSadaf Ebrahimi #define CHECK_DLERROR(function, argument) \
29*62c56f98SSadaf Ebrahimi do \
30*62c56f98SSadaf Ebrahimi { \
31*62c56f98SSadaf Ebrahimi char *CHECK_DLERROR_error = dlerror(); \
32*62c56f98SSadaf Ebrahimi if (CHECK_DLERROR_error != NULL) \
33*62c56f98SSadaf Ebrahimi { \
34*62c56f98SSadaf Ebrahimi fprintf(stderr, "Dynamic loading error for %s(%s): %s\n", \
35*62c56f98SSadaf Ebrahimi function, argument, CHECK_DLERROR_error); \
36*62c56f98SSadaf Ebrahimi mbedtls_exit(MBEDTLS_EXIT_FAILURE); \
37*62c56f98SSadaf Ebrahimi } \
38*62c56f98SSadaf Ebrahimi } \
39*62c56f98SSadaf Ebrahimi while (0)
40*62c56f98SSadaf Ebrahimi
main(void)41*62c56f98SSadaf Ebrahimi int main(void)
42*62c56f98SSadaf Ebrahimi {
43*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C) || defined(MBEDTLS_SSL_TLS_C)
44*62c56f98SSadaf Ebrahimi unsigned n;
45*62c56f98SSadaf Ebrahimi #endif
46*62c56f98SSadaf Ebrahimi
47*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS_C)
48*62c56f98SSadaf Ebrahimi void *tls_so = dlopen(TLS_SO_FILENAME, RTLD_NOW);
49*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlopen", TLS_SO_FILENAME);
50*62c56f98SSadaf Ebrahimi const int *(*ssl_list_ciphersuites)(void) =
51*62c56f98SSadaf Ebrahimi dlsym(tls_so, "mbedtls_ssl_list_ciphersuites");
52*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlsym", "mbedtls_ssl_list_ciphersuites");
53*62c56f98SSadaf Ebrahimi const int *ciphersuites = ssl_list_ciphersuites();
54*62c56f98SSadaf Ebrahimi for (n = 0; ciphersuites[n] != 0; n++) {/* nothing to do, we're just counting */
55*62c56f98SSadaf Ebrahimi ;
56*62c56f98SSadaf Ebrahimi }
57*62c56f98SSadaf Ebrahimi mbedtls_printf("dlopen(%s): %u ciphersuites\n",
58*62c56f98SSadaf Ebrahimi TLS_SO_FILENAME, n);
59*62c56f98SSadaf Ebrahimi dlclose(tls_so);
60*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlclose", TLS_SO_FILENAME);
61*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS_C */
62*62c56f98SSadaf Ebrahimi
63*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
64*62c56f98SSadaf Ebrahimi void *x509_so = dlopen(X509_SO_FILENAME, RTLD_NOW);
65*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlopen", X509_SO_FILENAME);
66*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt_profile *profile =
67*62c56f98SSadaf Ebrahimi dlsym(x509_so, "mbedtls_x509_crt_profile_default");
68*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlsym", "mbedtls_x509_crt_profile_default");
69*62c56f98SSadaf Ebrahimi mbedtls_printf("dlopen(%s): Allowed md mask: %08x\n",
70*62c56f98SSadaf Ebrahimi X509_SO_FILENAME, (unsigned) profile->allowed_mds);
71*62c56f98SSadaf Ebrahimi dlclose(x509_so);
72*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlclose", X509_SO_FILENAME);
73*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
74*62c56f98SSadaf Ebrahimi
75*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C)
76*62c56f98SSadaf Ebrahimi void *crypto_so = dlopen(CRYPTO_SO_FILENAME, RTLD_NOW);
77*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlopen", CRYPTO_SO_FILENAME);
78*62c56f98SSadaf Ebrahimi const int *(*md_list)(void) =
79*62c56f98SSadaf Ebrahimi dlsym(crypto_so, "mbedtls_md_list");
80*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlsym", "mbedtls_md_list");
81*62c56f98SSadaf Ebrahimi const int *mds = md_list();
82*62c56f98SSadaf Ebrahimi for (n = 0; mds[n] != 0; n++) {/* nothing to do, we're just counting */
83*62c56f98SSadaf Ebrahimi ;
84*62c56f98SSadaf Ebrahimi }
85*62c56f98SSadaf Ebrahimi mbedtls_printf("dlopen(%s): %u hashes\n",
86*62c56f98SSadaf Ebrahimi CRYPTO_SO_FILENAME, n);
87*62c56f98SSadaf Ebrahimi dlclose(crypto_so);
88*62c56f98SSadaf Ebrahimi CHECK_DLERROR("dlclose", CRYPTO_SO_FILENAME);
89*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_C */
90*62c56f98SSadaf Ebrahimi
91*62c56f98SSadaf Ebrahimi return 0;
92*62c56f98SSadaf Ebrahimi }
93