     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

    use libc::*;

    pub const AES_ENCRYPT: c_int = 1;
    pub const AES_DECRYPT: c_int = 0;

    pub const AES_MAXNR: c_int = 14;
    pub const AES_BLOCK_SIZE: c_int = 16;

    #[repr(C)]
    pub struct AES_KEY {
        // There is some business with AES_LONG which is there to ensure the values here are 32 bits
        rd_key: [u32; 4 * (AES_MAXNR as usize + 1)],
        rounds: c_int,
    }

    extern "C" {
        pub fn AES_set_encrypt_key(userKey: *const c_uchar, bits: c_int, key: *mut AES_KEY) -> c_int;
        pub fn AES_set_decrypt_key(userKey: *const c_uchar, bits: c_int, key: *mut AES_KEY) -> c_int;

        pub fn AES_ige_encrypt(
            in_: *const c_uchar,
            out: *mut c_uchar,
            length: size_t,
            key: *const AES_KEY,
            ivec: *mut c_uchar,
            enc: c_int,
        );

        pub fn AES_wrap_key(
            key: *mut AES_KEY,
            iv: *const c_uchar,
            out: *mut c_uchar,
            in_: *const c_uchar,
            inlen: c_uint,
        ) -> c_int;

        pub fn AES_unwrap_key(
            key: *mut AES_KEY,
            iv: *const c_uchar,
            out: *mut c_uchar,
            in_: *const c_uchar,
            inlen: c_uint,
        ) -> c_int;
    }