      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130

    use libc::*;

    use *;

    #[cfg(not(ossl110))]
    pub const CRYPTO_LOCK_X509: c_int = 3;
    #[cfg(not(ossl110))]
    pub const CRYPTO_LOCK_EVP_PKEY: c_int = 10;
    #[cfg(not(ossl110))]
    pub const CRYPTO_LOCK_SSL_CTX: c_int = 12;
    #[cfg(not(ossl110))]
    pub const CRYPTO_LOCK_SSL_SESSION: c_int = 14;

    stack!(stack_st_void);

    cfg_if! {
        if #[cfg(ossl110)] {
            pub const CRYPTO_EX_INDEX_SSL: c_int = 0;
            pub const CRYPTO_EX_INDEX_SSL_CTX: c_int = 1;
        } else if #[cfg(libressl)] {
            pub const CRYPTO_EX_INDEX_SSL: c_int = 1;
            pub const CRYPTO_EX_INDEX_SSL_CTX: c_int = 2;
        }
    }
    cfg_if! {
        if #[cfg(any(ossl110, libressl271))] {
            extern "C" {
                pub fn OpenSSL_version_num() -> c_ulong;
                pub fn OpenSSL_version(key: c_int) -> *const c_char;
            }
            pub const OPENSSL_VERSION: c_int = 0;
            pub const OPENSSL_CFLAGS: c_int = 1;
            pub const OPENSSL_BUILT_ON: c_int = 2;
            pub const OPENSSL_PLATFORM: c_int = 3;
            pub const OPENSSL_DIR: c_int = 4;
        } else {
            extern "C" {
                pub fn SSLeay() -> c_ulong;
                pub fn SSLeay_version(key: c_int) -> *const c_char;
            }
            pub const SSLEAY_VERSION: c_int = 0;
            pub const SSLEAY_CFLAGS: c_int = 2;
            pub const SSLEAY_BUILT_ON: c_int = 3;
            pub const SSLEAY_PLATFORM: c_int = 4;
            pub const SSLEAY_DIR: c_int = 5;
        }
    }

    // FIXME should be options
    pub type CRYPTO_EX_new = unsafe extern "C" fn(
        parent: *mut c_void,
        ptr: *mut c_void,
        ad: *const CRYPTO_EX_DATA,
        idx: c_int,
        argl: c_long,
        argp: *const c_void,
    ) -> c_int;
    pub type CRYPTO_EX_dup = unsafe extern "C" fn(
        to: *mut CRYPTO_EX_DATA,
        from: *mut CRYPTO_EX_DATA,
        from_d: *mut c_void,
        idx: c_int,
        argl: c_long,
        argp: *mut c_void,
    ) -> c_int;
    pub type CRYPTO_EX_free = unsafe extern "C" fn(
        parent: *mut c_void,
        ptr: *mut c_void,
        ad: *mut CRYPTO_EX_DATA,
        idx: c_int,
        argl: c_long,
        argp: *mut c_void,
    );
    extern "C" {
        #[cfg(any(ossl110, libressl))]
        pub fn CRYPTO_get_ex_new_index(
            class_index: c_int,
            argl: c_long,
            argp: *mut c_void,
            new_func: Option<CRYPTO_EX_new>,
            dup_func: Option<CRYPTO_EX_dup>,
            free_func: Option<CRYPTO_EX_free>,
        ) -> c_int;
    }

    pub const CRYPTO_LOCK: c_int = 1;

    extern "C" {
        #[cfg(not(ossl110))]
        pub fn CRYPTO_num_locks() -> c_int;
        #[cfg(not(ossl110))]
        pub fn CRYPTO_set_locking_callback(
            func: unsafe extern "C" fn(mode: c_int, n: c_int, file: *const c_char, line: c_int),
        );

        #[cfg(not(ossl110))]
        pub fn CRYPTO_set_id_callback(func: unsafe extern "C" fn() -> c_ulong);

        #[cfg(not(ossl110))]
        pub fn CRYPTO_add_lock(
            pointer: *mut c_int,
            amount: c_int,
            type_: c_int,
            file: *const c_char,
            line: c_int,
        ) -> c_int;
    }

    cfg_if! {
        if #[cfg(ossl110)] {
            extern "C" {
                pub fn CRYPTO_malloc(num: size_t, file: *const c_char, line: c_int) -> *mut c_void;
                pub fn CRYPTO_free(buf: *mut c_void, file: *const c_char, line: c_int);
            }
        } else {
            extern "C" {
                pub fn CRYPTO_malloc(num: c_int, file: *const c_char, line: c_int) -> *mut c_void;
                pub fn CRYPTO_free(buf: *mut c_void);
            }
        }
    }

    extern "C" {
        #[cfg(ossl101)]
        pub fn FIPS_mode() -> c_int;
        #[cfg(ossl101)]
        pub fn FIPS_mode_set(onoff: c_int) -> c_int;

        pub fn CRYPTO_memcmp(a: *const c_void, b: *const c_void, len: size_t) -> c_int;
    }