{-# OPTIONS_GHC -optc-DOPENSSL_HAS_PBKDF2 #-}
{-# OPTIONS_GHC -optc-DOPENSSL_HAS_GCM #-}
{-# LINE 1 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE EmptyDataDecls #-}
module Crypto.OpenSSL.AES.Foreign where





{-# LINE 11 "Crypto/OpenSSL/AES/Foreign.hsc" #-}


{-# LINE 13 "Crypto/OpenSSL/AES/Foreign.hsc" #-}



{-# LINE 16 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

import Foreign.Marshal.Alloc
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.C.Types
import Data.Word

{-# LINE 23 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
import qualified Data.Memory.PtrMethods as B (memSet)

{-# LINE 25 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

gcmTagLength :: Int
gcmTagLength = 16


{-# LINE 30 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
sizeofEVP :: Int
sizeofEVP = (168)
{-# LINE 32 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

{-# LINE 33 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

data ENGINE

data EVP_CIPHER
data EVP_CIPHER_CTX

type KeyBuf = Ptr Word8

type IvBuf = Ptr Word8
type DataBuf = Ptr Word8
type OutputOffset = Ptr CInt
type InputLength = CInt

compatNewEvpCipherCtx :: IO (ForeignPtr EVP_CIPHER_CTX)
compatNewEvpCipherCtx = do

{-# LINE 52 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
    ptr <- mallocBytes sizeofEVP
    B.memSet (castPtr ptr) 0 (fromIntegral sizeofEVP)
    ssl_c_cipher_ctx_init ptr
    newForeignPtr ssl_c_cipher_ctx_cleanup ptr

{-# LINE 57 "Crypto/OpenSSL/AES/Foreign.hsc" #-}


{-# LINE 62 "Crypto/OpenSSL/AES/Foreign.hsc" #-}


{-# LINE 64 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
foreign import ccall unsafe "EVP_CIPHER_CTX_init"
    ssl_c_cipher_ctx_init :: Ptr EVP_CIPHER_CTX -> IO ()

{-# LINE 67 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

foreign import ccall unsafe "&EVP_CIPHER_CTX_free"
    ssl_c_cipher_ctx_free :: FunPtr (Ptr EVP_CIPHER_CTX -> IO ())


{-# LINE 72 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
foreign import ccall unsafe "&EVP_CIPHER_CTX_cleanup"
    ssl_c_cipher_ctx_cleanup :: FunPtr (Ptr EVP_CIPHER_CTX -> IO ())

{-# LINE 75 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

foreign import ccall unsafe "EVP_CIPHER_CTX_ctrl"
    ssl_c_cipher_ctx_ctrl :: Ptr EVP_CIPHER_CTX -> CInt -> CInt -> Ptr a -> IO CInt

foreign import ccall unsafe "EVP_CIPHER_CTX_set_padding"
    ssl_c_cipher_ctx_set_padding :: Ptr EVP_CIPHER_CTX -> CInt -> IO CInt

foreign import ccall unsafe "EVP_CIPHER_CTX_set_key_length"
    ssl_c_cipher_ctx_set_key_length :: Ptr EVP_CIPHER_CTX -> CInt -> IO CInt

foreign import ccall unsafe "EVP_EncryptInit_ex"
    ssl_c_encryptinit_ex :: Ptr EVP_CIPHER_CTX -> Ptr EVP_CIPHER -> Ptr ENGINE -> KeyBuf -> IvBuf -> IO CInt

foreign import ccall unsafe "EVP_DecryptInit_ex"
    ssl_c_decryptinit_ex :: Ptr EVP_CIPHER_CTX -> Ptr EVP_CIPHER -> Ptr ENGINE -> KeyBuf -> IvBuf -> IO CInt

foreign import ccall unsafe "EVP_EncryptUpdate"
    ssl_c_encryptupdate :: Ptr EVP_CIPHER_CTX -> DataBuf -> OutputOffset -> DataBuf -> InputLength -> IO CInt

foreign import ccall unsafe "EVP_DecryptUpdate"
    ssl_c_decryptupdate :: Ptr EVP_CIPHER_CTX -> DataBuf -> OutputOffset -> DataBuf -> InputLength -> IO CInt

foreign import ccall unsafe "EVP_EncryptFinal_ex"
    ssl_c_encryptfinal_ex :: Ptr EVP_CIPHER_CTX -> DataBuf -> OutputOffset -> IO CInt

foreign import ccall unsafe "EVP_DecryptFinal_ex"
    ssl_c_decryptfinal_ex :: Ptr EVP_CIPHER_CTX -> DataBuf -> OutputOffset -> IO CInt


{-# LINE 104 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
foreign import ccall unsafe "EVP_aes_256_gcm"
    ssl_c_aes_256_gcm :: IO (Ptr EVP_CIPHER)

{-# LINE 110 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

ctrl_GCM_SET_IVLEN, ctrl_GCM_GET_TAG, ctrl_GCM_SET_TAG :: CInt

{-# LINE 113 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
ctrl_GCM_SET_IVLEN = (9)
{-# LINE 114 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
ctrl_GCM_GET_TAG =  (16)
{-# LINE 115 "Crypto/OpenSSL/AES/Foreign.hsc" #-}
ctrl_GCM_SET_TAG =  (17)
{-# LINE 116 "Crypto/OpenSSL/AES/Foreign.hsc" #-}

{-# LINE 122 "Crypto/OpenSSL/AES/Foreign.hsc" #-}