variant_ssl_sys/handwritten/
x509.rs

1use super::super::*;
2use libc::*;
3
4cfg_if! {
5    if #[cfg(libressl400)] {
6        pub enum X509_VAL {}
7    } else {
8        #[repr(C)]
9        pub struct X509_VAL {
10            pub notBefore: *mut ASN1_TIME,
11            pub notAfter: *mut ASN1_TIME,
12        }
13    }
14}
15
16pub enum X509_NAME_ENTRY {}
17
18stack!(stack_st_X509_NAME_ENTRY);
19
20stack!(stack_st_X509_NAME);
21
22pub enum X509_EXTENSION {}
23
24stack!(stack_st_X509_EXTENSION);
25
26pub enum X509_ATTRIBUTE {}
27
28stack!(stack_st_X509_ATTRIBUTE);
29
30cfg_if! {
31    if #[cfg(any(ossl110, libressl))] {
32        pub enum X509_REQ_INFO {}
33    } else {
34        #[repr(C)]
35        pub struct X509_REQ_INFO {
36            pub enc: ASN1_ENCODING,
37            pub version: *mut ASN1_INTEGER,
38            pub subject: *mut X509_NAME,
39            pubkey: *mut c_void,
40            pub attributes: *mut stack_st_X509_ATTRIBUTE,
41        }
42    }
43}
44
45cfg_if! {
46    if #[cfg(any(ossl110, libressl))] {
47        pub enum X509_CRL {}
48    } else {
49        #[repr(C)]
50        pub struct X509_CRL {
51            pub crl: *mut X509_CRL_INFO,
52            sig_alg: *mut X509_ALGOR,
53            signature: *mut c_void,
54            references: c_int,
55            flags: c_int,
56            akid: *mut c_void,
57            idp: *mut c_void,
58            idp_flags: c_int,
59            idp_reasons: c_int,
60            crl_number: *mut ASN1_INTEGER,
61            base_crl_number: *mut ASN1_INTEGER,
62            sha1_hash: [c_uchar; 20],
63            issuers: *mut c_void,
64            meth: *const c_void,
65            meth_data: *mut c_void,
66        }
67    }
68}
69
70stack!(stack_st_X509_CRL);
71
72cfg_if! {
73    if #[cfg(any(ossl110, libressl))] {
74        pub enum X509_CRL_INFO {}
75    } else {
76        #[repr(C)]
77        pub struct X509_CRL_INFO {
78            version: *mut ASN1_INTEGER,
79            sig_alg: *mut X509_ALGOR,
80            pub issuer: *mut X509_NAME,
81            pub lastUpdate: *mut ASN1_TIME,
82            pub nextUpdate: *mut ASN1_TIME,
83            pub revoked: *mut stack_st_X509_REVOKED,
84            extensions: *mut stack_st_X509_EXTENSION,
85            enc: ASN1_ENCODING,
86        }
87    }
88}
89
90cfg_if! {
91    if #[cfg(any(ossl110, libressl))] {
92        pub enum X509_REVOKED {}
93    } else {
94        #[repr(C)]
95        pub struct X509_REVOKED {
96            pub serialNumber: *mut ASN1_INTEGER,
97            pub revocationDate: *mut ASN1_TIME,
98            pub extensions: *mut stack_st_X509_EXTENSION,
99            issuer: *mut stack_st_GENERAL_NAME,
100            reason: c_int,
101            sequence: c_int,
102        }
103    }
104}
105
106stack!(stack_st_X509_REVOKED);
107
108cfg_if! {
109    if #[cfg(any(ossl110, libressl))] {
110        pub enum X509_REQ {}
111    } else {
112        #[repr(C)]
113        pub struct X509_REQ {
114            pub req_info: *mut X509_REQ_INFO,
115            sig_alg: *mut c_void,
116            signature: *mut c_void,
117            references: c_int,
118        }
119    }
120}
121
122cfg_if! {
123    if #[cfg(any(ossl110, libressl))] {
124        pub enum X509_CINF {}
125    } else {
126        #[repr(C)]
127        pub struct X509_CINF {
128            version: *mut c_void,
129            serialNumber: *mut c_void,
130            signature: *mut c_void,
131            issuer: *mut c_void,
132            pub validity: *mut X509_VAL,
133            subject: *mut c_void,
134            key: *mut c_void,
135            issuerUID: *mut c_void,
136            subjectUID: *mut c_void,
137            pub extensions: *mut stack_st_X509_EXTENSION,
138            enc: ASN1_ENCODING,
139        }
140    }
141}
142
143stack!(stack_st_X509);
144
145stack!(stack_st_X509_OBJECT);
146
147stack!(stack_st_X509_LOOKUP);
148
149extern "C" {
150    pub fn X509_verify_cert_error_string(n: c_long) -> *const c_char;
151
152    pub fn X509_sign(x: *mut X509, pkey: *mut EVP_PKEY, md: *const EVP_MD) -> c_int;
153
154    pub fn X509_digest(
155        x: *const X509,
156        digest: *const EVP_MD,
157        buf: *mut c_uchar,
158        len: *mut c_uint,
159    ) -> c_int;
160    pub fn X509_pubkey_digest(
161        x: *const X509,
162        digest: *const EVP_MD,
163        buf: *mut c_uchar,
164        len: *mut c_uint,
165    ) -> c_int;
166
167    pub fn X509_REQ_sign(x: *mut X509_REQ, pkey: *mut EVP_PKEY, md: *const EVP_MD) -> c_int;
168    pub fn X509_REQ_digest(
169        x: *const X509_REQ,
170        digest: *const EVP_MD,
171        md: *mut c_uchar,
172        len: *mut c_uint,
173    ) -> c_int;
174}
175
176const_ptr_api! {
177    extern "C" {
178        pub fn i2d_X509_bio(b: *mut BIO, x: #[const_ptr_if(ossl300)] X509) -> c_int;
179        pub fn i2d_X509_REQ_bio(b: *mut BIO, x: #[const_ptr_if(ossl300)] X509_REQ) -> c_int;
180        pub fn i2d_PrivateKey_bio(b: *mut BIO, x: #[const_ptr_if(ossl300)] EVP_PKEY) -> c_int;
181        pub fn i2d_PUBKEY_bio(b: *mut BIO, x: #[const_ptr_if(ossl300)] EVP_PKEY) -> c_int;
182
183        pub fn i2d_PUBKEY(k: #[const_ptr_if(ossl300)] EVP_PKEY, buf: *mut *mut u8) -> c_int;
184        pub fn i2d_PrivateKey(k: #[const_ptr_if(ossl300)] EVP_PKEY, buf: *mut *mut u8) -> c_int;
185    }
186}
187
188#[cfg(not(osslconf = "OPENSSL_NO_DEPRECATED_3_0"))]
189const_ptr_api! {
190    extern "C" {
191        pub fn i2d_RSA_PUBKEY(k: #[const_ptr_if(ossl300)] RSA, buf: *mut *mut u8) -> c_int;
192        pub fn i2d_DSA_PUBKEY(a: #[const_ptr_if(ossl300)] DSA, pp: *mut *mut c_uchar) -> c_int;
193        pub fn i2d_ECPrivateKey(ec_key: #[const_ptr_if(ossl300)] EC_KEY, pp: *mut *mut c_uchar) -> c_int;
194        pub fn i2d_EC_PUBKEY(a: #[const_ptr_if(ossl300)] EC_KEY, pp: *mut *mut c_uchar) -> c_int;
195    }
196}
197extern "C" {
198    pub fn d2i_PUBKEY(k: *mut *mut EVP_PKEY, buf: *mut *const u8, len: c_long) -> *mut EVP_PKEY;
199}
200
201#[cfg(not(osslconf = "OPENSSL_NO_DEPRECATED_3_0"))]
202extern "C" {
203    pub fn d2i_RSA_PUBKEY(k: *mut *mut RSA, buf: *mut *const u8, len: c_long) -> *mut RSA;
204    pub fn d2i_DSA_PUBKEY(k: *mut *mut DSA, pp: *mut *const c_uchar, length: c_long) -> *mut DSA;
205    pub fn d2i_EC_PUBKEY(
206        a: *mut *mut EC_KEY,
207        pp: *mut *const c_uchar,
208        length: c_long,
209    ) -> *mut EC_KEY;
210
211    pub fn d2i_ECPrivateKey(
212        k: *mut *mut EC_KEY,
213        pp: *mut *const c_uchar,
214        length: c_long,
215    ) -> *mut EC_KEY;
216}
217
218const_ptr_api! {
219    extern "C" {
220        pub fn X509_ALGOR_get0(
221            paobj: *mut #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT,
222            pptype: *mut c_int,
223            ppval: *mut #[const_ptr_if(any(ossl110, libressl))] c_void,
224            alg: #[const_ptr_if(any(ossl110, libressl))] X509_ALGOR,
225        );
226    }
227}
228
229extern "C" {
230    pub fn X509_gmtime_adj(time: *mut ASN1_TIME, adj: c_long) -> *mut ASN1_TIME;
231
232    pub fn X509_to_X509_REQ(x: *mut X509, pkey: *mut EVP_PKEY, md: *const EVP_MD) -> *mut X509_REQ;
233
234    pub fn X509_ALGOR_free(x: *mut X509_ALGOR);
235
236    pub fn X509_REVOKED_new() -> *mut X509_REVOKED;
237    pub fn X509_REVOKED_free(x: *mut X509_REVOKED);
238}
239const_ptr_api! {
240    extern "C" {
241        pub fn X509_REVOKED_dup(rev: #[const_ptr_if(ossl300)] X509_REVOKED) -> *mut X509_REVOKED;
242    }
243}
244
245extern "C" {
246    pub fn d2i_X509_REVOKED(
247        a: *mut *mut X509_REVOKED,
248        pp: *mut *const c_uchar,
249        length: c_long,
250    ) -> *mut X509_REVOKED;
251}
252const_ptr_api! {
253    extern "C" {
254        pub fn i2d_X509_REVOKED(x: #[const_ptr_if(ossl300)] X509_REVOKED, buf: *mut *mut u8) -> c_int;
255    }
256}
257extern "C" {
258    pub fn X509_CRL_new() -> *mut X509_CRL;
259    pub fn X509_CRL_free(x: *mut X509_CRL);
260    pub fn d2i_X509_CRL(
261        a: *mut *mut X509_CRL,
262        pp: *mut *const c_uchar,
263        length: c_long,
264    ) -> *mut X509_CRL;
265}
266const_ptr_api! {
267    extern "C" {
268        pub fn i2d_X509_CRL(x: #[const_ptr_if(ossl300)] X509_CRL, buf: *mut *mut u8) -> c_int;
269        pub fn X509_CRL_dup(x: #[const_ptr_if(ossl300)] X509_CRL) -> *mut X509_CRL;
270    }
271}
272
273extern "C" {
274    pub fn X509_REQ_new() -> *mut X509_REQ;
275    pub fn X509_REQ_free(x: *mut X509_REQ);
276    pub fn d2i_X509_REQ(
277        a: *mut *mut X509_REQ,
278        pp: *mut *const c_uchar,
279        length: c_long,
280    ) -> *mut X509_REQ;
281}
282const_ptr_api! {
283    extern "C" {
284        pub fn i2d_X509_REQ(x: #[const_ptr_if(ossl300)] X509_REQ, buf: *mut *mut u8) -> c_int;
285
286        pub fn X509_get0_signature(
287            psig: *mut #[const_ptr_if(any(ossl110, libressl))] ASN1_BIT_STRING,
288            palg: *mut #[const_ptr_if(any(ossl110, libressl))] X509_ALGOR,
289            x: *const X509,
290        );
291
292        pub fn X509_REQ_dup(x: #[const_ptr_if(ossl300)] X509_REQ) -> *mut X509_REQ;
293    }
294}
295extern "C" {
296    #[cfg(ossl102)]
297    pub fn X509_get_signature_nid(x: *const X509) -> c_int;
298
299    pub fn X509_EXTENSION_free(ext: *mut X509_EXTENSION);
300
301    pub fn X509_NAME_ENTRY_free(x: *mut X509_NAME_ENTRY);
302
303    pub fn X509_NAME_new() -> *mut X509_NAME;
304    pub fn X509_NAME_cmp(x: *const X509_NAME, y: *const X509_NAME) -> c_int;
305    pub fn X509_NAME_free(x: *mut X509_NAME);
306
307    pub fn X509_NAME_digest(
308        data: *const X509_NAME,
309        type_: *const EVP_MD,
310        md: *mut c_uchar,
311        len: *mut c_uint,
312    ) -> c_int;
313
314    pub fn X509_new() -> *mut X509;
315    pub fn X509_free(x: *mut X509);
316}
317const_ptr_api! {
318    extern "C" {
319        pub fn i2d_X509(x: #[const_ptr_if(ossl300)] X509, buf: *mut *mut u8) -> c_int;
320        pub fn X509_NAME_dup(x: #[const_ptr_if(ossl300)] X509_NAME) -> *mut X509_NAME;
321        pub fn X509_dup(x: #[const_ptr_if(ossl300)] X509) -> *mut X509;
322        pub fn X509_NAME_add_entry(
323            name: *mut X509_NAME,
324            ne: #[const_ptr_if(any(ossl110, libressl))] X509_NAME_ENTRY,
325            loc: c_int,
326            set: c_int,
327            ) -> c_int;
328    }
329}
330extern "C" {
331    pub fn d2i_X509(a: *mut *mut X509, pp: *mut *const c_uchar, length: c_long) -> *mut X509;
332    pub fn d2i_X509_bio(b: *mut BIO, a: *mut *mut X509) -> *mut X509;
333
334    pub fn X509_get_pubkey(x: *mut X509) -> *mut EVP_PKEY;
335
336    pub fn X509_set_version(x: *mut X509, version: c_long) -> c_int;
337    #[cfg(any(ossl110, libressl))]
338    pub fn X509_get_version(x: *const X509) -> c_long;
339    pub fn X509_set_serialNumber(x: *mut X509, sn: *mut ASN1_INTEGER) -> c_int;
340    pub fn X509_get_serialNumber(x: *mut X509) -> *mut ASN1_INTEGER;
341    pub fn X509_alias_get0(x: *mut X509, len: *mut c_int) -> *mut c_uchar;
342}
343const_ptr_api! {
344    extern "C" {
345        pub fn X509_set_issuer_name(x: *mut X509, name: #[const_ptr_if(ossl300)] X509_NAME) -> c_int;
346    }
347}
348extern "C" {
349    pub fn X509_issuer_name_hash(x: *mut X509) -> c_ulong;
350    pub fn X509_subject_name_hash(x: *mut X509) -> c_ulong;
351}
352const_ptr_api! {
353    extern "C" {
354        pub fn X509_get_issuer_name(x: #[const_ptr_if(any(ossl110, libressl))] X509) -> *mut X509_NAME;
355        pub fn X509_set_subject_name(x: *mut X509, name: #[const_ptr_if(ossl300)] X509_NAME) -> c_int;
356        pub fn X509_get_subject_name(x: #[const_ptr_if(any(ossl110, libressl))] X509) -> *mut X509_NAME;
357    }
358}
359cfg_if! {
360    if #[cfg(any(ossl110, libressl))] {
361        extern "C" {
362            pub fn X509_set1_notBefore(x: *mut X509, tm: *const ASN1_TIME) -> c_int;
363            pub fn X509_set1_notAfter(x: *mut X509, tm: *const ASN1_TIME) -> c_int;
364        }
365    } else {
366        extern "C" {
367            pub fn X509_set_notBefore(x: *mut X509, tm: *const ASN1_TIME) -> c_int;
368            pub fn X509_set_notAfter(x: *mut X509, tm: *const ASN1_TIME) -> c_int;
369        }
370    }
371}
372extern "C" {
373    #[cfg(any(ossl110, libressl))]
374    pub fn X509_REQ_get_version(req: *const X509_REQ) -> c_long;
375    pub fn X509_REQ_set_version(req: *mut X509_REQ, version: c_long) -> c_int;
376    #[cfg(any(ossl110, libressl))]
377    pub fn X509_REQ_get_subject_name(req: *const X509_REQ) -> *mut X509_NAME;
378}
379const_ptr_api! {
380    extern "C" {
381        pub fn X509_REQ_set_subject_name(req: *mut X509_REQ, name: #[const_ptr_if(ossl300)] X509_NAME) -> c_int;
382    }
383}
384extern "C" {
385    pub fn X509_REQ_set_pubkey(req: *mut X509_REQ, pkey: *mut EVP_PKEY) -> c_int;
386    pub fn X509_REQ_get_pubkey(req: *mut X509_REQ) -> *mut EVP_PKEY;
387    #[cfg(ossl110)]
388    pub fn X509_REQ_get_X509_PUBKEY(req: *mut X509_REQ) -> *mut X509_PUBKEY;
389    pub fn X509_REQ_get_extensions(req: *mut X509_REQ) -> *mut stack_st_X509_EXTENSION;
390}
391cfg_if! {
392    if #[cfg(tongsuo)] {
393        extern "C" {
394            pub fn X509_set0_sm2_id(x: *mut X509, sm2_id: *mut ASN1_OCTET_STRING);
395            pub fn X509_get0_sm2_id(x: *mut X509) -> *mut ASN1_OCTET_STRING;
396            pub fn X509_REQ_set0_sm2_id(x: *mut X509_REQ, sm2_id: *mut ASN1_OCTET_STRING);
397            pub fn X509_REQ_get0_sm2_id(x: *mut X509_REQ) -> *mut ASN1_OCTET_STRING;
398        }
399    }
400}
401const_ptr_api! {
402    extern "C" {
403        pub fn X509_REQ_add_extensions(req: *mut X509_REQ, exts: #[const_ptr_if(ossl300)] stack_st_X509_EXTENSION)
404            -> c_int;
405    }
406}
407extern "C" {
408    pub fn X509_REQ_get_attr_count(req: *const X509_REQ) -> c_int;
409    pub fn X509_REQ_get_attr_by_NID(req: *const X509_REQ, nid: c_int, lastpos: c_int) -> c_int;
410    pub fn X509_REQ_get_attr(req: *const X509_REQ, loc: c_int) -> *mut X509_ATTRIBUTE;
411    pub fn X509_REQ_delete_attr(req: *mut X509_REQ, loc: c_int) -> *mut X509_ATTRIBUTE;
412    pub fn X509_REQ_add1_attr_by_txt(
413        req: *mut X509_REQ,
414        attrname: *const c_char,
415        chtype: c_int,
416        bytes: *const c_uchar,
417        len: c_int,
418    ) -> c_int;
419    pub fn X509_REQ_add1_attr_by_NID(
420        req: *mut X509_REQ,
421        nid: c_int,
422        chtype: c_int,
423        bytes: *const c_uchar,
424        len: c_int,
425    ) -> c_int;
426    pub fn X509_REQ_add1_attr_by_OBJ(
427        req: *mut X509_REQ,
428        obj: *const ASN1_OBJECT,
429        chtype: c_int,
430        bytes: *const c_uchar,
431        len: c_int,
432    ) -> c_int;
433}
434extern "C" {
435    pub fn X509_set_pubkey(x: *mut X509, pkey: *mut EVP_PKEY) -> c_int;
436    pub fn X509_REQ_verify(req: *mut X509_REQ, pkey: *mut EVP_PKEY) -> c_int;
437    #[cfg(any(ossl110, libressl))]
438    pub fn X509_getm_notBefore(x: *const X509) -> *mut ASN1_TIME;
439    #[cfg(any(ossl110, libressl))]
440    pub fn X509_getm_notAfter(x: *const X509) -> *mut ASN1_TIME;
441    #[cfg(any(ossl110, libressl))]
442    pub fn X509_up_ref(x: *mut X509) -> c_int;
443
444    #[cfg(any(ossl110, libressl))]
445    pub fn X509_REVOKED_get0_serialNumber(req: *const X509_REVOKED) -> *const ASN1_INTEGER;
446    #[cfg(any(ossl110, libressl))]
447    pub fn X509_REVOKED_get0_revocationDate(req: *const X509_REVOKED) -> *const ASN1_TIME;
448    #[cfg(any(ossl110, libressl))]
449    pub fn X509_REVOKED_get0_extensions(r: *const X509_REVOKED) -> *const stack_st_X509_EXTENSION;
450
451    pub fn X509_REVOKED_set_serialNumber(r: *mut X509_REVOKED, serial: *mut ASN1_INTEGER) -> c_int;
452    pub fn X509_REVOKED_set_revocationDate(r: *mut X509_REVOKED, tm: *mut ASN1_TIME) -> c_int;
453
454    pub fn X509_CRL_sign(x: *mut X509_CRL, pkey: *mut EVP_PKEY, md: *const EVP_MD) -> c_int;
455    pub fn X509_CRL_digest(
456        x: *const X509_CRL,
457        digest: *const EVP_MD,
458        md: *mut c_uchar,
459        len: *mut c_uint,
460    ) -> c_int;
461    pub fn X509_CRL_verify(crl: *mut X509_CRL, pkey: *mut EVP_PKEY) -> c_int;
462    pub fn X509_CRL_get0_by_cert(
463        x: *mut X509_CRL,
464        ret: *mut *mut X509_REVOKED,
465        cert: *mut X509,
466    ) -> c_int;
467}
468const_ptr_api! {
469    extern "C" {
470        pub fn X509_CRL_get0_by_serial(
471            x: *mut X509_CRL,
472            ret: *mut *mut X509_REVOKED,
473            serial: #[const_ptr_if(ossl300)] ASN1_INTEGER,
474        ) -> c_int;
475    }
476}
477
478extern "C" {
479    pub fn X509_PUBKEY_new() -> *mut X509_PUBKEY;
480    pub fn X509_PUBKEY_free(a: *mut X509_PUBKEY);
481    #[cfg(ossl300)]
482    pub fn X509_PUBKEY_dup(a: *const X509_PUBKEY) -> *mut X509_PUBKEY;
483    #[cfg(ossl300)]
484    pub fn X509_PUBKEY_eq(a: *const X509_PUBKEY, b: *const X509_PUBKEY) -> c_int;
485    pub fn d2i_X509_PUBKEY(
486        a: *mut *mut X509_PUBKEY,
487        in_: *mut *const c_uchar,
488        len: c_long,
489    ) -> *mut X509_PUBKEY;
490    #[cfg(ossl300)]
491    pub fn X509_PUBKEY_new_ex(libctx: *mut OSSL_LIB_CTX, propq: *const c_char) -> *mut X509_PUBKEY;
492    pub fn X509_PUBKEY_set(x: *mut *mut X509_PUBKEY, pkey: *mut EVP_PKEY) -> c_int;
493
494    pub fn X509_PUBKEY_set0_param(
495        pub_: *mut X509_PUBKEY,
496        aobj: *mut ASN1_OBJECT,
497        ptype: c_int,
498        pval: *mut c_void,
499        penc: *mut c_uchar,
500        penclen: c_int,
501    ) -> c_int;
502}
503const_ptr_api! {
504    extern "C" {
505       pub fn i2d_X509_PUBKEY(a: #[const_ptr_if(ossl300)] X509_PUBKEY, out: *mut *mut c_uchar) -> c_int;
506       pub fn X509_PUBKEY_get0_param(
507           ppkalg: *mut *mut ASN1_OBJECT,
508           pk: *mut *const c_uchar,
509           ppklen: *mut c_int,
510           pa: *mut *mut X509_ALGOR,
511           pub_: #[const_ptr_if(ossl300)] X509_PUBKEY,
512       ) -> c_int;
513       pub fn X509_PUBKEY_get(key: #[const_ptr_if(ossl300)] X509_PUBKEY) -> *mut EVP_PKEY;
514       pub fn X509_PUBKEY_get0(key: #[const_ptr_if(ossl300)] X509_PUBKEY) -> *mut EVP_PKEY;
515    }
516}
517
518extern "C" {
519    #[cfg(any(ossl110, libressl))]
520    pub fn X509_CRL_get_REVOKED(crl: *mut X509_CRL) -> *mut stack_st_X509_REVOKED;
521    #[cfg(any(ossl110, libressl))]
522    pub fn X509_CRL_get0_nextUpdate(x: *const X509_CRL) -> *const ASN1_TIME;
523    #[cfg(any(ossl110, libressl))]
524    pub fn X509_CRL_get0_lastUpdate(x: *const X509_CRL) -> *const ASN1_TIME;
525    #[cfg(any(ossl110, libressl))]
526    pub fn X509_CRL_get_issuer(x: *const X509_CRL) -> *mut X509_NAME;
527
528    #[cfg(any(ossl110, libressl))]
529    pub fn X509_get0_extensions(req: *const X509) -> *const stack_st_X509_EXTENSION;
530    #[cfg(any(ossl110, libressl))]
531    pub fn X509_get_X509_PUBKEY(x: *const X509) -> *mut X509_PUBKEY;
532
533    pub fn X509_CRL_set_version(crl: *mut X509_CRL, version: c_long) -> c_int;
534}
535const_ptr_api! {
536    extern "C" {
537        pub fn X509_CRL_set_issuer_name(crl: *mut X509_CRL, name: #[const_ptr_if(ossl300)] X509_NAME) -> c_int;
538    }
539}
540extern "C" {
541    pub fn X509_CRL_sort(crl: *mut X509_CRL) -> c_int;
542
543    #[cfg(any(ossl110, libressl))]
544    pub fn X509_CRL_up_ref(crl: *mut X509_CRL) -> c_int;
545    pub fn X509_CRL_add0_revoked(crl: *mut X509_CRL, rev: *mut X509_REVOKED) -> c_int;
546}
547cfg_if! {
548    if #[cfg(any(ossl110, libressl))] {
549        extern "C" {
550            pub fn X509_CRL_set1_lastUpdate(crl: *mut X509_CRL, tm: *const ASN1_TIME) -> c_int;
551            pub fn X509_CRL_set1_nextUpdate(crl: *mut X509_CRL, tm: *const ASN1_TIME) -> c_int;
552        }
553    } else {
554        // ossl110 "#define"s these to the variants above
555        extern "C" {
556            pub fn X509_CRL_set_lastUpdate(crl: *mut X509_CRL, tm: *const ASN1_TIME) -> c_int;
557            pub fn X509_CRL_set_nextUpdate(crl: *mut X509_CRL, tm: *const ASN1_TIME) -> c_int;
558        }
559    }
560}
561
562const_ptr_api! {
563    extern "C" {
564        pub fn X509_NAME_entry_count(n: #[const_ptr_if(any(ossl110, libressl))] X509_NAME) -> c_int;
565        pub fn X509_NAME_get_index_by_NID(n: #[const_ptr_if(any(ossl300, libressl))] X509_NAME, nid: c_int, last_pos: c_int) -> c_int;
566        pub fn X509_NAME_get_entry(n: #[const_ptr_if(any(ossl110, libressl))] X509_NAME, loc: c_int) -> *mut X509_NAME_ENTRY;
567        pub fn X509_NAME_add_entry_by_NID(
568            x: *mut X509_NAME,
569            field: c_int,
570            ty: c_int,
571            bytes: #[const_ptr_if(any(ossl110, libressl))] c_uchar,
572            len: c_int,
573            loc: c_int,
574            set: c_int,
575        ) -> c_int;
576        pub fn i2d_X509_NAME(n: #[const_ptr_if(ossl300)] X509_NAME, buf: *mut *mut u8) -> c_int;
577        pub fn X509_NAME_ENTRY_get_object(ne: #[const_ptr_if(any(ossl110, libressl))] X509_NAME_ENTRY) -> *mut ASN1_OBJECT;
578        pub fn X509_NAME_ENTRY_get_data(ne: #[const_ptr_if(any(ossl110, libressl))] X509_NAME_ENTRY) -> *mut ASN1_STRING;
579    }
580}
581extern "C" {
582    pub fn X509_NAME_add_entry_by_txt(
583        x: *mut X509_NAME,
584        field: *const c_char,
585        ty: c_int,
586        bytes: *const c_uchar,
587        len: c_int,
588        loc: c_int,
589        set: c_int,
590    ) -> c_int;
591    pub fn d2i_X509_NAME(
592        n: *mut *mut X509_NAME,
593        pp: *mut *const c_uchar,
594        length: c_long,
595    ) -> *mut X509_NAME;
596}
597
598// "raw" X509_EXTENSION related functions
599extern "C" {
600    // in X509
601    pub fn X509_delete_ext(x: *mut X509, loc: c_int) -> *mut X509_EXTENSION;
602    pub fn X509_add_ext(x: *mut X509, ext: *mut X509_EXTENSION, loc: c_int) -> c_int;
603    pub fn X509_add1_ext_i2d(
604        x: *mut X509,
605        nid: c_int,
606        value: *mut c_void,
607        crit: c_int,
608        flags: c_ulong,
609    ) -> c_int;
610    // in X509_CRL
611    pub fn X509_CRL_delete_ext(x: *mut X509_CRL, loc: c_int) -> *mut X509_EXTENSION;
612    pub fn X509_CRL_add_ext(x: *mut X509_CRL, ext: *mut X509_EXTENSION, loc: c_int) -> c_int;
613    pub fn X509_CRL_add1_ext_i2d(
614        x: *mut X509_CRL,
615        nid: c_int,
616        value: *mut c_void,
617        crit: c_int,
618        flags: c_ulong,
619    ) -> c_int;
620    // in X509_REVOKED
621    pub fn X509_REVOKED_delete_ext(x: *mut X509_REVOKED, loc: c_int) -> *mut X509_EXTENSION;
622    pub fn X509_REVOKED_add_ext(
623        x: *mut X509_REVOKED,
624        ext: *mut X509_EXTENSION,
625        loc: c_int,
626    ) -> c_int;
627    pub fn X509_REVOKED_add1_ext_i2d(
628        x: *mut X509_REVOKED,
629        nid: c_int,
630        value: *mut c_void,
631        crit: c_int,
632        flags: c_ulong,
633    ) -> c_int;
634    // X509_EXTENSION stack
635    // - these getters always used *const STACK
636    pub fn X509v3_get_ext_count(x: *const stack_st_X509_EXTENSION) -> c_int;
637    pub fn X509v3_get_ext_by_NID(
638        x: *const stack_st_X509_EXTENSION,
639        nid: c_int,
640        lastpos: c_int,
641    ) -> c_int;
642    pub fn X509v3_get_ext_by_critical(
643        x: *const stack_st_X509_EXTENSION,
644        crit: c_int,
645        lastpos: c_int,
646    ) -> c_int;
647    pub fn X509v3_get_ext(x: *const stack_st_X509_EXTENSION, loc: c_int) -> *mut X509_EXTENSION;
648    pub fn X509v3_delete_ext(x: *mut stack_st_X509_EXTENSION, loc: c_int) -> *mut X509_EXTENSION;
649    pub fn X509v3_add_ext(
650        x: *mut *mut stack_st_X509_EXTENSION,
651        ex: *mut X509_EXTENSION,
652        loc: c_int,
653    ) -> *mut stack_st_X509_EXTENSION;
654    // - X509V3_add1_i2d in x509v3.rs
655    // X509_EXTENSION itself
656    pub fn X509_EXTENSION_create_by_NID(
657        ex: *mut *mut X509_EXTENSION,
658        nid: c_int,
659        crit: c_int,
660        data: *mut ASN1_OCTET_STRING,
661    ) -> *mut X509_EXTENSION;
662    pub fn X509_EXTENSION_set_critical(ex: *mut X509_EXTENSION, crit: c_int) -> c_int;
663    pub fn X509_EXTENSION_set_data(ex: *mut X509_EXTENSION, data: *mut ASN1_OCTET_STRING) -> c_int;
664    pub fn X509_EXTENSION_get_object(ext: *mut X509_EXTENSION) -> *mut ASN1_OBJECT;
665    pub fn X509_EXTENSION_get_data(ext: *mut X509_EXTENSION) -> *mut ASN1_OCTET_STRING;
666}
667
668const_ptr_api! {
669    extern "C" {
670        pub fn i2d_X509_EXTENSION(ext: #[const_ptr_if(ossl300)] X509_EXTENSION, pp: *mut *mut c_uchar) -> c_int;
671    }
672}
673
674const_ptr_api! {
675    extern "C" {
676        // in X509
677        pub fn X509_get_ext_count(x: #[const_ptr_if(any(ossl110, libressl))] X509) -> c_int;
678        pub fn X509_get_ext_by_NID(x: #[const_ptr_if(any(ossl110, libressl))] X509, nid: c_int, lastpos: c_int) -> c_int;
679        pub fn X509_get_ext_by_OBJ(x: #[const_ptr_if(any(ossl110, libressl))] X509, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT, lastpos: c_int) -> c_int;
680        pub fn X509_get_ext_by_critical(x: #[const_ptr_if(any(ossl110, libressl))] X509, crit: c_int, lastpos: c_int) -> c_int;
681        pub fn X509_get_ext(x: #[const_ptr_if(any(ossl110, libressl))] X509, loc: c_int) -> *mut X509_EXTENSION;
682        pub fn X509_get_ext_d2i(
683            x: #[const_ptr_if(any(ossl110, libressl))] X509,
684            nid: c_int,
685            crit: *mut c_int,
686            idx: *mut c_int,
687        ) -> *mut c_void;
688        // in X509_CRL
689        pub fn X509_CRL_get_ext_count(x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL) -> c_int;
690        pub fn X509_CRL_get_ext_by_NID(x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL, nid: c_int, lastpos: c_int) -> c_int;
691        pub fn X509_CRL_get_ext_by_OBJ(x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT, lastpos: c_int) -> c_int;
692        pub fn X509_CRL_get_ext_by_critical(x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL, crit: c_int, lastpos: c_int) -> c_int;
693        pub fn X509_CRL_get_ext(x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL, loc: c_int) -> *mut X509_EXTENSION;
694        pub fn X509_CRL_get_ext_d2i(
695            x: #[const_ptr_if(any(ossl110, libressl))] X509_CRL,
696            nid: c_int,
697            crit: *mut c_int,
698            idx: *mut c_int,
699        ) -> *mut c_void;
700        // in X509_REVOKED
701        pub fn X509_REVOKED_get_ext_count(x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED) -> c_int;
702        pub fn X509_REVOKED_get_ext_by_NID(x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED, nid: c_int, lastpos: c_int) -> c_int;
703        pub fn X509_REVOKED_get_ext_by_OBJ(x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT, lastpos: c_int) -> c_int;
704        pub fn X509_REVOKED_get_ext_by_critical(x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED, crit: c_int, lastpos: c_int) -> c_int;
705        pub fn X509_REVOKED_get_ext(x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED, loc: c_int) -> *mut X509_EXTENSION;
706        pub fn X509_REVOKED_get_ext_d2i(
707            x: #[const_ptr_if(any(ossl110, libressl))] X509_REVOKED,
708            nid: c_int,
709            crit: *mut c_int,
710            idx: *mut c_int,
711        ) -> *mut c_void;
712        // X509_EXTENSION stack
713        pub fn X509v3_get_ext_by_OBJ(x: *const stack_st_X509_EXTENSION, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT, lastpos: c_int) -> c_int;
714        // X509_EXTENSION itself
715        pub fn X509_EXTENSION_create_by_OBJ(ex: *mut *mut X509_EXTENSION, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT, crit: c_int, data: *mut ASN1_OCTET_STRING) -> *mut X509_EXTENSION;
716        pub fn X509_EXTENSION_set_object(ex: *mut X509_EXTENSION, obj: #[const_ptr_if(any(ossl110, libressl))] ASN1_OBJECT) -> c_int;
717        pub fn X509_EXTENSION_get_critical(ex: #[const_ptr_if(any(ossl110, libressl))] X509_EXTENSION) -> c_int;
718    }
719}
720
721extern "C" {
722    pub fn X509_verify_cert(ctx: *mut X509_STORE_CTX) -> c_int;
723}
724
725const_ptr_api! {
726    extern "C" {
727        #[cfg(any(ossl110, libressl))]
728        pub fn X509_STORE_get0_objects(ctx: #[const_ptr_if(ossl300)] X509_STORE) -> *mut stack_st_X509_OBJECT;
729        #[cfg(ossl330)]
730        pub fn X509_STORE_get1_objects(ctx: *mut X509_STORE) -> *mut stack_st_X509_OBJECT;
731        #[cfg(ossl300)]
732        pub fn X509_STORE_get1_all_certs(ctx: *mut X509_STORE) -> *mut stack_st_X509;
733    }
734}
735
736#[cfg(any(ossl110, libressl))]
737extern "C" {
738    pub fn X509_OBJECT_get0_X509(x: *const X509_OBJECT) -> *mut X509;
739}
740
741cfg_if! {
742    if #[cfg(any(ossl110, libressl))] {
743        extern "C" {
744            pub fn X509_OBJECT_free(a: *mut X509_OBJECT);
745        }
746    } else {
747        extern "C" {
748            pub fn X509_OBJECT_free_contents(a: *mut X509_OBJECT);
749        }
750    }
751}
752
753extern "C" {
754    pub fn X509_get_default_cert_file_env() -> *const c_char;
755    pub fn X509_get_default_cert_file() -> *const c_char;
756    pub fn X509_get_default_cert_dir_env() -> *const c_char;
757    pub fn X509_get_default_cert_dir() -> *const c_char;
758}
759
760extern "C" {
761    pub fn X509_cmp(a: *const X509, b: *const X509) -> c_int;
762    pub fn X509_issuer_and_serial_cmp(a: *const X509, b: *const X509) -> c_int;
763    pub fn X509_issuer_name_cmp(a: *const X509, b: *const X509) -> c_int;
764    pub fn X509_subject_name_cmp(a: *const X509, b: *const X509) -> c_int;
765    pub fn X509_CRL_cmp(a: *const X509_CRL, b: *const X509_CRL) -> c_int;
766    pub fn X509_CRL_match(a: *const X509_CRL, b: *const X509_CRL) -> c_int;
767}
768
769extern "C" {
770    pub fn X509_print(bio: *mut BIO, x509: *mut X509) -> c_int;
771    pub fn X509_REQ_print(bio: *mut BIO, req: *mut X509_REQ) -> c_int;
772}
773
774cfg_if! {
775    if #[cfg(libressl390)] {
776        pub enum X509_PURPOSE {}
777    } else {
778        #[repr(C)]
779        pub struct X509_PURPOSE {
780            pub purpose: c_int,
781            pub trust: c_int, // Default trust ID
782            pub flags: c_int,
783            pub check_purpose:
784                Option<unsafe extern "C" fn(*const X509_PURPOSE, *const X509, c_int) -> c_int>,
785            pub name: *mut c_char,
786            pub sname: *mut c_char,
787            pub usr_data: *mut c_void,
788        }
789    }
790}
791
792const_ptr_api! {
793    extern "C" {
794        pub fn X509_PURPOSE_get_by_sname(sname: #[const_ptr_if(any(ossl110, libressl))] c_char) -> c_int;
795        pub fn X509_PURPOSE_get_id(purpose: #[const_ptr_if(any(ossl110, libressl))] X509_PURPOSE) -> c_int;
796        pub fn X509_PURPOSE_get0(idx: c_int) -> #[const_ptr_if(libressl390)] X509_PURPOSE;
797    }
798}
799
800extern "C" {
801    pub fn X509_ATTRIBUTE_new() -> *mut X509_ATTRIBUTE;
802    pub fn X509_ATTRIBUTE_free(attr: *mut X509_ATTRIBUTE);
803    pub fn X509_ATTRIBUTE_create(
804        nid: c_int,
805        atrtype: c_int,
806        value: *mut c_void,
807    ) -> *mut X509_ATTRIBUTE;
808    pub fn X509_ATTRIBUTE_create_by_NID(
809        attr: *mut *mut X509_ATTRIBUTE,
810        nid: c_int,
811        atrtype: c_int,
812        data: *const c_void,
813        len: c_int,
814    ) -> *mut X509_ATTRIBUTE;
815    pub fn X509_ATTRIBUTE_create_by_OBJ(
816        attr: *mut *mut X509_ATTRIBUTE,
817        obj: *const ASN1_OBJECT,
818        atrtype: c_int,
819        data: *const c_void,
820        len: c_int,
821    ) -> *mut X509_ATTRIBUTE;
822    pub fn X509_ATTRIBUTE_create_by_txt(
823        attr: *mut *mut X509_ATTRIBUTE,
824        atrname: *const c_char,
825        atrtype: c_int,
826        bytes: *const c_uchar,
827        len: c_int,
828    ) -> *mut X509_ATTRIBUTE;
829    pub fn X509_ATTRIBUTE_set1_object(attr: *mut X509_ATTRIBUTE, obj: *const ASN1_OBJECT) -> c_int;
830    pub fn X509_ATTRIBUTE_set1_data(
831        attr: *mut X509_ATTRIBUTE,
832        attrtype: c_int,
833        data: *const c_void,
834        len: c_int,
835    ) -> c_int;
836    pub fn X509_ATTRIBUTE_get0_data(
837        attr: *mut X509_ATTRIBUTE,
838        idx: c_int,
839        atrtype: c_int,
840        data: *mut c_void,
841    ) -> *mut c_void;
842    pub fn X509_ATTRIBUTE_get0_object(attr: *mut X509_ATTRIBUTE) -> *mut ASN1_OBJECT;
843    pub fn X509_ATTRIBUTE_get0_type(attr: *mut X509_ATTRIBUTE, idx: c_int) -> *mut ASN1_TYPE;
844    pub fn d2i_X509_ATTRIBUTE(
845        a: *mut *mut X509_ATTRIBUTE,
846        pp: *mut *const c_uchar,
847        length: c_long,
848    ) -> *mut X509_ATTRIBUTE;
849}
850const_ptr_api! {
851    extern "C" {
852        pub fn X509_ATTRIBUTE_count(
853            attr: #[const_ptr_if(any(ossl110, libressl))] X509_ATTRIBUTE // const since OpenSSL v1.1.0
854        ) -> c_int;
855        pub fn i2d_X509_ATTRIBUTE(x: #[const_ptr_if(ossl300)] X509_ATTRIBUTE, buf: *mut *mut u8) -> c_int;
856        pub fn X509_ATTRIBUTE_dup(x: #[const_ptr_if(ossl300)] X509_ATTRIBUTE) -> *mut X509_ATTRIBUTE;
857    }
858}