1 /* Copyright 2015 Ismael Ferreras Morezuelas <swyterzone+ros@gmail.com>
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.
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.
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
19 * This file transparently wraps lazy-loading hooks in the schannel
20 * implementation on top of the PolarSSL/mbedTLS open source library.
23 static void *libmbedtls_handle
;
25 #define MAKE_FUNCPTR(f) static typeof(f) * p##f;
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
)
62 /* replace the initialization functions by our own, specially tailored, ones */
64 BOOL
schan_imp_init(void)
66 libmbedtls_handle
= wine_dlopen(SONAME_LIBMBEDTLS
, RTLD_NOW
, NULL
, 0);
68 if (!libmbedtls_handle
)
70 WARN("Failed to load the mbedTLS dynamic library (" SONAME_LIBMBEDTLS
").\n");
74 #define LOAD_FUNCPTR(f) \
75 if (!(p##f = wine_dlsym(libmbedtls_handle, #f, NULL, 0))) \
77 ERR("Failed to retrieve function %s from the mbedTLS dynamic library (" SONAME_LIBMBEDTLS ")\n", #f); \
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
)
120 wine_dlclose(libmbedtls_handle
, NULL
, 0);
121 libmbedtls_handle
= NULL
;
126 void schan_imp_deinit(void)
128 wine_dlclose(libmbedtls_handle
, NULL
, 0);
129 libmbedtls_handle
= NULL
;
132 /* now that we have overridden the initialization functions
133 cancel out the original stubs used when dynamically linking */
135 #define schan_imp_init schan_imp_init_unused
136 #define schan_imp_deinit schan_imp_deinit_unused
138 /* seamlessly redirect the function pointers with some preprocessor magic */
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