xref: /aosp_15_r20/external/mbedtls/programs/test/dlopen.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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