6e52665c0aa7271ffe6f9e77a7425711888eb9cb
[reactos.git] / reactos / dll / win32 / schannel / schannel_mbedtls_lazyload.h
1 /* Copyright 2015 Ismael Ferreras Morezuelas <swyterzone+ros@gmail.com>
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
16 *
17 * --
18 *
19 * This file transparently wraps lazy-loading hooks in the schannel
20 * implementation on top of the PolarSSL/mbedTLS open source library.
21 */
22
23 static void *libmbedtls_handle;
24
25 #define MAKE_FUNCPTR(f) static typeof(f) * p##f;
26
27 MAKE_FUNCPTR(mbedtls_ctr_drbg_free)
28 MAKE_FUNCPTR(mbedtls_ctr_drbg_init)
29 MAKE_FUNCPTR(mbedtls_ctr_drbg_random)
30 MAKE_FUNCPTR(mbedtls_entropy_free)
31 MAKE_FUNCPTR(mbedtls_entropy_func)
32 MAKE_FUNCPTR(mbedtls_entropy_init)
33 MAKE_FUNCPTR(mbedtls_ssl_ciphersuite_from_id)
34 MAKE_FUNCPTR(mbedtls_ssl_free)
35 MAKE_FUNCPTR(mbedtls_ssl_get_ciphersuite)
36 MAKE_FUNCPTR(mbedtls_ssl_get_ciphersuite_id)
37 MAKE_FUNCPTR(mbedtls_ssl_get_max_frag_len)
38 MAKE_FUNCPTR(mbedtls_ssl_get_version)
39 MAKE_FUNCPTR(mbedtls_ssl_handshake)
40 MAKE_FUNCPTR(mbedtls_ssl_init)
41 MAKE_FUNCPTR(mbedtls_ssl_read)
42 MAKE_FUNCPTR(mbedtls_ssl_conf_authmode)
43 MAKE_FUNCPTR(mbedtls_ssl_set_bio)
44 MAKE_FUNCPTR(mbedtls_ssl_conf_endpoint)
45 MAKE_FUNCPTR(mbedtls_ssl_set_hostname)
46 MAKE_FUNCPTR(mbedtls_ssl_conf_max_version)
47 MAKE_FUNCPTR(mbedtls_ssl_conf_min_version)
48 MAKE_FUNCPTR(mbedtls_ssl_conf_rng)
49 MAKE_FUNCPTR(mbedtls_ssl_write)
50 MAKE_FUNCPTR(mbedtls_ssl_get_peer_cert)
51 MAKE_FUNCPTR(mbedtls_ssl_config_init)
52 MAKE_FUNCPTR(mbedtls_ssl_config_defaults)
53 MAKE_FUNCPTR(mbedtls_ssl_conf_dbg)
54 MAKE_FUNCPTR(mbedtls_ssl_setup)
55 MAKE_FUNCPTR(mbedtls_cipher_info_from_type)
56 MAKE_FUNCPTR(mbedtls_md_info_from_type)
57 MAKE_FUNCPTR(mbedtls_pk_get_bitlen)
58 MAKE_FUNCPTR(mbedtls_ctr_drbg_seed)
59
60 #undef MAKE_FUNCPTR
61
62 /* replace the initialization functions by our own, specially tailored, ones */
63
64 BOOL schan_imp_init(void)
65 {
66 libmbedtls_handle = wine_dlopen(SONAME_LIBMBEDTLS, RTLD_NOW, NULL, 0);
67
68 if (!libmbedtls_handle)
69 {
70 WARN("Failed to load the mbedTLS dynamic library (" SONAME_LIBMBEDTLS ").\n");
71 return FALSE;
72 }
73
74 #define LOAD_FUNCPTR(f) \
75 if (!(p##f = wine_dlsym(libmbedtls_handle, #f, NULL, 0))) \
76 { \
77 ERR("Failed to retrieve function %s from the mbedTLS dynamic library (" SONAME_LIBMBEDTLS ")\n", #f); \
78 goto fail; \
79 }
80
81 LOAD_FUNCPTR(mbedtls_ctr_drbg_free)
82 LOAD_FUNCPTR(mbedtls_ctr_drbg_init)
83 LOAD_FUNCPTR(mbedtls_ctr_drbg_random)
84 LOAD_FUNCPTR(mbedtls_entropy_free)
85 LOAD_FUNCPTR(mbedtls_entropy_func)
86 LOAD_FUNCPTR(mbedtls_entropy_init)
87 LOAD_FUNCPTR(mbedtls_ssl_ciphersuite_from_id)
88 LOAD_FUNCPTR(mbedtls_ssl_free)
89 LOAD_FUNCPTR(mbedtls_ssl_get_ciphersuite)
90 LOAD_FUNCPTR(mbedtls_ssl_get_ciphersuite_id)
91 LOAD_FUNCPTR(mbedtls_ssl_get_max_frag_len)
92 LOAD_FUNCPTR(mbedtls_ssl_get_version)
93 LOAD_FUNCPTR(mbedtls_ssl_handshake)
94 LOAD_FUNCPTR(mbedtls_ssl_init)
95 LOAD_FUNCPTR(mbedtls_ssl_read)
96 LOAD_FUNCPTR(mbedtls_ssl_conf_authmode)
97 LOAD_FUNCPTR(mbedtls_ssl_set_bio)
98 LOAD_FUNCPTR(mbedtls_ssl_conf_endpoint)
99 LOAD_FUNCPTR(mbedtls_ssl_set_hostname)
100 LOAD_FUNCPTR(mbedtls_ssl_conf_max_version)
101 LOAD_FUNCPTR(mbedtls_ssl_conf_min_version)
102 LOAD_FUNCPTR(mbedtls_ssl_conf_rng)
103 LOAD_FUNCPTR(mbedtls_ssl_write)
104 LOAD_FUNCPTR(mbedtls_ssl_get_peer_cert)
105 LOAD_FUNCPTR(mbedtls_ssl_config_init)
106 LOAD_FUNCPTR(mbedtls_ssl_config_defaults)
107 LOAD_FUNCPTR(mbedtls_ssl_conf_dbg)
108 LOAD_FUNCPTR(mbedtls_ssl_setup)
109 LOAD_FUNCPTR(mbedtls_cipher_info_from_type)
110 LOAD_FUNCPTR(mbedtls_md_info_from_type)
111 LOAD_FUNCPTR(mbedtls_pk_get_bitlen)
112 LOAD_FUNCPTR(mbedtls_ctr_drbg_seed)
113
114 #undef LOAD_FUNCPTR
115
116 return TRUE;
117
118 fail:
119
120 wine_dlclose(libmbedtls_handle, NULL, 0);
121 libmbedtls_handle = NULL;
122
123 return FALSE;
124 }
125
126 void schan_imp_deinit(void)
127 {
128 wine_dlclose(libmbedtls_handle, NULL, 0);
129 libmbedtls_handle = NULL;
130 }
131
132 /* now that we have overridden the initialization functions
133 cancel out the original stubs used when dynamically linking */
134
135 #define schan_imp_init schan_imp_init_unused
136 #define schan_imp_deinit schan_imp_deinit_unused
137
138 /* seamlessly redirect the function pointers with some preprocessor magic */
139
140 #define mbedtls_ctr_drbg_free mbedtls_ctr_drbg_free
141 #define mbedtls_ctr_drbg_init mbedtls_ctr_drbg_init
142 #define mbedtls_ctr_drbg_random mbedtls_ctr_drbg_random
143 #define mbedtls_entropy_free mbedtls_entropy_free
144 #define mbedtls_entropy_func mbedtls_entropy_func
145 #define mbedtls_entropy_init mbedtls_entropy_init
146 #define mbedtls_ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id
147 #define mbedtls_ssl_free mbedtls_ssl_free
148 #define mbedtls_ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite
149 #define mbedtls_ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id
150 #define mbedtls_ssl_get_max_frag_len mbedtls_ssl_get_max_frag_len
151 #define mbedtls_ssl_get_version mbedtls_ssl_get_version
152 #define mbedtls_ssl_handshake mbedtls_ssl_handshake
153 #define mbedtls_ssl_init mbedtls_ssl_init
154 #define mbedtls_ssl_read mbedtls_ssl_read
155 #define mbedtls_ssl_conf_authmode mbedtls_ssl_conf_authmode
156 #define mbedtls_ssl_set_bio mbedtls_ssl_set_bio
157 #define mbedtls_ssl_conf_endpoint mbedtls_ssl_conf_endpoint
158 #define mbedtls_ssl_set_hostname mbedtls_ssl_set_hostname
159 #define mbedtls_ssl_conf_max_version mbedtls_ssl_conf_max_version
160 #define mbedtls_ssl_conf_min_version mbedtls_ssl_conf_min_version
161 #define mbedtls_ssl_conf_rng mbedtls_ssl_conf_rng
162 #define mbedtls_ssl_write mbedtls_ssl_write
163 #define mbedtls_ssl_get_peer_cert mbedtls_ssl_get_peer_cert
164 #define mbedtls_ssl_config_init mbedtls_ssl_config_init
165 #define mbedtls_ssl_config_defaults mbedtls_ssl_config_defaults
166 #define mbedtls_ssl_conf_dbg mbedtls_ssl_conf_dbg
167 #define mbedtls_ssl_setup mbedtls_ssl_setup
168 #define mbedtls_cipher_info_from_type mbedtls_cipher_info_from_type
169 #define mbedtls_md_info_from_type mbedtls_md_info_from_type
170 #define mbedtls_pk_get_bitlen mbedtls_pk_get_bitlen
171 #define mbedtls_ctr_drbg_seed mbedtls_ctr_drbg_seed