1 use libc::*;
2 
3 #[allow(unused_imports)]
4 use *;
5 
6 pub enum ASN1_INTEGER {}
7 pub enum ASN1_GENERALIZEDTIME {}
8 pub enum ASN1_STRING {}
9 pub enum ASN1_BIT_STRING {}
10 pub enum ASN1_TIME {}
11 pub enum ASN1_TYPE {}
12 pub enum ASN1_OBJECT {}
13 pub enum ASN1_OCTET_STRING {}
14 
15 pub enum bio_st {} // FIXME remove
16 cfg_if! {
17     if #[cfg(any(ossl110, libressl280))] {
18         pub enum BIO {}
19     } else {
20         #[repr(C)]
21         pub struct BIO {
22             pub method: *mut BIO_METHOD,
23             pub callback: Option<
24                 unsafe extern "C" fn(*mut BIO, c_int, *const c_char, c_int, c_long, c_long) -> c_long,
25             >,
26             pub cb_arg: *mut c_char,
27             pub init: c_int,
28             pub shutdown: c_int,
29             pub flags: c_int,
30             pub retry_reason: c_int,
31             pub num: c_int,
32             pub ptr: *mut c_void,
33             pub next_bio: *mut BIO,
34             pub prev_bio: *mut BIO,
35             pub references: c_int,
36             pub num_read: c_ulong,
37             pub num_write: c_ulong,
38             pub ex_data: CRYPTO_EX_DATA,
39         }
40     }
41 }
42 cfg_if! {
43     if #[cfg(ossl110)] {
44         pub enum BIGNUM {}
45     } else {
46         #[repr(C)]
47         pub struct BIGNUM {
48             pub d: *mut BN_ULONG,
49             pub top: c_int,
50             pub dmax: c_int,
51             pub neg: c_int,
52             pub flags: c_int,
53         }
54     }
55 }
56 pub enum BN_BLINDING {}
57 pub enum BN_MONT_CTX {}
58 
59 pub enum BN_CTX {}
60 pub enum BN_GENCB {}
61 
62 cfg_if! {
63     if #[cfg(any(ossl110, libressl280))] {
64         pub enum EVP_CIPHER {}
65     } else {
66         #[repr(C)]
67         pub struct EVP_CIPHER {
68             pub nid: c_int,
69             pub block_size: c_int,
70             pub key_len: c_int,
71             pub iv_len: c_int,
72             pub flags: c_ulong,
73             pub init: Option<
74                 unsafe extern "C" fn(*mut EVP_CIPHER_CTX, *const c_uchar, *const c_uchar, c_int) -> c_int,
75             >,
76             pub do_cipher: Option<
77                 unsafe extern "C" fn(*mut EVP_CIPHER_CTX, *mut c_uchar, *const c_uchar, size_t) -> c_int,
78             >,
79             pub cleanup: Option<unsafe extern "C" fn(*mut EVP_CIPHER_CTX) -> c_int>,
80             pub ctx_size: c_int,
81             pub set_asn1_parameters:
82                 Option<unsafe extern "C" fn(*mut EVP_CIPHER_CTX, *mut ASN1_TYPE) -> c_int>,
83             pub get_asn1_parameters:
84                 Option<unsafe extern "C" fn(*mut EVP_CIPHER_CTX, *mut ASN1_TYPE) -> c_int>,
85             pub ctrl:
86                 Option<unsafe extern "C" fn(*mut EVP_CIPHER_CTX, c_int, c_int, *mut c_void) -> c_int>,
87             pub app_data: *mut c_void,
88         }
89     }
90 }
91 pub enum EVP_CIPHER_CTX {}
92 pub enum EVP_MD {}
93 cfg_if! {
94     if #[cfg(any(ossl110, libressl280))] {
95         pub enum EVP_MD_CTX {}
96     } else {
97         #[repr(C)]
98         pub struct EVP_MD_CTX {
99             digest: *mut EVP_MD,
100             engine: *mut ENGINE,
101             flags: c_ulong,
102             md_data: *mut c_void,
103             pctx: *mut EVP_PKEY_CTX,
104             update: *mut c_void,
105         }
106     }
107 }
108 cfg_if! {
109     if #[cfg(any(ossl110, libressl280))] {
110         pub enum EVP_PKEY {}
111     } else {
112         #[repr(C)]
113         pub struct EVP_PKEY {
114             pub type_: c_int,
115             pub save_type: c_int,
116             pub references: c_int,
117             pub ameth: *const EVP_PKEY_ASN1_METHOD,
118             pub engine: *mut ENGINE,
119             pub pkey: *mut c_void,
120             pub save_parameters: c_int,
121             pub attributes: *mut stack_st_X509_ATTRIBUTE,
122         }
123     }
124 }
125 
126 pub enum PKCS8_PRIV_KEY_INFO {}
127 
128 pub enum EVP_PKEY_ASN1_METHOD {}
129 
130 pub enum EVP_PKEY_CTX {}
131 
132 cfg_if! {
133     if #[cfg(any(ossl110, libressl280))] {
134         pub enum HMAC_CTX {}
135     } else {
136         #[repr(C)]
137         pub struct HMAC_CTX {
138             md: *mut EVP_MD,
139             md_ctx: EVP_MD_CTX,
140             i_ctx: EVP_MD_CTX,
141             o_ctx: EVP_MD_CTX,
142             key_length: c_uint,
143             key: [c_uchar; 128],
144         }
145     }
146 }
147 
148 cfg_if! {
149     if #[cfg(any(ossl110, libressl280))] {
150         pub enum DH {}
151     } else {
152         #[repr(C)]
153         pub struct DH {
154             pub pad: c_int,
155             pub version: c_int,
156             pub p: *mut ::BIGNUM,
157             pub g: *mut ::BIGNUM,
158             pub length: c_long,
159             pub pub_key: *mut ::BIGNUM,
160             pub priv_key: *mut ::BIGNUM,
161             pub flags: c_int,
162             pub method_mont_p: *mut ::BN_MONT_CTX,
163             pub q: *mut ::BIGNUM,
164             pub j: *mut ::BIGNUM,
165             pub seed: *mut c_uchar,
166             pub seedlen: c_int,
167             pub counter: *mut ::BIGNUM,
168             pub references: c_int,
169             pub ex_data: ::CRYPTO_EX_DATA,
170             pub meth: *const ::DH_METHOD,
171             pub engine: *mut ::ENGINE,
172         }
173     }
174 }
175 pub enum DH_METHOD {}
176 
177 cfg_if! {
178     if #[cfg(any(ossl110, libressl280))] {
179         pub enum DSA {}
180     } else {
181         #[repr(C)]
182         pub struct DSA {
183             pub pad: c_int,
184             pub version: c_long,
185             pub write_params: c_int,
186 
187             pub p: *mut BIGNUM,
188             pub q: *mut BIGNUM,
189             pub g: *mut BIGNUM,
190             pub pub_key: *mut BIGNUM,
191             pub priv_key: *mut BIGNUM,
192             pub kinv: *mut BIGNUM,
193             pub r: *mut BIGNUM,
194 
195             pub flags: c_int,
196             pub method_mont_p: *mut BN_MONT_CTX,
197             pub references: c_int,
198             pub ex_data: CRYPTO_EX_DATA,
199             pub meth: *const DSA_METHOD,
200             pub engine: *mut ENGINE,
201         }
202     }
203 }
204 pub enum DSA_METHOD {}
205 
206 cfg_if! {
207     if #[cfg(any(ossl110, libressl280))] {
208         pub enum RSA {}
209     } else if #[cfg(libressl)] {
210         #[repr(C)]
211         pub struct RSA {
212             pub pad: c_int,
213             pub version: c_long,
214             pub meth: *const ::RSA_METHOD,
215 
216             pub engine: *mut ::ENGINE,
217             pub n: *mut ::BIGNUM,
218             pub e: *mut ::BIGNUM,
219             pub d: *mut ::BIGNUM,
220             pub p: *mut ::BIGNUM,
221             pub q: *mut ::BIGNUM,
222             pub dmp1: *mut ::BIGNUM,
223             pub dmq1: *mut ::BIGNUM,
224             pub iqmp: *mut ::BIGNUM,
225 
226             pub ex_data: ::CRYPTO_EX_DATA,
227             pub references: c_int,
228             pub flags: c_int,
229 
230             pub _method_mod_n: *mut ::BN_MONT_CTX,
231             pub _method_mod_p: *mut ::BN_MONT_CTX,
232             pub _method_mod_q: *mut ::BN_MONT_CTX,
233 
234             pub blinding: *mut ::BN_BLINDING,
235             pub mt_blinding: *mut ::BN_BLINDING,
236         }
237     } else {
238         #[repr(C)]
239         pub struct RSA {
240             pub pad: c_int,
241             pub version: c_long,
242             pub meth: *const ::RSA_METHOD,
243 
244             pub engine: *mut ::ENGINE,
245             pub n: *mut ::BIGNUM,
246             pub e: *mut ::BIGNUM,
247             pub d: *mut ::BIGNUM,
248             pub p: *mut ::BIGNUM,
249             pub q: *mut ::BIGNUM,
250             pub dmp1: *mut ::BIGNUM,
251             pub dmq1: *mut ::BIGNUM,
252             pub iqmp: *mut ::BIGNUM,
253 
254             pub ex_data: ::CRYPTO_EX_DATA,
255             pub references: c_int,
256             pub flags: c_int,
257 
258             pub _method_mod_n: *mut ::BN_MONT_CTX,
259             pub _method_mod_p: *mut ::BN_MONT_CTX,
260             pub _method_mod_q: *mut ::BN_MONT_CTX,
261 
262             pub bignum_data: *mut c_char,
263             pub blinding: *mut ::BN_BLINDING,
264             pub mt_blinding: *mut ::BN_BLINDING,
265         }
266     }
267 }
268 pub enum RSA_METHOD {}
269 
270 pub enum EC_KEY {}
271 
272 cfg_if! {
273     if #[cfg(any(ossl110, libressl280))] {
274         pub enum X509 {}
275     } else if #[cfg(libressl)] {
276         #[repr(C)]
277         pub struct X509 {
278             pub cert_info: *mut X509_CINF,
279             pub sig_alg: *mut ::X509_ALGOR,
280             pub signature: *mut ::ASN1_BIT_STRING,
281             pub valid: c_int,
282             pub references: c_int,
283             pub name: *mut c_char,
284             pub ex_data: ::CRYPTO_EX_DATA,
285             pub ex_pathlen: c_long,
286             pub ex_pcpathlen: c_long,
287             pub ex_flags: c_ulong,
288             pub ex_kusage: c_ulong,
289             pub ex_xkusage: c_ulong,
290             pub ex_nscert: c_ulong,
291             skid: *mut c_void,
292             akid: *mut c_void,
293             policy_cache: *mut c_void,
294             crldp: *mut c_void,
295             altname: *mut c_void,
296             nc: *mut c_void,
297             #[cfg(not(osslconf = "OPENSSL_NO_SHA"))]
298             sha1_hash: [c_uchar; 20],
299             aux: *mut c_void,
300         }
301     } else {
302         #[repr(C)]
303         pub struct X509 {
304             pub cert_info: *mut X509_CINF,
305             pub sig_alg: *mut X509_ALGOR,
306             pub signature: *mut ASN1_BIT_STRING,
307             pub valid: c_int,
308             pub references: c_int,
309             pub name: *mut c_char,
310             pub ex_data: CRYPTO_EX_DATA,
311             pub ex_pathlen: c_long,
312             pub ex_pcpathlen: c_long,
313             pub ex_flags: c_ulong,
314             pub ex_kusage: c_ulong,
315             pub ex_xkusage: c_ulong,
316             pub ex_nscert: c_ulong,
317             skid: *mut c_void,
318             akid: *mut c_void,
319             policy_cache: *mut c_void,
320             crldp: *mut c_void,
321             altname: *mut c_void,
322             nc: *mut c_void,
323             #[cfg(not(osslconf = "OPENSSL_NO_RFC3779"))]
324             rfc3779_addr: *mut c_void,
325             #[cfg(not(osslconf = "OPENSSL_NO_RFC3779"))]
326             rfc3779_asid: *mut c_void,
327             #[cfg(not(osslconf = "OPENSSL_NO_SHA"))]
328             sha1_hash: [c_uchar; 20],
329             aux: *mut c_void,
330         }
331     }
332 }
333 cfg_if! {
334     if #[cfg(ossl110)] {
335         pub enum X509_ALGOR {}
336     } else {
337         #[repr(C)]
338         pub struct X509_ALGOR {
339             pub algorithm: *mut ::ASN1_OBJECT,
340             parameter: *mut c_void,
341         }
342     }
343 }
344 
345 pub enum X509_LOOKUP_METHOD {}
346 
347 pub enum X509_NAME {}
348 
349 cfg_if! {
350     if #[cfg(any(ossl110, libressl270))] {
351         pub enum X509_STORE {}
352     } else {
353         #[repr(C)]
354         pub struct X509_STORE {
355             cache: c_int,
356             pub objs: *mut stack_st_X509_OBJECT,
357             get_cert_methods: *mut stack_st_X509_LOOKUP,
358             param: *mut X509_VERIFY_PARAM,
359             verify: Option<extern "C" fn(ctx: *mut X509_STORE_CTX) -> c_int>,
360             verify_cb: Option<extern "C" fn(ok: c_int, ctx: *mut X509_STORE_CTX) -> c_int>,
361             get_issuer: Option<
362                 extern "C" fn(issuer: *mut *mut X509, ctx: *mut X509_STORE_CTX, x: *mut X509) -> c_int,
363             >,
364             check_issued:
365                 Option<extern "C" fn(ctx: *mut X509_STORE_CTX, x: *mut X509, issuer: *mut X509) -> c_int>,
366             check_revocation: Option<extern "C" fn(ctx: *mut X509_STORE_CTX) -> c_int>,
367             get_crl: Option<
368                 extern "C" fn(ctx: *mut X509_STORE_CTX, crl: *mut *mut X509_CRL, x: *mut X509) -> c_int,
369             >,
370             check_crl: Option<extern "C" fn(ctx: *mut X509_STORE_CTX, crl: *mut X509_CRL) -> c_int>,
371             cert_crl:
372                 Option<extern "C" fn(ctx: *mut X509_STORE_CTX, crl: *mut X509_CRL, x: *mut X509) -> c_int>,
373             lookup_certs:
374                 Option<extern "C" fn(ctx: *mut X509_STORE_CTX, nm: *const X509_NAME) -> *mut stack_st_X509>,
375             lookup_crls: Option<
376                 extern "C" fn(ctx: *const X509_STORE_CTX, nm: *const X509_NAME) -> *mut stack_st_X509_CRL,
377             >,
378             cleanup: Option<extern "C" fn(ctx: *mut X509_STORE_CTX) -> c_int>,
379             ex_data: CRYPTO_EX_DATA,
380             references: c_int,
381         }
382     }
383 }
384 
385 pub enum X509_STORE_CTX {}
386 
387 cfg_if! {
388     if #[cfg(any(ossl110, libressl280))] {
389         pub enum X509_VERIFY_PARAM {}
390     } else if #[cfg(libressl251)] {
391         #[repr(C)]
392         pub struct X509_VERIFY_PARAM {
393             pub name: *mut c_char,
394             pub check_time: time_t,
395             pub inh_flags: c_ulong,
396             pub flags: c_ulong,
397             pub purpose: c_int,
398             pub trust: c_int,
399             pub depth: c_int,
400             pub policies: *mut stack_st_ASN1_OBJECT,
401             id: *mut c_void,
402         }
403     } else if #[cfg(libressl)] {
404         #[repr(C)]
405         pub struct X509_VERIFY_PARAM {
406             pub name: *mut c_char,
407             pub check_time: time_t,
408             pub inh_flags: c_ulong,
409             pub flags: c_ulong,
410             pub purpose: c_int,
411             pub trust: c_int,
412             pub depth: c_int,
413             pub policies: *mut stack_st_ASN1_OBJECT,
414             //pub id: *mut X509_VERIFY_PARAM_ID,
415         }
416     } else {
417         #[repr(C)]
418         pub struct X509_VERIFY_PARAM {
419             pub name: *mut c_char,
420             pub check_time: time_t,
421             pub inh_flags: c_ulong,
422             pub flags: c_ulong,
423             pub purpose: c_int,
424             pub trust: c_int,
425             pub depth: c_int,
426             pub policies: *mut stack_st_ASN1_OBJECT,
427             #[cfg(ossl102)]
428             pub id: *mut X509_VERIFY_PARAM_ID,
429         }
430     }
431 }
432 
433 #[repr(C)]
434 pub struct X509V3_CTX {
435     flags: c_int,
436     issuer_cert: *mut c_void,
437     subject_cert: *mut c_void,
438     subject_req: *mut c_void,
439     crl: *mut c_void,
440     db_meth: *mut c_void,
441     db: *mut c_void,
442     // I like the last comment line, it is copied from OpenSSL sources:
443     // Maybe more here
444 }
445 pub enum CONF {}
446 #[cfg(ossl110)]
447 pub enum OPENSSL_INIT_SETTINGS {}
448 
449 pub enum ENGINE {}
450 cfg_if! {
451     if #[cfg(any(ossl110, libressl280))] {
452         pub enum SSL {}
453     } else if #[cfg(libressl251)] {
454         #[repr(C)]
455         pub struct SSL {
456             version: c_int,
457             method: *const ::SSL_METHOD,
458             rbio: *mut ::BIO,
459             wbio: *mut ::BIO,
460             bbio: *mut ::BIO,
461             pub server: c_int,
462             s3: *mut c_void,
463             d1: *mut c_void,
464             param: *mut c_void,
465             cipher_list: *mut stack_st_SSL_CIPHER,
466             cert: *mut c_void,
467             sid_ctx_length: c_uint,
468             sid_ctx: [c_uchar; ::SSL_MAX_SID_CTX_LENGTH as usize],
469             session: *mut ::SSL_SESSION,
470             verify_mode: c_int,
471             error: c_int,
472             error_code: c_int,
473             ctx: *mut ::SSL_CTX,
474             verify_result: c_long,
475             references: c_int,
476             client_version: c_int,
477             max_send_fragment: c_uint,
478             tlsext_hostname: *mut c_char,
479             tlsext_status_type: c_int,
480             initial_ctx: *mut ::SSL_CTX,
481             enc_read_ctx: *mut ::EVP_CIPHER_CTX,
482             read_hash: *mut EVP_MD_CTX,
483             internal: *mut c_void,
484         }
485     } else if #[cfg(libressl)] {
486         #[repr(C)]
487         pub struct SSL {
488             version: c_int,
489             type_: c_int,
490             method: *const ::SSL_METHOD,
491             rbio: *mut c_void,
492             wbio: *mut c_void,
493             bbio: *mut c_void,
494             rwstate: c_int,
495             in_handshake: c_int,
496             handshake_func: Option<unsafe extern "C" fn(*mut SSL) -> c_int>,
497             pub server: c_int,
498             new_session: c_int,
499             quiet_shutdown: c_int,
500             shutdown: c_int,
501             state: c_int,
502             rstate: c_int,
503             init_buf: *mut c_void,
504             init_msg: *mut c_void,
505             init_num: c_int,
506             init_off: c_int,
507             packet: *mut c_uchar,
508             packet_length: c_uint,
509             s3: *mut c_void,
510             d1: *mut c_void,
511             read_ahead: c_int,
512             msg_callback: Option<
513                 unsafe extern "C" fn(c_int,
514                                     c_int,
515                                     c_int,
516                                     *const c_void,
517                                     size_t,
518                                     *mut SSL,
519                                     *mut c_void),
520             >,
521             msg_callback_arg: *mut c_void,
522             hit: c_int,
523             param: *mut c_void,
524             cipher_list: *mut stack_st_SSL_CIPHER,
525             cipher_list_by_id: *mut stack_st_SSL_CIPHER,
526             mac_flags: c_int,
527             aead_read_ctx: *mut c_void,
528             enc_read_ctx: *mut ::EVP_CIPHER_CTX,
529             read_hash: *mut ::EVP_MD_CTX,
530             aead_write_ctx: *mut c_void,
531             enc_write_ctx: *mut ::EVP_CIPHER_CTX,
532             write_hash: *mut ::EVP_MD_CTX,
533             cert: *mut c_void,
534             sid_ctx_length: c_uint,
535             sid_ctx: [c_uchar; ::SSL_MAX_SID_CTX_LENGTH as usize],
536             session: *mut ::SSL_SESSION,
537             generate_session_id: ::GEN_SESSION_CB,
538             verify_mode: c_int,
539             verify_callback: Option<unsafe extern "C" fn(c_int, *mut ::X509_STORE_CTX) -> c_int>,
540             info_callback: Option<unsafe extern "C" fn(*mut SSL, c_int, c_int)>,
541             error: c_int,
542             error_code: c_int,
543             ctx: *mut ::SSL_CTX,
544             debug: c_int,
545             verify_result: c_long,
546             ex_data: ::CRYPTO_EX_DATA,
547             client_CA: *mut stack_st_X509_NAME,
548             references: c_int,
549             options: c_ulong,
550             mode: c_ulong,
551             max_cert_list: c_long,
552             first_packet: c_int,
553             client_version: c_int,
554             max_send_fragment: c_uint,
555             tlsext_debug_cb:
556                 Option<unsafe extern "C" fn(*mut SSL, c_int, c_int, *mut c_uchar, c_int, *mut c_void)>,
557             tlsext_debug_arg: *mut c_void,
558             tlsext_hostname: *mut c_char,
559             servername_done: c_int,
560             tlsext_status_type: c_int,
561             tlsext_status_expected: c_int,
562             tlsext_ocsp_ids: *mut c_void,
563             tlsext_ocsp_exts: *mut c_void,
564             tlsext_ocsp_resp: *mut c_uchar,
565             tlsext_ocsp_resplen: c_int,
566             tlsext_ticket_expected: c_int,
567             tlsext_ecpointformatlist_length: size_t,
568             tlsext_ecpointformatlist: *mut c_uchar,
569             tlsext_ellipticcurvelist_length: size_t,
570             tlsext_ellipticcurvelist: *mut c_uchar,
571             tlsext_session_ticket: *mut c_void,
572             tlsext_session_ticket_ext_cb: ::tls_session_ticket_ext_cb_fn,
573             tls_session_ticket_ext_cb_arg: *mut c_void,
574             tls_session_secret_cb: ::tls_session_secret_cb_fn,
575             tls_session_secret_cb_arg: *mut c_void,
576             initial_ctx: *mut ::SSL_CTX,
577             next_proto_negotiated: *mut c_uchar,
578             next_proto_negotiated_len: c_uchar,
579             srtp_profiles: *mut c_void,
580             srtp_profile: *mut c_void,
581             tlsext_heartbeat: c_uint,
582             tlsext_hb_pending: c_uint,
583             tlsext_hb_seq: c_uint,
584             alpn_client_proto_list: *mut c_uchar,
585             alpn_client_proto_list_len: c_uint,
586             renegotiate: c_int,
587         }
588     } else {
589         #[repr(C)]
590         pub struct SSL {
591             version: c_int,
592             type_: c_int,
593             method: *const ::SSL_METHOD,
594             rbio: *mut c_void,
595             wbio: *mut c_void,
596             bbio: *mut c_void,
597             rwstate: c_int,
598             in_handshake: c_int,
599             handshake_func: Option<unsafe extern "C" fn(*mut SSL) -> c_int>,
600             pub server: c_int,
601             new_session: c_int,
602             quiet_session: c_int,
603             shutdown: c_int,
604             state: c_int,
605             rstate: c_int,
606             init_buf: *mut c_void,
607             init_msg: *mut c_void,
608             init_num: c_int,
609             init_off: c_int,
610             packet: *mut c_uchar,
611             packet_length: c_uint,
612             s2: *mut c_void,
613             s3: *mut c_void,
614             d1: *mut c_void,
615             read_ahead: c_int,
616             msg_callback: Option<
617                 unsafe extern "C" fn(c_int, c_int, c_int, *const c_void, size_t, *mut SSL, *mut c_void),
618             >,
619             msg_callback_arg: *mut c_void,
620             hit: c_int,
621             param: *mut c_void,
622             cipher_list: *mut stack_st_SSL_CIPHER,
623             cipher_list_by_id: *mut stack_st_SSL_CIPHER,
624             mac_flags: c_int,
625             enc_read_ctx: *mut ::EVP_CIPHER_CTX,
626             read_hash: *mut ::EVP_MD_CTX,
627             expand: *mut c_void,
628             enc_write_ctx: *mut ::EVP_CIPHER_CTX,
629             write_hash: *mut ::EVP_MD_CTX,
630             compress: *mut c_void,
631             cert: *mut c_void,
632             sid_ctx_length: c_uint,
633             sid_ctx: [c_uchar; ::SSL_MAX_SID_CTX_LENGTH as usize],
634             session: *mut ::SSL_SESSION,
635             generate_session_id: ::GEN_SESSION_CB,
636             verify_mode: c_int,
637             verify_callback: Option<unsafe extern "C" fn(c_int, *mut ::X509_STORE_CTX) -> c_int>,
638             info_callback: Option<unsafe extern "C" fn(*mut SSL, c_int, c_int)>,
639             error: c_int,
640             error_code: c_int,
641             #[cfg(not(osslconf = "OPENSSL_NO_KRB5"))]
642             kssl_ctx: *mut c_void,
643             #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
644             psk_client_callback: Option<
645                 unsafe extern "C" fn(*mut SSL, *const c_char, *mut c_char, c_uint, *mut c_uchar, c_uint)
646                     -> c_uint,
647             >,
648             #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
649             psk_server_callback:
650                 Option<unsafe extern "C" fn(*mut SSL, *const c_char, *mut c_uchar, c_uint) -> c_uint>,
651             ctx: *mut ::SSL_CTX,
652             debug: c_int,
653             verify_result: c_long,
654             ex_data: ::CRYPTO_EX_DATA,
655             client_CA: *mut stack_st_X509_NAME,
656             references: c_int,
657             options: c_ulong,
658             mode: c_ulong,
659             max_cert_list: c_long,
660             first_packet: c_int,
661             client_version: c_int,
662             max_send_fragment: c_uint,
663             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
664             tlsext_debug_cb:
665                 Option<unsafe extern "C" fn(*mut SSL, c_int, c_int, *mut c_uchar, c_int, *mut c_void)>,
666             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
667             tlsext_debug_arg: *mut c_void,
668             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
669             tlsext_hostname: *mut c_char,
670             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
671             servername_done: c_int,
672             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
673             tlsext_status_type: c_int,
674             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
675             tlsext_status_expected: c_int,
676             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
677             tlsext_ocsp_ids: *mut c_void,
678             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
679             tlsext_ocsp_exts: *mut c_void,
680             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
681             tlsext_ocsp_resp: *mut c_uchar,
682             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
683             tlsext_ocsp_resplen: c_int,
684             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
685             tlsext_ticket_expected: c_int,
686             #[cfg(all(
687                 not(osslconf = "OPENSSL_NO_TLSEXT"),
688                 not(osslconf = "OPENSSL_NO_EC")
689             ))]
690             tlsext_ecpointformatlist_length: size_t,
691             #[cfg(all(
692                 not(osslconf = "OPENSSL_NO_TLSEXT"),
693                 not(osslconf = "OPENSSL_NO_EC")
694             ))]
695             tlsext_ecpointformatlist: *mut c_uchar,
696             #[cfg(all(
697                 not(osslconf = "OPENSSL_NO_TLSEXT"),
698                 not(osslconf = "OPENSSL_NO_EC")
699             ))]
700             tlsext_ellipticcurvelist_length: size_t,
701             #[cfg(all(
702                 not(osslconf = "OPENSSL_NO_TLSEXT"),
703                 not(osslconf = "OPENSSL_NO_EC")
704             ))]
705             tlsext_ellipticcurvelist: *mut c_uchar,
706             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
707             tlsext_opaque_prf_input: *mut c_void,
708             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
709             tlsext_opaque_prf_input_len: size_t,
710             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
711             tlsext_session_ticket: *mut c_void,
712             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
713             tlsext_session_ticket_ext_cb: ::tls_session_ticket_ext_cb_fn,
714             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
715             tls_session_ticket_ext_cb_arg: *mut c_void,
716             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
717             tls_session_secret_cb: ::tls_session_secret_cb_fn,
718             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
719             tls_session_secret_cb_arg: *mut c_void,
720             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
721             initial_ctx: *mut ::SSL_CTX,
722             #[cfg(all(
723                 not(osslconf = "OPENSSL_NO_TLSEXT"),
724                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
725             ))]
726             next_proto_negotiated: *mut c_uchar,
727             #[cfg(all(
728                 not(osslconf = "OPENSSL_NO_TLSEXT"),
729                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
730             ))]
731             next_proto_negotiated_len: c_uchar,
732             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
733             srtp_profiles: *mut c_void,
734             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
735             srtp_profile: *mut c_void,
736             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
737             tlsext_heartbeat: c_uint,
738             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
739             tlsext_hb_pending: c_uint,
740             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
741             tlsext_hb_seq: c_uint,
742             renegotiate: c_int,
743             #[cfg(not(osslconf = "OPENSSL_NO_SRP"))]
744             srp_ctx: ::SRP_CTX,
745             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
746             alpn_client_proto_list: *mut c_uchar,
747             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
748             alpn_client_proto_list_len: c_uint,
749         }
750     }
751 }
752 cfg_if! {
753     if #[cfg(any(ossl110, libressl280))] {
754         pub enum SSL_CTX {}
755     } else if #[cfg(libressl251)] {
756         #[repr(C)]
757         pub struct SSL_CTX {
758             method: *const ::SSL_METHOD,
759             cipher_list: *mut stack_st_SSL_CIPHER,
760             cert_store: *mut c_void,
761             session_timeout: c_long,
762             pub references: c_int,
763             extra_certs: *mut stack_st_X509,
764             verify_mode: c_int,
765             sid_ctx_length: c_uint,
766             sid_ctx: [c_uchar; ::SSL_MAX_SID_CTX_LENGTH as usize],
767             param: *mut ::X509_VERIFY_PARAM,
768             default_passwd_callback: *mut c_void,
769             default_passwd_callback_userdata: *mut c_void,
770             internal: *mut c_void,
771         }
772     } else if #[cfg(libressl)] {
773         #[repr(C)]
774         pub struct SSL_CTX {
775             method: *mut c_void,
776             cipher_list: *mut c_void,
777             cipher_list_by_id: *mut c_void,
778             cert_store: *mut c_void,
779             sessions: *mut c_void,
780             session_cache_size: c_ulong,
781             session_cache_head: *mut c_void,
782             session_cache_tail: *mut c_void,
783             session_cache_mode: c_int,
784             session_timeout: c_long,
785             new_session_cb: *mut c_void,
786             remove_session_cb: *mut c_void,
787             get_session_cb: *mut c_void,
788             stats: [c_int; 11],
789             pub references: c_int,
790             app_verify_callback: *mut c_void,
791             app_verify_arg: *mut c_void,
792             default_passwd_callback: *mut c_void,
793             default_passwd_callback_userdata: *mut c_void,
794             client_cert_cb: *mut c_void,
795             app_gen_cookie_cb: *mut c_void,
796             app_verify_cookie_cb: *mut c_void,
797             ex_dat: ::CRYPTO_EX_DATA,
798             rsa_md5: *mut c_void,
799             md5: *mut c_void,
800             sha1: *mut c_void,
801             extra_certs: *mut c_void,
802             comp_methods: *mut c_void,
803             info_callback: *mut c_void,
804             client_CA: *mut c_void,
805             options: c_ulong,
806             mode: c_ulong,
807             max_cert_list: c_long,
808             cert: *mut c_void,
809             read_ahead: c_int,
810             msg_callback: *mut c_void,
811             msg_callback_arg: *mut c_void,
812             verify_mode: c_int,
813             sid_ctx_length: c_uint,
814             sid_ctx: [c_uchar; 32],
815             default_verify_callback: *mut c_void,
816             generate_session_id: *mut c_void,
817             param: *mut c_void,
818             quiet_shutdown: c_int,
819             max_send_fragment: c_uint,
820 
821             #[cfg(not(osslconf = "OPENSSL_NO_ENGINE"))]
822             client_cert_engine: *mut c_void,
823 
824             tlsext_servername_callback: *mut c_void,
825             tlsect_servername_arg: *mut c_void,
826             tlsext_tick_key_name: [c_uchar; 16],
827             tlsext_tick_hmac_key: [c_uchar; 16],
828             tlsext_tick_aes_key: [c_uchar; 16],
829             tlsext_ticket_key_cb: *mut c_void,
830             tlsext_status_cb: *mut c_void,
831             tlsext_status_arg: *mut c_void,
832             tlsext_opaque_prf_input_callback: *mut c_void,
833             tlsext_opaque_prf_input_callback_arg: *mut c_void,
834 
835             next_protos_advertised_cb: *mut c_void,
836             next_protos_advertised_cb_arg: *mut c_void,
837             next_proto_select_cb: *mut c_void,
838             next_proto_select_cb_arg: *mut c_void,
839 
840             srtp_profiles: *mut c_void,
841         }
842     } else {
843         #[repr(C)]
844         pub struct SSL_CTX {
845             method: *mut c_void,
846             cipher_list: *mut c_void,
847             cipher_list_by_id: *mut c_void,
848             cert_store: *mut c_void,
849             sessions: *mut c_void,
850             session_cache_size: c_ulong,
851             session_cache_head: *mut c_void,
852             session_cache_tail: *mut c_void,
853             session_cache_mode: c_int,
854             session_timeout: c_long,
855             new_session_cb: *mut c_void,
856             remove_session_cb: *mut c_void,
857             get_session_cb: *mut c_void,
858             stats: [c_int; 11],
859             pub references: c_int,
860             app_verify_callback: *mut c_void,
861             app_verify_arg: *mut c_void,
862             default_passwd_callback: *mut c_void,
863             default_passwd_callback_userdata: *mut c_void,
864             client_cert_cb: *mut c_void,
865             app_gen_cookie_cb: *mut c_void,
866             app_verify_cookie_cb: *mut c_void,
867             ex_dat: ::CRYPTO_EX_DATA,
868             rsa_md5: *mut c_void,
869             md5: *mut c_void,
870             sha1: *mut c_void,
871             extra_certs: *mut c_void,
872             comp_methods: *mut c_void,
873             info_callback: *mut c_void,
874             client_CA: *mut c_void,
875             options: c_ulong,
876             mode: c_ulong,
877             max_cert_list: c_long,
878             cert: *mut c_void,
879             read_ahead: c_int,
880             msg_callback: *mut c_void,
881             msg_callback_arg: *mut c_void,
882             verify_mode: c_int,
883             sid_ctx_length: c_uint,
884             sid_ctx: [c_uchar; 32],
885             default_verify_callback: *mut c_void,
886             generate_session_id: *mut c_void,
887             param: *mut c_void,
888             quiet_shutdown: c_int,
889             max_send_fragment: c_uint,
890 
891             #[cfg(not(osslconf = "OPENSSL_NO_ENGINE"))]
892             client_cert_engine: *mut c_void,
893 
894             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
895             tlsext_servername_callback: *mut c_void,
896             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
897             tlsect_servername_arg: *mut c_void,
898             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
899             tlsext_tick_key_name: [c_uchar; 16],
900             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
901             tlsext_tick_hmac_key: [c_uchar; 16],
902             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
903             tlsext_tick_aes_key: [c_uchar; 16],
904             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
905             tlsext_ticket_key_cb: *mut c_void,
906             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
907             tlsext_status_cb: *mut c_void,
908             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
909             tlsext_status_arg: *mut c_void,
910             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
911             tlsext_opaque_prf_input_callback: *mut c_void,
912             #[cfg(not(osslconf = "OPENSSL_NO_TLSEXT"))]
913             tlsext_opaque_prf_input_callback_arg: *mut c_void,
914 
915             #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
916             psk_identity_hint: *mut c_void,
917             #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
918             psk_client_callback: *mut c_void,
919             #[cfg(not(osslconf = "OPENSSL_NO_PSK"))]
920             psk_server_callback: *mut c_void,
921 
922             #[cfg(not(osslconf = "OPENSSL_NO_BUF_FREELISTS"))]
923             freelist_max_len: c_uint,
924             #[cfg(not(osslconf = "OPENSSL_NO_BUF_FREELISTS"))]
925             wbuf_freelist: *mut c_void,
926             #[cfg(not(osslconf = "OPENSSL_NO_BUF_FREELISTS"))]
927             rbuf_freelist: *mut c_void,
928 
929             #[cfg(not(osslconf = "OPENSSL_NO_SRP"))]
930             srp_ctx: SRP_CTX,
931 
932             #[cfg(all(
933                 not(osslconf = "OPENSSL_NO_TLSEXT"),
934                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
935             ))]
936             next_protos_advertised_cb: *mut c_void,
937             #[cfg(all(
938                 not(osslconf = "OPENSSL_NO_TLSEXT"),
939                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
940             ))]
941             next_protos_advertised_cb_arg: *mut c_void,
942             #[cfg(all(
943                 not(osslconf = "OPENSSL_NO_TLSEXT"),
944                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
945             ))]
946             next_proto_select_cb: *mut c_void,
947             #[cfg(all(
948                 not(osslconf = "OPENSSL_NO_TLSEXT"),
949                 not(osslconf = "OPENSSL_NO_NEXTPROTONEG")
950             ))]
951             next_proto_select_cb_arg: *mut c_void,
952 
953             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl101))]
954             srtp_profiles: *mut c_void,
955             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
956             alpn_select_cb: *mut c_void,
957             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
958             alpn_select_cb_arg: *mut c_void,
959             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
960             alpn_client_proto_list: *mut c_void,
961             #[cfg(all(not(osslconf = "OPENSSL_NO_TLSEXT"), ossl102))]
962             alpn_client_proto_list_len: c_uint,
963 
964             #[cfg(all(
965                 not(osslconf = "OPENSSL_NO_TLSEXT"),
966                 not(osslconf = "OPENSSL_NO_EC"),
967                 ossl102
968             ))]
969             tlsext_ecpointformatlist_length: size_t,
970             #[cfg(all(
971                 not(osslconf = "OPENSSL_NO_TLSEXT"),
972                 not(osslconf = "OPENSSL_NO_EC"),
973                 ossl102
974             ))]
975             tlsext_ecpointformatlist: *mut c_uchar,
976             #[cfg(all(
977                 not(osslconf = "OPENSSL_NO_TLSEXT"),
978                 not(osslconf = "OPENSSL_NO_EC"),
979                 ossl102
980             ))]
981             tlsext_ellipticcurvelist_length: size_t,
982             #[cfg(all(
983                 not(osslconf = "OPENSSL_NO_TLSEXT"),
984                 not(osslconf = "OPENSSL_NO_EC"),
985                 ossl102
986             ))]
987             tlsext_ellipticcurvelist: *mut c_uchar,
988         }
989 
990         #[repr(C)]
991         #[cfg(not(osslconf = "OPENSSL_NO_SRP"))]
992         pub struct SRP_CTX {
993             SRP_cb_arg: *mut c_void,
994             TLS_ext_srp_username_callback: *mut c_void,
995             SRP_verify_param_callback: *mut c_void,
996             SRP_give_srp_client_pwd_callback: *mut c_void,
997             login: *mut c_void,
998             N: *mut c_void,
999             g: *mut c_void,
1000             s: *mut c_void,
1001             B: *mut c_void,
1002             A: *mut c_void,
1003             a: *mut c_void,
1004             b: *mut c_void,
1005             v: *mut c_void,
1006             info: *mut c_void,
1007             stringth: c_int,
1008             srp_Mask: c_ulong,
1009         }
1010     }
1011 }
1012 
1013 pub enum COMP_METHOD {}
1014 
1015 cfg_if! {
1016     if #[cfg(any(ossl110, libressl280))] {
1017         pub enum CRYPTO_EX_DATA {}
1018     } else if #[cfg(libressl)] {
1019         #[repr(C)]
1020         pub struct CRYPTO_EX_DATA {
1021             pub sk: *mut ::stack_st_void,
1022         }
1023     } else {
1024         #[repr(C)]
1025         pub struct CRYPTO_EX_DATA {
1026             pub sk: *mut stack_st_void,
1027             pub dummy: c_int,
1028         }
1029     }
1030 }
1031 
1032 pub enum OCSP_RESPONSE {}
1033