variant_ssl_sys/handwritten/
ssl.rs

1use super::super::*;
2use libc::*;
3
4pub enum SSL_METHOD {}
5pub enum SSL_CIPHER {}
6cfg_if! {
7    if #[cfg(any(ossl110, libressl280))] {
8        pub enum SSL_SESSION {}
9    } else if #[cfg(libressl251)] {
10        #[repr(C)]
11        pub struct SSL_SESSION {
12            ssl_version: c_int,
13            pub master_key_length: c_int,
14            pub master_key: [c_uchar; 48],
15            session_id_length: c_uint,
16            session_id: [c_uchar; SSL_MAX_SSL_SESSION_ID_LENGTH as usize],
17            sid_ctx_length: c_uint,
18            sid_ctx: [c_uchar; SSL_MAX_SID_CTX_LENGTH as usize],
19            peer: *mut X509,
20            verify_result: c_long,
21            timeout: c_long,
22            time: time_t,
23            pub references: c_int,
24            cipher: *const SSL_CIPHER,
25            cipher_id: c_long,
26            ciphers: *mut stack_st_SSL_CIPHER,
27            tlsext_hostname: *mut c_char,
28            tlsext_tick: *mut c_uchar,
29            tlsext_ticklen: size_t,
30            tlsext_tick_lifetime_int: c_long,
31            internal: *mut c_void,
32        }
33    } else if #[cfg(libressl)] {
34        #[repr(C)]
35        pub struct SSL_SESSION {
36            ssl_version: c_int,
37            pub master_key_length: c_int,
38            pub master_key: [c_uchar; 48],
39            session_id_length: c_uint,
40            session_id: [c_uchar; SSL_MAX_SSL_SESSION_ID_LENGTH as usize],
41            sid_ctx_length: c_uint,
42            sid_ctx: [c_uchar; SSL_MAX_SID_CTX_LENGTH as usize],
43            not_resumable: c_int,
44            sess_cert: *mut c_void,
45            peer: *mut X509,
46            verify_result: c_long,
47            timeout: c_long,
48            time: time_t,
49            pub references: c_int,
50            cipher: *const c_void,
51            cipher_id: c_ulong,
52            ciphers: *mut c_void,
53            ex_data: CRYPTO_EX_DATA,
54            prev: *mut c_void,
55            next: *mut c_void,
56            tlsext_hostname: *mut c_char,
57            tlsext_ecpointformatlist_length: size_t,
58            tlsext_ecpointformatlist: *mut u8,
59            tlsext_ellipticcurvelist_length: size_t,
60            tlsext_ellipticcurvelist: *mut u16,
61            tlsext_tick: *mut c_uchar,
62            tlsext_ticklen: size_t,
63            tlsext_tick_lifetime_hint: c_long,
64        }
65    } else {
66        #[repr(C)]
67        pub struct SSL_SESSION {
68            ssl_version: c_int,
69            key_arg_length: c_uint,
70            key_arg: [c_uchar; SSL_MAX_KEY_ARG_LENGTH as usize],
71            pub master_key_length: c_int,
72            pub master_key: [c_uchar; 48],
73            session_id_length: c_uint,
74            session_id: [c_uchar; SSL_MAX_SSL_SESSION_ID_LENGTH as usize],
75            sid_ctx_length: c_uint,
76            sid_ctx: [c_uchar; SSL_MAX_SID_CTX_LENGTH as usize],
77            #[cfg(not(osslconf = "OPENSSL_NO_KRB5"))]
78            krb5_client_princ_len: c_uint,
79            #[cfg(not(osslconf = "OPENSSL_NO_KRB5"))]
80            krb5_client_princ: [c_uchar; SSL_MAX_KRB5_PRINCIPAL_LENGTH as usize],
81            #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
82            psk_identity_hint: *mut c_char,
83            #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
84            psk_identity: *mut c_char,
85            not_resumable: c_int,
86            sess_cert: *mut c_void,
87            peer: *mut X509,
88            verify_result: c_long,
89            pub references: c_int,
90            timeout: c_long,
91            time: c_long,
92            compress_meth: c_uint,
93            cipher: *const c_void,
94            cipher_id: c_ulong,
95            ciphers: *mut c_void,
96            ex_data: CRYPTO_EX_DATA,
97            prev: *mut c_void,
98            next: *mut c_void,
99            #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
100            tlsext_hostname: *mut c_char,
101            #[cfg(all(
102                not(osslconf = "OPENSSL_NO_TLSEXT"),
103                not(osslconf = "OPENSSL_NO_EC")
104            ))]
105            tlsext_ecpointformatlist_length: size_t,
106            #[cfg(all(
107                not(osslconf = "OPENSSL_NO_TLSEXT"),
108                not(osslconf = "OPENSSL_NO_EC")
109            ))]
110            tlsext_ecpointformatlist: *mut c_uchar,
111            #[cfg(all(
112                not(osslconf = "OPENSSL_NO_TLSEXT"),
113                not(osslconf = "OPENSSL_NO_EC")
114            ))]
115            tlsext_ellipticcurvelist_length: size_t,
116            #[cfg(all(
117                not(osslconf = "OPENSSL_NO_TLSEXT"),
118                not(osslconf = "OPENSSL_NO_EC")
119            ))]
120            tlsext_ellipticcurvelist: *mut c_uchar,
121            #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
122            tlsext_tick: *mut c_uchar,
123            #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
124            tlsext_ticklen: size_t,
125            #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
126            tlsext_tick_lifetime_hint: c_long,
127            #[cfg(not(osslconf = "OPENSSL_NO_SRP"))]
128            srp_username: *mut c_char,
129        }
130    }
131}
132
133stack!(stack_st_SSL_CIPHER);
134
135#[repr(C)]
136pub struct SRTP_PROTECTION_PROFILE {
137    pub name: *const c_char,
138    pub id: c_ulong,
139}
140
141stack!(stack_st_SRTP_PROTECTION_PROFILE);
142
143pub type tls_session_ticket_ext_cb_fn =
144    Option<unsafe extern "C" fn(*mut SSL, *const c_uchar, c_int, *mut c_void) -> c_int>;
145pub type tls_session_secret_cb_fn = Option<
146    unsafe extern "C" fn(
147        *mut SSL,
148        *mut c_void,
149        *mut c_int,
150        *mut stack_st_SSL_CIPHER,
151        *mut *mut SSL_CIPHER,
152        *mut c_void,
153    ) -> c_int,
154>;
155
156#[cfg(ossl111)]
157pub type SSL_custom_ext_add_cb_ex = Option<
158    unsafe extern "C" fn(
159        ssl: *mut SSL,
160        ext_type: c_uint,
161        context: c_uint,
162        out: *mut *const c_uchar,
163        outlen: *mut size_t,
164        x: *mut X509,
165        chainidx: size_t,
166        al: *mut c_int,
167        add_arg: *mut c_void,
168    ) -> c_int,
169>;
170
171#[cfg(ossl111)]
172pub type SSL_custom_ext_free_cb_ex = Option<
173    unsafe extern "C" fn(
174        ssl: *mut SSL,
175        ext_type: c_uint,
176        context: c_uint,
177        out: *const c_uchar,
178        add_arg: *mut c_void,
179    ),
180>;
181
182#[cfg(ossl111)]
183pub type SSL_custom_ext_parse_cb_ex = Option<
184    unsafe extern "C" fn(
185        ssl: *mut SSL,
186        ext_type: c_uint,
187        context: c_uint,
188        input: *const c_uchar,
189        inlen: size_t,
190        x: *mut X509,
191        chainidx: size_t,
192        al: *mut c_int,
193        parse_arg: *mut c_void,
194    ) -> c_int,
195>;
196
197cfg_if! {
198    if #[cfg(ossl300)] {
199        extern "C" {
200            pub fn SSL_CTX_get_options(ctx: *const SSL_CTX) -> u64;
201            pub fn SSL_CTX_set_options(ctx: *mut SSL_CTX, op: u64) -> u64;
202            pub fn SSL_CTX_clear_options(ctx: *mut SSL_CTX, op: u64) -> u64;
203        }
204    } else if #[cfg(ossl110)] {
205        extern "C" {
206            pub fn SSL_CTX_get_options(ctx: *const SSL_CTX) -> c_ulong;
207            pub fn SSL_CTX_set_options(ctx: *mut SSL_CTX, op: c_ulong) -> c_ulong;
208            pub fn SSL_CTX_clear_options(ctx: *mut SSL_CTX, op: c_ulong) -> c_ulong;
209        }
210    }
211}
212
213pub type GEN_SESSION_CB =
214    Option<unsafe extern "C" fn(*const SSL, *mut c_uchar, *mut c_uint) -> c_int>;
215
216extern "C" {
217    pub fn SSL_CTX_sess_set_new_cb(
218        ctx: *mut SSL_CTX,
219        new_session_cb: Option<unsafe extern "C" fn(*mut SSL, *mut SSL_SESSION) -> c_int>,
220    );
221    pub fn SSL_CTX_sess_set_remove_cb(
222        ctx: *mut SSL_CTX,
223        remove_session_cb: Option<unsafe extern "C" fn(*mut SSL_CTX, *mut SSL_SESSION)>,
224    );
225}
226cfg_if! {
227    // const change in passed function pointer signature
228    if #[cfg(any(ossl110, libressl280))] {
229        extern "C" {
230            pub fn SSL_CTX_sess_set_get_cb(
231                ctx: *mut SSL_CTX,
232                get_session_cb: Option<
233                    unsafe extern "C" fn(*mut SSL, *const c_uchar, c_int, *mut c_int) -> *mut SSL_SESSION,
234                >,
235            );
236        }
237    } else {
238        extern "C" {
239            pub fn SSL_CTX_sess_set_get_cb(
240                ctx: *mut SSL_CTX,
241                get_session_cb: Option<
242                    unsafe extern "C" fn(*mut SSL, *mut c_uchar, c_int, *mut c_int) -> *mut SSL_SESSION,
243                >,
244            );
245        }
246    }
247}
248extern "C" {
249    // FIXME change to unsafe extern "C" fn
250    pub fn SSL_CTX_set_cookie_generate_cb(
251        s: *mut SSL_CTX,
252        cb: Option<
253            extern "C" fn(ssl: *mut SSL, cookie: *mut c_uchar, cookie_len: *mut c_uint) -> c_int,
254        >,
255    );
256}
257
258cfg_if! {
259    // const change in passed function pointer signature
260    if #[cfg(any(ossl110, libressl280))] {
261        extern "C" {
262            pub fn SSL_CTX_set_cookie_verify_cb(
263                s: *mut SSL_CTX,
264                cb: Option<
265                    extern "C" fn(ssl: *mut SSL, cookie: *const c_uchar, cookie_len: c_uint) -> c_int,
266                >,
267            );
268        }
269    } else {
270        extern "C" {
271            pub fn SSL_CTX_set_cookie_verify_cb(
272                s: *mut SSL_CTX,
273                cb: Option<extern "C" fn(ssl: *mut SSL, cookie: *mut c_uchar, cookie_len: c_uint) -> c_int>,
274            );
275        }
276    }
277}
278
279extern "C" {
280    #[cfg(ossl111)]
281    pub fn SSL_CTX_set_stateless_cookie_generate_cb(
282        s: *mut SSL_CTX,
283        cb: Option<
284            unsafe extern "C" fn(
285                ssl: *mut SSL,
286                cookie: *mut c_uchar,
287                cookie_len: *mut size_t,
288            ) -> c_int,
289        >,
290    );
291    #[cfg(ossl111)]
292    pub fn SSL_CTX_set_stateless_cookie_verify_cb(
293        s: *mut SSL_CTX,
294        cb: Option<
295            unsafe extern "C" fn(
296                ssl: *mut SSL,
297                cookie: *const c_uchar,
298                cookie_len: size_t,
299            ) -> c_int,
300        >,
301    );
302
303    pub fn SSL_CTX_set_next_protos_advertised_cb(
304        ssl: *mut SSL_CTX,
305        cb: extern "C" fn(
306            ssl: *mut SSL,
307            out: *mut *const c_uchar,
308            outlen: *mut c_uint,
309            arg: *mut c_void,
310        ) -> c_int,
311        arg: *mut c_void,
312    );
313    pub fn SSL_CTX_set_next_proto_select_cb(
314        ssl: *mut SSL_CTX,
315        cb: extern "C" fn(
316            ssl: *mut SSL,
317            out: *mut *mut c_uchar,
318            outlen: *mut c_uchar,
319            inbuf: *const c_uchar,
320            inlen: c_uint,
321            arg: *mut c_void,
322        ) -> c_int,
323        arg: *mut c_void,
324    );
325    pub fn SSL_get0_next_proto_negotiated(
326        s: *const SSL,
327        data: *mut *const c_uchar,
328        len: *mut c_uint,
329    );
330
331    pub fn SSL_select_next_proto(
332        out: *mut *mut c_uchar,
333        outlen: *mut c_uchar,
334        inbuf: *const c_uchar,
335        inlen: c_uint,
336        client: *const c_uchar,
337        client_len: c_uint,
338    ) -> c_int;
339}
340
341extern "C" {
342    #[cfg(any(ossl102, libressl261))]
343    pub fn SSL_CTX_set_alpn_protos(s: *mut SSL_CTX, data: *const c_uchar, len: c_uint) -> c_int;
344    #[cfg(any(ossl102, libressl261))]
345    pub fn SSL_set_alpn_protos(s: *mut SSL, data: *const c_uchar, len: c_uint) -> c_int;
346    #[cfg(any(ossl102, libressl261))]
347    pub fn SSL_CTX_set_alpn_select_cb(
348        ssl: *mut SSL_CTX,
349        cb: Option<
350            unsafe extern "C" fn(
351                ssl: *mut SSL,
352                out: *mut *const c_uchar,
353                outlen: *mut c_uchar,
354                inbuf: *const c_uchar,
355                inlen: c_uint,
356                arg: *mut c_void,
357            ) -> c_int,
358        >,
359        arg: *mut c_void,
360    );
361    #[cfg(any(ossl102, libressl261))]
362    pub fn SSL_get0_alpn_selected(s: *const SSL, data: *mut *const c_uchar, len: *mut c_uint);
363}
364
365#[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
366extern "C" {
367    pub fn SSL_CTX_set_psk_client_callback(
368        ssl: *mut SSL_CTX,
369        psk_client_cb: Option<
370            extern "C" fn(
371                *mut SSL,
372                *const c_char,
373                *mut c_char,
374                c_uint,
375                *mut c_uchar,
376                c_uint,
377            ) -> c_uint,
378        >,
379    );
380    pub fn SSL_CTX_set_psk_server_callback(
381        ssl: *mut SSL_CTX,
382        psk_server_cb: Option<
383            extern "C" fn(*mut SSL, *const c_char, *mut c_uchar, c_uint) -> c_uint,
384        >,
385    );
386    pub fn SSL_get_psk_identity_hint(ssl: *const SSL) -> *const c_char;
387    pub fn SSL_get_psk_identity(ssl: *const SSL) -> *const c_char;
388}
389
390extern "C" {
391    #[cfg(ossl111)]
392    pub fn SSL_CTX_add_custom_ext(
393        ctx: *mut SSL_CTX,
394        ext_type: c_uint,
395        context: c_uint,
396        add_cb: SSL_custom_ext_add_cb_ex,
397        free_cb: SSL_custom_ext_free_cb_ex,
398        add_arg: *mut c_void,
399        parse_cb: SSL_custom_ext_parse_cb_ex,
400        parse_arg: *mut c_void,
401    ) -> c_int;
402
403    #[cfg(ossl102)]
404    pub fn SSL_extension_supported(ext_type: c_uint) -> c_int;
405}
406
407#[cfg(ossl111)]
408pub type SSL_CTX_keylog_cb_func =
409    Option<unsafe extern "C" fn(ssl: *const SSL, line: *const c_char)>;
410
411extern "C" {
412    #[cfg(ossl111)]
413    pub fn SSL_CTX_set_keylog_callback(ctx: *mut SSL_CTX, cb: SSL_CTX_keylog_cb_func);
414
415    #[cfg(any(ossl111, libressl340))]
416    pub fn SSL_CTX_set_max_early_data(ctx: *mut SSL_CTX, max_early_data: u32) -> c_int;
417    #[cfg(any(ossl111, libressl340))]
418    pub fn SSL_CTX_get_max_early_data(ctx: *const SSL_CTX) -> u32;
419    #[cfg(any(ossl111, libressl340))]
420    pub fn SSL_set_max_early_data(ctx: *mut SSL, max_early_data: u32) -> c_int;
421    #[cfg(any(ossl111, libressl340))]
422    pub fn SSL_get_max_early_data(ctx: *const SSL) -> u32;
423
424    pub fn SSL_get_finished(s: *const SSL, buf: *mut c_void, count: size_t) -> size_t;
425    pub fn SSL_get_peer_finished(s: *const SSL, buf: *mut c_void, count: size_t) -> size_t;
426
427    pub fn SSL_CTX_get_verify_mode(ctx: *const SSL_CTX) -> c_int;
428    pub fn SSL_get_verify_mode(s: *const SSL) -> c_int;
429}
430
431const_ptr_api! {
432    extern "C" {
433        #[cfg(ossl110)]
434        pub fn SSL_is_init_finished(s: #[const_ptr_if(ossl111)] SSL) -> c_int;
435    }
436}
437
438cfg_if! {
439    if #[cfg(libressl261)] {
440        extern "C" {
441            pub fn SSL_CTX_set_min_proto_version(ctx: *mut SSL_CTX, version: u16) -> c_int;
442            pub fn SSL_CTX_set_max_proto_version(ctx: *mut SSL_CTX, version: u16) -> c_int;
443            pub fn SSL_set_min_proto_version(s: *mut SSL, version: u16) -> c_int;
444            pub fn SSL_set_max_proto_version(s: *mut SSL, version: u16) -> c_int;
445        }
446    }
447}
448
449cfg_if! {
450    if #[cfg(libressl270)] {
451        extern "C" {
452            pub fn SSL_CTX_get_min_proto_version(ctx: *mut SSL_CTX) -> c_int;
453            pub fn SSL_CTX_get_max_proto_version(ctx: *mut SSL_CTX) -> c_int;
454            pub fn SSL_get_min_proto_version(s: *mut SSL) -> c_int;
455            pub fn SSL_get_max_proto_version(s: *mut SSL) -> c_int;
456        }
457    }
458}
459
460extern "C" {
461    pub fn SSL_CTX_set_cipher_list(ssl: *mut SSL_CTX, s: *const c_char) -> c_int;
462    pub fn SSL_CTX_new(method: *const SSL_METHOD) -> *mut SSL_CTX;
463    pub fn SSL_CTX_free(ctx: *mut SSL_CTX);
464    #[cfg(any(ossl110, libressl273))]
465    pub fn SSL_CTX_up_ref(x: *mut SSL_CTX) -> c_int;
466    pub fn SSL_CTX_get_cert_store(ctx: *const SSL_CTX) -> *mut X509_STORE;
467    pub fn SSL_CTX_set_cert_store(ctx: *mut SSL_CTX, store: *mut X509_STORE);
468
469    pub fn SSL_get_current_cipher(ssl: *const SSL) -> *const SSL_CIPHER;
470    pub fn SSL_CIPHER_get_bits(cipher: *const SSL_CIPHER, alg_bits: *mut c_int) -> c_int;
471}
472const_ptr_api! {
473    extern "C" {
474        pub fn SSL_CIPHER_get_version(cipher: *const SSL_CIPHER) -> #[const_ptr_if(any(ossl110, libressl280))] c_char;
475    }
476}
477extern "C" {
478    #[cfg(ossl111)]
479    pub fn SSL_CIPHER_get_handshake_digest(cipher: *const SSL_CIPHER) -> *const EVP_MD;
480    #[cfg(ossl111)]
481    pub fn SSL_CIPHER_get_protocol_id(cipher: *const SSL_CIPHER) -> u16;
482    pub fn SSL_CIPHER_get_name(cipher: *const SSL_CIPHER) -> *const c_char;
483    #[cfg(ossl111)]
484    pub fn SSL_CIPHER_standard_name(cipher: *const SSL_CIPHER) -> *const c_char;
485    #[cfg(ossl111)]
486    pub fn OPENSSL_cipher_name(rfc_name: *const c_char) -> *const c_char;
487
488    pub fn SSL_pending(ssl: *const SSL) -> c_int;
489    pub fn SSL_set_bio(ssl: *mut SSL, rbio: *mut BIO, wbio: *mut BIO);
490    pub fn SSL_get_rbio(ssl: *const SSL) -> *mut BIO;
491    pub fn SSL_get_wbio(ssl: *const SSL) -> *mut BIO;
492    #[cfg(any(ossl111, libressl340))]
493    pub fn SSL_CTX_set_ciphersuites(ctx: *mut SSL_CTX, str: *const c_char) -> c_int;
494    #[cfg(any(ossl111, libressl340))]
495    pub fn SSL_set_ciphersuites(ssl: *mut SSL, str: *const c_char) -> c_int;
496    pub fn SSL_set_cipher_list(ssl: *mut SSL, s: *const c_char) -> c_int;
497    pub fn SSL_set_ssl_method(s: *mut SSL, method: *const SSL_METHOD) -> c_int;
498    pub fn SSL_set_verify(
499        ssl: *mut SSL,
500        mode: c_int,
501        // FIXME should be unsafe
502        verify_callback: Option<extern "C" fn(c_int, *mut X509_STORE_CTX) -> c_int>,
503    );
504    pub fn SSL_CTX_use_PrivateKey(ctx: *mut SSL_CTX, key: *mut EVP_PKEY) -> c_int;
505    pub fn SSL_CTX_use_certificate(ctx: *mut SSL_CTX, cert: *mut X509) -> c_int;
506
507    pub fn SSL_CTX_use_PrivateKey_file(
508        ctx: *mut SSL_CTX,
509        key_file: *const c_char,
510        file_type: c_int,
511    ) -> c_int;
512    pub fn SSL_CTX_use_certificate_file(
513        ctx: *mut SSL_CTX,
514        cert_file: *const c_char,
515        file_type: c_int,
516    ) -> c_int;
517    pub fn SSL_CTX_use_certificate_chain_file(
518        ctx: *mut SSL_CTX,
519        cert_chain_file: *const c_char,
520    ) -> c_int;
521    pub fn SSL_use_PrivateKey_file(ssl: *mut SSL, file: *const c_char, type_: c_int) -> c_int;
522    pub fn SSL_use_PrivateKey(ssl: *mut SSL, pkey: *mut EVP_PKEY) -> c_int;
523    pub fn SSL_use_certificate(ssl: *mut SSL, x: *mut X509) -> c_int;
524    #[cfg(any(ossl110, libressl332))]
525    pub fn SSL_use_certificate_chain_file(ssl: *mut SSL, file: *const c_char) -> c_int;
526    pub fn SSL_set_client_CA_list(s: *mut SSL, name_list: *mut stack_st_X509_NAME);
527    pub fn SSL_add_client_CA(ssl: *mut SSL, x: *mut X509) -> c_int;
528    pub fn SSL_load_client_CA_file(file: *const c_char) -> *mut stack_st_X509_NAME;
529
530    #[cfg(not(ossl110))]
531    pub fn SSL_load_error_strings();
532    pub fn SSL_state_string(ssl: *const SSL) -> *const c_char;
533    pub fn SSL_state_string_long(ssl: *const SSL) -> *const c_char;
534
535    pub fn SSL_SESSION_get_time(s: *const SSL_SESSION) -> c_long;
536    pub fn SSL_SESSION_get_timeout(s: *const SSL_SESSION) -> c_long;
537    #[cfg(any(ossl110, libressl270))]
538    pub fn SSL_SESSION_get_protocol_version(s: *const SSL_SESSION) -> c_int;
539
540    #[cfg(any(ossl111, libressl340))]
541    pub fn SSL_SESSION_set_max_early_data(ctx: *mut SSL_SESSION, max_early_data: u32) -> c_int;
542    #[cfg(any(ossl111, libressl340))]
543    pub fn SSL_SESSION_get_max_early_data(ctx: *const SSL_SESSION) -> u32;
544
545    pub fn SSL_SESSION_get_id(s: *const SSL_SESSION, len: *mut c_uint) -> *const c_uchar;
546    #[cfg(any(ossl110, libressl273))]
547    pub fn SSL_SESSION_up_ref(ses: *mut SSL_SESSION) -> c_int;
548    pub fn SSL_SESSION_free(s: *mut SSL_SESSION);
549}
550cfg_if! {
551    if #[cfg(tongsuo)] {
552        extern "C" {
553            pub fn SSL_CTX_use_enc_PrivateKey(ctx: *mut SSL_CTX, pkey: *mut EVP_PKEY) -> c_int;
554            pub fn SSL_CTX_use_sign_PrivateKey(ctx: *mut SSL_CTX, pkey: *mut EVP_PKEY) -> c_int;
555            pub fn SSL_CTX_use_enc_PrivateKey_file(ctx: *mut SSL_CTX, file: *const c_char, type_: c_int) -> c_int;
556            pub fn SSL_CTX_use_sign_PrivateKey_file(ctx: *mut SSL_CTX, file: *const c_char, type_: c_int) -> c_int;
557            pub fn SSL_CTX_enable_ntls(ctx: *mut SSL_CTX);
558            pub fn SSL_CTX_disable_ntls(ctx: *mut SSL_CTX);
559            #[cfg(ossl300)]
560            pub fn SSL_CTX_enable_force_ntls(ctx: *mut SSL_CTX);
561            #[cfg(ossl300)]
562            pub fn SSL_CTX_disable_force_ntls(ctx: *mut SSL_CTX);
563            pub fn SSL_enable_ntls(s: *mut SSL);
564            pub fn SSL_disable_ntls(s: *mut SSL);
565            #[cfg(ossl300)]
566            pub fn SSL_enable_force_ntls(s: *mut SSL);
567            #[cfg(ossl300)]
568            pub fn SSL_disable_force_ntls(s: *mut SSL);
569            pub fn SSL_CTX_enable_sm_tls13_strict(ctx: *mut SSL_CTX);
570            pub fn SSL_CTX_disable_sm_tls13_strict(ctx: *mut SSL_CTX);
571            pub fn SSL_enable_sm_tls13_strict(s: *mut SSL);
572            pub fn SSL_disable_sm_tls13_strict(s: *mut SSL);
573            pub fn SSL_CTX_use_enc_certificate(ctx: *mut SSL_CTX, x: *mut X509) -> c_int;
574            pub fn SSL_CTX_use_sign_certificate(ctx: *mut SSL_CTX, x: *mut X509) -> c_int;
575            pub fn SSL_CTX_use_enc_certificate_file(ctx: *mut SSL_CTX, file: *const c_char, type_: c_int) -> c_int;
576            pub fn SSL_CTX_use_sign_certificate_file(ctx: *mut SSL_CTX, file: *const c_char, type_: c_int) -> c_int;
577            pub fn SSL_is_ntls(s: *const SSL) -> c_int;
578            pub fn NTLS_method() -> *const SSL_METHOD;
579            pub fn NTLS_server_method() -> *const SSL_METHOD;
580            pub fn NTLS_client_method() -> *const SSL_METHOD;
581            pub fn SSL_set_ciphers(s: *mut SSL, cipher_list: *mut stack_st_SSL_CIPHER) -> c_int;
582            pub fn SSL_set_ciphers_by_id(s: *mut SSL, cipher_list_by_id: *mut stack_st_SSL_CIPHER) -> c_int;
583            pub fn SSL_CTX_set_ciphers(ctx: *mut SSL_CTX, cipher_list: *mut stack_st_SSL_CIPHER) -> c_int;
584            pub fn SSL_CTX_get_ciphers_by_id(ctx: *const SSL_CTX) -> *mut stack_st_SSL_CIPHER;
585            pub fn SSL_CTX_set_ciphers_by_id(ctx: *mut SSL_CTX, cipher_list_by_id: *mut stack_st_SSL_CIPHER) -> c_int;
586            pub fn SSL_use_sign_certificate(ssl: *mut SSL, x: *mut X509) -> c_int;
587            pub fn SSL_use_sign_certificate_file(ssl: *mut SSL, file: *const c_char, type_: c_int) -> c_int;
588            pub fn SSL_use_enc_certificate(ssl: *mut SSL, x: *mut X509) -> c_int;
589            pub fn SSL_use_enc_certificate_file(ssl: *mut SSL, file: *const c_char, type_: c_int) -> c_int;
590            pub fn SSL_use_enc_PrivateKey(ssl: *mut SSL, pkey: *mut EVP_PKEY) -> c_int;
591            pub fn SSL_use_enc_PrivateKey_file(ssl: *mut SSL, file: *const c_char, type_: c_int) -> c_int;
592            pub fn SSL_use_sign_PrivateKey(ssl: *mut SSL, pkey: *mut EVP_PKEY) -> c_int;
593            pub fn SSL_use_sign_PrivateKey_file(ssl: *mut SSL, file: *const c_char, type_: c_int) -> c_int;
594        }
595    }
596}
597const_ptr_api! {
598    extern "C" {
599        pub fn i2d_SSL_SESSION(s: #[const_ptr_if(ossl300)] SSL_SESSION, pp: *mut *mut c_uchar) -> c_int;
600    }
601}
602extern "C" {
603    pub fn SSL_set_session(ssl: *mut SSL, session: *mut SSL_SESSION) -> c_int;
604    pub fn SSL_CTX_add_session(ctx: *mut SSL_CTX, session: *mut SSL_SESSION) -> c_int;
605    pub fn SSL_CTX_remove_session(ctx: *mut SSL_CTX, session: *mut SSL_SESSION) -> c_int;
606    pub fn d2i_SSL_SESSION(
607        a: *mut *mut SSL_SESSION,
608        pp: *mut *const c_uchar,
609        len: c_long,
610    ) -> *mut SSL_SESSION;
611
612    #[cfg(not(ossl300))]
613    pub fn SSL_get_peer_certificate(ssl: *const SSL) -> *mut X509;
614    #[cfg(ossl300)]
615    pub fn SSL_get1_peer_certificate(ssl: *const SSL) -> *mut X509;
616
617    pub fn SSL_get_peer_cert_chain(ssl: *const SSL) -> *mut stack_st_X509;
618
619    pub fn SSL_CTX_set_verify(
620        ctx: *mut SSL_CTX,
621        mode: c_int,
622        verify_callback: Option<extern "C" fn(c_int, *mut X509_STORE_CTX) -> c_int>,
623    );
624    pub fn SSL_CTX_set_verify_depth(ctx: *mut SSL_CTX, depth: c_int);
625
626    #[cfg(any(ossl111, libressl340))]
627    pub fn SSL_CTX_set_post_handshake_auth(ctx: *mut SSL_CTX, val: c_int);
628
629    pub fn SSL_CTX_check_private_key(ctx: *const SSL_CTX) -> c_int;
630
631    pub fn SSL_CTX_set_session_id_context(
632        ssl: *mut SSL_CTX,
633        sid_ctx: *const c_uchar,
634        sid_ctx_len: c_uint,
635    ) -> c_int;
636
637    pub fn SSL_new(ctx: *mut SSL_CTX) -> *mut SSL;
638
639    #[cfg(any(ossl102, libressl261))]
640    pub fn SSL_CTX_get0_param(ctx: *mut SSL_CTX) -> *mut X509_VERIFY_PARAM;
641
642    #[cfg(any(ossl102, libressl261))]
643    pub fn SSL_get0_param(ssl: *mut SSL) -> *mut X509_VERIFY_PARAM;
644}
645
646#[cfg(ossl111)]
647pub type SSL_client_hello_cb_fn =
648    Option<unsafe extern "C" fn(s: *mut SSL, al: *mut c_int, arg: *mut c_void) -> c_int>;
649extern "C" {
650    #[cfg(ossl111)]
651    pub fn SSL_CTX_set_client_hello_cb(
652        c: *mut SSL_CTX,
653        cb: SSL_client_hello_cb_fn,
654        arg: *mut c_void,
655    );
656    #[cfg(ossl111)]
657    pub fn SSL_client_hello_isv2(s: *mut SSL) -> c_int;
658    #[cfg(ossl111)]
659    pub fn SSL_client_hello_get0_legacy_version(s: *mut SSL) -> c_uint;
660    #[cfg(ossl111)]
661    pub fn SSL_client_hello_get0_random(s: *mut SSL, out: *mut *const c_uchar) -> size_t;
662    #[cfg(ossl111)]
663    pub fn SSL_client_hello_get0_session_id(s: *mut SSL, out: *mut *const c_uchar) -> size_t;
664    #[cfg(ossl111)]
665    pub fn SSL_client_hello_get0_ciphers(s: *mut SSL, out: *mut *const c_uchar) -> size_t;
666    #[cfg(ossl111)]
667    pub fn SSL_client_hello_get0_compression_methods(
668        s: *mut SSL,
669        out: *mut *const c_uchar,
670    ) -> size_t;
671    #[cfg(ossl111)]
672    pub fn SSL_client_hello_get1_extensions_present(
673        s: *mut SSL,
674        out: *mut *mut c_int,
675        outlen: *mut size_t,
676    ) -> c_int;
677    #[cfg(ossl111)]
678    pub fn SSL_client_hello_get0_ext(
679        s: *mut SSL,
680        type_: c_uint,
681        out: *mut *const c_uchar,
682        outlen: *mut size_t,
683    ) -> c_int;
684
685    pub fn SSL_free(ssl: *mut SSL);
686    pub fn SSL_accept(ssl: *mut SSL) -> c_int;
687    #[cfg(ossl111)]
688    pub fn SSL_stateless(s: *mut SSL) -> c_int;
689    pub fn SSL_connect(ssl: *mut SSL) -> c_int;
690    pub fn SSL_read(ssl: *mut SSL, buf: *mut c_void, num: c_int) -> c_int;
691    #[cfg(any(ossl111, libressl350))]
692    pub fn SSL_read_ex(ssl: *mut SSL, buf: *mut c_void, num: usize, readbytes: *mut usize)
693        -> c_int;
694    pub fn SSL_peek(ssl: *mut SSL, buf: *mut c_void, num: c_int) -> c_int;
695    #[cfg(any(ossl111, libressl350))]
696    pub fn SSL_peek_ex(ssl: *mut SSL, buf: *mut c_void, num: usize, readbytes: *mut usize)
697        -> c_int;
698    #[cfg(any(ossl111, libressl340))]
699    pub fn SSL_read_early_data(
700        s: *mut SSL,
701        buf: *mut c_void,
702        num: size_t,
703        readbytes: *mut size_t,
704    ) -> c_int;
705    #[cfg(ossl111)]
706    pub fn SSL_bytes_to_cipher_list(
707        s: *mut SSL,
708        bytes: *const c_uchar,
709        len: size_t,
710        isv2format: c_int,
711        sk: *mut *mut stack_st_SSL_CIPHER,
712        scsvs: *mut *mut stack_st_SSL_CIPHER,
713    ) -> c_int;
714}
715
716extern "C" {
717    pub fn SSL_write(ssl: *mut SSL, buf: *const c_void, num: c_int) -> c_int;
718    #[cfg(any(ossl111, libressl350))]
719    pub fn SSL_write_ex(
720        ssl: *mut SSL,
721        buf: *const c_void,
722        num: size_t,
723        written: *mut size_t,
724    ) -> c_int;
725    #[cfg(any(ossl111, libressl340))]
726    pub fn SSL_write_early_data(
727        s: *mut SSL,
728        buf: *const c_void,
729        num: size_t,
730        written: *mut size_t,
731    ) -> c_int;
732    pub fn SSL_ctrl(ssl: *mut SSL, cmd: c_int, larg: c_long, parg: *mut c_void) -> c_long;
733    pub fn SSL_CTX_ctrl(ctx: *mut SSL_CTX, cmd: c_int, larg: c_long, parg: *mut c_void) -> c_long;
734    pub fn SSL_CTX_callback_ctrl(
735        ctx: *mut SSL_CTX,
736        cmd: c_int,
737        fp: Option<unsafe extern "C" fn()>,
738    ) -> c_long;
739}
740
741cfg_if! {
742    if #[cfg(any(ossl110, libressl291))] {
743        extern "C" {
744            pub fn TLS_method() -> *const SSL_METHOD;
745
746            pub fn DTLS_method() -> *const SSL_METHOD;
747
748            pub fn TLS_server_method() -> *const SSL_METHOD;
749
750            pub fn TLS_client_method() -> *const SSL_METHOD;
751
752            pub fn DTLS_server_method() -> *const SSL_METHOD;
753
754            pub fn DTLS_client_method() -> *const SSL_METHOD;
755        }
756    } else {
757        extern "C" {
758            #[cfg(not(osslconf = "OPENSSL_NO_SSL3_METHOD"))]
759            pub fn SSLv3_method() -> *const SSL_METHOD;
760
761            pub fn SSLv23_method() -> *const SSL_METHOD;
762
763            pub fn SSLv23_client_method() -> *const SSL_METHOD;
764
765            pub fn SSLv23_server_method() -> *const SSL_METHOD;
766
767            pub fn TLSv1_method() -> *const SSL_METHOD;
768
769            pub fn TLSv1_1_method() -> *const SSL_METHOD;
770
771            pub fn TLSv1_2_method() -> *const SSL_METHOD;
772
773            pub fn DTLSv1_method() -> *const SSL_METHOD;
774
775            #[cfg(ossl102)]
776            pub fn DTLSv1_2_method() -> *const SSL_METHOD;
777        }
778    }
779}
780
781extern "C" {
782    pub fn SSL_get_error(ssl: *const SSL, ret: c_int) -> c_int;
783    pub fn SSL_get_version(ssl: *const SSL) -> *const c_char;
784
785    pub fn SSL_do_handshake(ssl: *mut SSL) -> c_int;
786    pub fn SSL_shutdown(ssl: *mut SSL) -> c_int;
787
788    pub fn SSL_CTX_set_client_CA_list(ctx: *mut SSL_CTX, list: *mut stack_st_X509_NAME);
789
790    pub fn SSL_CTX_add_client_CA(ctx: *mut SSL_CTX, cacert: *mut X509) -> c_int;
791
792    pub fn SSL_CTX_set_default_verify_paths(ctx: *mut SSL_CTX) -> c_int;
793    pub fn SSL_CTX_load_verify_locations(
794        ctx: *mut SSL_CTX,
795        CAfile: *const c_char,
796        CApath: *const c_char,
797    ) -> c_int;
798}
799
800const_ptr_api! {
801    extern "C" {
802        pub fn SSL_get_ssl_method(ssl: #[const_ptr_if(ossl111b)] SSL) -> *const SSL_METHOD;
803    }
804}
805
806extern "C" {
807    pub fn SSL_set_connect_state(s: *mut SSL);
808    pub fn SSL_set_accept_state(s: *mut SSL);
809
810    #[cfg(not(ossl110))]
811    pub fn SSL_library_init() -> c_int;
812
813    pub fn SSL_CIPHER_description(
814        cipher: *const SSL_CIPHER,
815        buf: *mut c_char,
816        size: c_int,
817    ) -> *mut c_char;
818
819    pub fn SSL_get_certificate(ssl: *const SSL) -> *mut X509;
820}
821const_ptr_api! {
822    extern "C" {
823        pub fn SSL_get_privatekey(ssl: #[const_ptr_if(any(ossl102, libressl280))] SSL) -> *mut EVP_PKEY;
824    }
825}
826
827extern "C" {
828    #[cfg(any(ossl102, libressl270))]
829    pub fn SSL_CTX_get0_certificate(ctx: *const SSL_CTX) -> *mut X509;
830    #[cfg(any(ossl102, libressl340))]
831    pub fn SSL_CTX_get0_privatekey(ctx: *const SSL_CTX) -> *mut EVP_PKEY;
832
833    pub fn SSL_set_shutdown(ss: *mut SSL, mode: c_int);
834    pub fn SSL_get_shutdown(ssl: *const SSL) -> c_int;
835    pub fn SSL_version(ssl: *const SSL) -> c_int;
836    pub fn SSL_get_session(s: *const SSL) -> *mut SSL_SESSION;
837    pub fn SSL_get_SSL_CTX(ssl: *const SSL) -> *mut SSL_CTX;
838    pub fn SSL_set_SSL_CTX(ssl: *mut SSL, ctx: *mut SSL_CTX) -> *mut SSL_CTX;
839
840    pub fn SSL_get_verify_result(ssl: *const SSL) -> c_long;
841    #[cfg(ossl110)]
842    pub fn SSL_get0_verified_chain(ssl: *const SSL) -> *mut stack_st_X509;
843
844    #[cfg(any(ossl110, libressl270))]
845    pub fn SSL_get_client_random(ssl: *const SSL, out: *mut c_uchar, len: size_t) -> size_t;
846    #[cfg(any(ossl110, libressl270))]
847    pub fn SSL_get_server_random(ssl: *const SSL, out: *mut c_uchar, len: size_t) -> size_t;
848    #[cfg(any(ossl110, libressl273))]
849    pub fn SSL_SESSION_get_master_key(
850        session: *const SSL_SESSION,
851        out: *mut c_uchar,
852        outlen: size_t,
853    ) -> size_t;
854}
855
856extern "C" {
857    #[cfg(not(ossl110))]
858    pub fn SSL_get_ex_new_index(
859        argl: c_long,
860        argp: *mut c_void,
861        new_func: CRYPTO_EX_new,
862        dup_func: CRYPTO_EX_dup,
863        free_func: CRYPTO_EX_free,
864    ) -> c_int;
865
866    pub fn SSL_set_ex_data(ssl: *mut SSL, idx: c_int, data: *mut c_void) -> c_int;
867    pub fn SSL_get_ex_data(ssl: *const SSL, idx: c_int) -> *mut c_void;
868
869    #[cfg(not(ossl110))]
870    pub fn SSL_CTX_get_ex_new_index(
871        argl: c_long,
872        argp: *mut c_void,
873        new_func: CRYPTO_EX_new,
874        dup_func: CRYPTO_EX_dup,
875        free_func: CRYPTO_EX_free,
876    ) -> c_int;
877
878    pub fn SSL_CTX_set_ex_data(ctx: *mut SSL_CTX, idx: c_int, data: *mut c_void) -> c_int;
879    pub fn SSL_CTX_get_ex_data(ctx: *const SSL_CTX, idx: c_int) -> *mut c_void;
880
881    pub fn SSL_get_ex_data_X509_STORE_CTX_idx() -> c_int;
882}
883
884#[cfg(not(osslconf = "OPENSSL_NO_DEPRECATED_3_0"))]
885extern "C" {
886    pub fn SSL_CTX_set_info_callback(
887        ctx: *mut SSL_CTX,
888        cb: ::std::option::Option<
889            unsafe extern "C" fn(ssl: *const SSL, type_: ::libc::c_int, val: ::libc::c_int),
890        >,
891    );
892    pub fn SSL_set_info_callback(
893        ssl: *mut SSL,
894        cb: ::std::option::Option<
895            unsafe extern "C" fn(ssl: *const SSL, type_: ::libc::c_int, val: ::libc::c_int),
896        >,
897    );
898}
899
900extern "C" {
901    pub fn SSL_CTX_set_tmp_dh_callback(
902        ctx: *mut SSL_CTX,
903        dh: Option<
904            unsafe extern "C" fn(ssl: *mut SSL, is_export: c_int, keylength: c_int) -> *mut DH,
905        >,
906    );
907    pub fn SSL_set_tmp_dh_callback(
908        ctx: *mut SSL,
909        dh: Option<
910            unsafe extern "C" fn(ssl: *mut SSL, is_export: c_int, keylength: c_int) -> *mut DH,
911        >,
912    );
913    #[cfg(not(ossl110))]
914    pub fn SSL_CTX_set_tmp_ecdh_callback(
915        ctx: *mut SSL_CTX,
916        ecdh: Option<
917            unsafe extern "C" fn(ssl: *mut SSL, is_export: c_int, keylength: c_int) -> *mut EC_KEY,
918        >,
919    );
920    #[cfg(not(ossl110))]
921    pub fn SSL_set_tmp_ecdh_callback(
922        ssl: *mut SSL,
923        ecdh: Option<
924            unsafe extern "C" fn(ssl: *mut SSL, is_export: c_int, keylength: c_int) -> *mut EC_KEY,
925        >,
926    );
927}
928
929cfg_if! {
930    if #[cfg(libressl)] {
931        extern "C" {
932            pub fn SSL_get_current_compression(ssl: *mut SSL) -> *const libc::c_void;
933        }
934    } else if #[cfg(not(osslconf = "OPENSSL_NO_COMP"))] {
935        const_ptr_api! {
936            extern "C" {
937                pub fn SSL_get_current_compression(ssl: #[const_ptr_if(ossl111b)] SSL) -> *const COMP_METHOD;
938            }
939        }
940    }
941}
942cfg_if! {
943    if #[cfg(libressl)] {
944        extern "C" {
945            pub fn SSL_COMP_get_name(comp: *const libc::c_void) -> *const c_char;
946        }
947    } else if #[cfg(not(osslconf = "OPENSSL_NO_COMP"))] {
948        extern "C" {
949            pub fn SSL_COMP_get_name(comp: *const COMP_METHOD) -> *const c_char;
950        }
951    }
952}
953
954#[cfg(not(osslconf = "OPENSSL_NO_COMP"))]
955extern "C" {
956    #[cfg(ossl110)]
957    pub fn COMP_get_type(meth: *const COMP_METHOD) -> i32;
958}
959
960extern "C" {
961    #[cfg(any(ossl110, libressl270))]
962    pub fn SSL_CIPHER_get_cipher_nid(c: *const SSL_CIPHER) -> c_int;
963    #[cfg(any(ossl110, libressl270))]
964    pub fn SSL_CIPHER_get_digest_nid(c: *const SSL_CIPHER) -> c_int;
965}
966
967const_ptr_api! {
968    extern "C" {
969        #[cfg(ossl110)]
970        pub fn SSL_session_reused(ssl: #[const_ptr_if(ossl111c)] SSL) -> c_int;
971    }
972}
973
974const_ptr_api! {
975    extern "C" {
976        #[cfg(any(ossl102, libressl273))]
977        pub fn SSL_is_server(s: #[const_ptr_if(any(ossl110f, libressl273))] SSL) -> c_int;
978    }
979}
980
981extern "C" {
982    #[cfg(ossl110)]
983    pub fn OPENSSL_init_ssl(opts: u64, settings: *const OPENSSL_INIT_SETTINGS) -> c_int;
984}
985
986extern "C" {
987    #[cfg(ossl111)]
988    pub fn SSL_CTX_set_num_tickets(ctx: *mut SSL_CTX, num_tickets: size_t) -> c_int;
989
990    #[cfg(ossl111)]
991    pub fn SSL_set_num_tickets(s: *mut SSL, num_tickets: size_t) -> c_int;
992
993    #[cfg(ossl111b)]
994    pub fn SSL_CTX_get_num_tickets(ctx: *const SSL_CTX) -> size_t;
995    #[cfg(all(ossl111, not(ossl111b)))]
996    pub fn SSL_CTX_get_num_tickets(ctx: *mut SSL_CTX) -> size_t;
997
998    #[cfg(ossl111b)]
999    pub fn SSL_get_num_tickets(s: *const SSL) -> size_t;
1000    #[cfg(all(ossl111, not(ossl111b)))]
1001    pub fn SSL_get_num_tickets(s: *mut SSL) -> size_t;
1002}
1003
1004extern "C" {
1005    #[cfg(any(ossl110, libressl360))]
1006    pub fn SSL_CTX_set_security_level(ctx: *mut SSL_CTX, level: c_int);
1007
1008    #[cfg(any(ossl110, libressl360))]
1009    pub fn SSL_set_security_level(s: *mut SSL, level: c_int);
1010
1011    #[cfg(any(ossl110, libressl360))]
1012    pub fn SSL_CTX_get_security_level(ctx: *const SSL_CTX) -> c_int;
1013
1014    #[cfg(any(ossl110, libressl360))]
1015    pub fn SSL_get_security_level(s: *const SSL) -> c_int;
1016}
1017
1018#[cfg(ossl111)]
1019extern "C" {
1020    pub fn SSL_enable_ct(s: *mut SSL, validation_mode: c_int) -> c_int;
1021    pub fn SSL_CTX_enable_ct(ctx: *mut SSL_CTX, validation_mode: c_int) -> c_int;
1022    pub fn SSL_ct_is_enabled(s: *const SSL) -> c_int;
1023    pub fn SSL_CTX_ct_is_enabled(ctx: *const SSL_CTX) -> c_int;
1024}
1025
1026#[cfg(ossl320)]
1027extern "C" {
1028    pub fn SSL_CTX_compress_certs(ctx: *mut SSL_CTX, alg: c_int) -> c_int;
1029    pub fn SSL_compress_certs(ssl: *mut SSL, alg: c_int) -> c_int;
1030    pub fn SSL_CTX_set1_cert_comp_preference(
1031        ctx: *mut SSL_CTX,
1032        algs: *mut c_int,
1033        len: usize,
1034    ) -> c_int;
1035    pub fn SSL_set1_cert_comp_preference(ssl: *mut SSL, algs: *mut c_int, len: usize) -> c_int;
1036}
1037
1038#[cfg(tongsuo)]
1039pub type SSL_cert_compress_cb_fn = Option<
1040    unsafe extern "C" fn(
1041        s: *mut SSL,
1042        in_: *const c_uchar,
1043        inlen: usize,
1044        out: *mut c_uchar,
1045        outlen: *mut usize,
1046    ) -> c_int,
1047>;
1048#[cfg(tongsuo)]
1049pub type SSL_cert_decompress_cb_fn = Option<
1050    unsafe extern "C" fn(
1051        s: *mut SSL,
1052        in_: *const c_uchar,
1053        inlen: usize,
1054        out: *mut c_uchar,
1055        outlen: usize,
1056    ) -> c_int,
1057>;
1058#[cfg(tongsuo)]
1059extern "C" {
1060    pub fn SSL_get_cert_compression_compress_id(s: *mut SSL) -> c_int;
1061    pub fn SSL_get_cert_compression_decompress_id(s: *mut SSL) -> c_int;
1062    pub fn SSL_add_cert_compression_alg(
1063        s: *mut SSL,
1064        alg_id: c_int,
1065        compress: SSL_cert_compress_cb_fn,
1066        decompress: SSL_cert_decompress_cb_fn,
1067    ) -> c_int;
1068    pub fn SSL_CTX_add_cert_compression_alg(
1069        ctx: *mut SSL_CTX,
1070        alg_id: c_int,
1071        compress: SSL_cert_compress_cb_fn,
1072        decompress: SSL_cert_decompress_cb_fn,
1073    ) -> c_int;
1074}
1075
1076#[cfg(ossl320)]
1077extern "C" {
1078    pub fn OSSL_QUIC_client_method() -> *const SSL_METHOD;
1079    pub fn OSSL_QUIC_client_thread_method() -> *const SSL_METHOD;
1080    pub fn SSL_get_event_timeout(s: *mut SSL, tv: *mut timeval, is_infinite: *mut c_int) -> c_int;
1081    pub fn SSL_handle_events(s: *mut SSL) -> c_int;
1082    pub fn SSL_get_blocking_mode(s: *mut SSL) -> c_int;
1083    pub fn SSL_set_blocking_mode(s: *mut SSL, blocking: c_int) -> c_int;
1084    pub fn SSL_get_rpoll_descriptor(s: *mut SSL, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
1085    pub fn SSL_get_wpoll_descriptor(s: *mut SSL, desc: *mut BIO_POLL_DESCRIPTOR) -> c_int;
1086    pub fn SSL_net_read_desired(s: *mut SSL) -> c_int;
1087    pub fn SSL_net_write_desired(s: *mut SSL) -> c_int;
1088    pub fn SSL_set1_initial_peer_addr(s: *mut SSL, peer_addr: *const BIO_ADDR) -> c_int;
1089    pub fn SSL_shutdown_ex(
1090        ssl: *mut SSL,
1091        flags: u64,
1092        args: *const SSL_SHUTDOWN_EX_ARGS,
1093        args_len: usize,
1094    ) -> c_int;
1095    pub fn SSL_stream_conclude(ssl: *mut SSL, flags: u64) -> c_int;
1096    pub fn SSL_stream_reset(
1097        ssl: *mut SSL,
1098        args: *const SSL_STREAM_RESET_ARGS,
1099        args_len: usize,
1100    ) -> c_int;
1101    pub fn SSL_get_stream_read_state(ssl: *mut SSL) -> c_int;
1102    pub fn SSL_get_stream_write_state(ssl: *mut SSL) -> c_int;
1103    pub fn SSL_get_conn_close_info(
1104        ssl: *mut SSL,
1105        info: *mut SSL_CONN_CLOSE_INFO,
1106        info_len: usize,
1107    ) -> c_int;
1108    pub fn SSL_get0_connection(s: *mut SSL) -> *mut SSL;
1109    pub fn SSL_is_connection(s: *mut SSL) -> c_int;
1110    pub fn SSL_get_stream_type(s: *mut SSL) -> c_int;
1111    pub fn SSL_get_stream_id(s: *mut SSL) -> u64;
1112    pub fn SSL_new_stream(s: *mut SSL, flags: u64) -> *mut SSL;
1113    pub fn SSL_accept_stream(s: *mut SSL, flags: u64) -> *mut SSL;
1114    pub fn SSL_set_incoming_stream_policy(s: *mut SSL, policy: c_int, aec: u64) -> c_int;
1115    pub fn SSL_get_accept_stream_queue_len(s: *mut SSL) -> usize;
1116    pub fn SSL_set_default_stream_mode(s: *mut SSL, mode: u32) -> c_int;
1117}
1118
1119#[cfg(ossl330)]
1120extern "C" {
1121    pub fn SSL_write_ex2(
1122        s: *mut SSL,
1123        buf: *const c_void,
1124        num: usize,
1125        flags: u64,
1126        written: *mut usize,
1127    ) -> c_int;
1128    pub fn SSL_get_value_uint(s: *mut SSL, class_: u32, id: u32, v: *mut u64) -> c_int;
1129    pub fn SSL_set_value_uint(s: *mut SSL, class_: u32, id: u32, v: u64) -> c_int;
1130}
1131
1132#[cfg(ossl300)]
1133extern "C" {
1134    pub fn SSL_CTX_set0_tmp_dh_pkey(ctx: *mut SSL_CTX, dhpkey: *mut EVP_PKEY) -> c_int;
1135    pub fn SSL_set0_tmp_dh_pkey(s: *mut SSL, dhpkey: *mut EVP_PKEY) -> c_int;
1136}