{-# LANGUAGE ForeignFunctionInterface #-}
module Network.Libre.TLS.FFI.Internal where
import Control.Monad.Primitive
import Data.Word(Word32(..), Word8(..))
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import System.Posix.Types
newtype CastedStablePtr a = CastedStablePtr ( Ptr ())
newtype TlsReadCallback b = TLSReadCB (TLSPtr -> Ptr Word8 -> CSize -> CastedStablePtr b -> IO CSsize)
foreign import ccall "wrapper"
mkReadCB :: (TLSPtr -> Ptr Word8 -> CSize -> CastedStablePtr b -> IO CSsize) -> IO (FunPtr (TlsReadCallback b))
newtype TlsWriteCallback b = TLSWriteCB (TLSPtr -> CString -> CSize -> CastedStablePtr b -> IO CSsize)
foreign import ccall "wrapper"
mkWriteCB :: (TLSPtr -> CString -> CSize -> CastedStablePtr b -> IO CSsize) -> IO (FunPtr (TlsWriteCallback b))
primWriteCallback :: (TLSPtr -> CString -> CSize -> CastedStablePtr b -> IO CSsize)
-> IO (FunPtr (TlsWriteCallback b))
primWriteCallback = \ f -> ( mkWriteCB $! (\tl buf buflen arg -> f tl buf buflen arg ))
primReadCallback :: (TLSPtr -> Ptr Word8 -> CSize -> CastedStablePtr b -> IO CSsize)
-> IO (FunPtr (TlsReadCallback b))
primReadCallback = \ f -> (
mkReadCB $! (\tl buf buflen arg -> f tl buf buflen arg ))
data LibTLSContext
newtype TLSPtr = TheTLSPTR (Ptr LibTLSContext)
data LibTLSConfig
newtype TLSConfigPtr = TheTLSConfigPtr (Ptr LibTLSConfig)
newtype LibreFD = LibreFD { unLibreFD :: CInt }
newtype LibreSocket = LibreSocket { unLibreSocket :: CInt }
newtype FilePathPtr = FilePathPtr (CString)
foreign import ccall safe "tls_accept_cbs" tls_accept_cbs_c :: TLSPtr -> Ptr (TLSPtr) -> (FunPtr (TlsReadCallback a)) -> (FunPtr (TlsWriteCallback a)) -> Ptr a -> IO CInt
foreign import ccall safe "tls_accept_fds" tls_accept_fds_c :: TLSPtr -> Ptr TLSPtr -> LibreFD -> LibreFD -> IO CInt
foreign import ccall safe "tls_accept_socket" tls_accept_socket_c :: TLSPtr -> Ptr (Ptr LibTLSContext) -> LibreSocket -> IO CInt
foreign import ccall safe "tls_client" allocate_fresh_tls_client_context_c :: IO TLSPtr
foreign import ccall safe "tls_close" tls_close_c :: TLSPtr -> IO CInt
foreign import ccall safe "tls_config_add_keypair_file" tls_config_add_keypair_file_c :: TLSConfigPtr -> FilePathPtr -> FilePathPtr -> IO CInt
foreign import ccall safe "tls_config_add_keypair_mem" tls_config_add_keypair_mem_c :: TLSConfigPtr -> Ptr Word8 -> CSize -> Ptr Word8 -> CSize->IO CInt
foreign import ccall safe "tls_config_add_keypair_ocsp_file" tls_config_add_keypair_ocsp_file_c :: TLSConfigPtr -> FilePathPtr -> FilePathPtr -> FilePathPtr -> IO CInt
foreign import ccall safe "tls_config_add_keypair_ocsp_mem" tls_config_add_keypair_ocsp_mem_c :: TLSConfigPtr -> Ptr Word8 -> CSize -> Ptr Word8 -> CSize -> Ptr Word8 -> CSize->IO CInt
foreign import ccall safe "tls_config_add_ticket_key" tls_config_add_ticket_key_c :: TLSPtr -> Word32 -> Ptr Word8 -> CSize -> IO Int
foreign import ccall safe "tls_config_clear_keys" tls_config_clear_keys_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_free" tls_config_free_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_insecure_noverifycert" tls_config_insecure_noverifycert_foot_gun_testingOnly_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_insecure_noverifyname" tls_config_insecure_noverifyname_Foot_gun_testingOnly_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_insecure_noverifytime" tls_config_insecure_noverifytime_footGun_testing_only_C :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_new" tls_config_new_c :: IO TLSConfigPtr
foreign import ccall safe "tls_config_ocsp_require_stapling" tls_config_ocsp_require_stapling_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_parse_protocols" tls_config_parse_protocols_c :: CString -> CString -> IO CInt
foreign import ccall safe "tls_config_prefer_ciphers_client" tls_config_prefer_ciphers_client_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_prefer_ciphers_server" tls_config_prefer_ciphers_server_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_set_alpn" tls_config_set_alpn_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_ca_file" tls_config_set_ca_file_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_ca_mem" tls_config_set_ca_mem_c :: TLSConfigPtr -> Ptr Word8 -> CSize -> IO CInt
foreign import ccall safe "tls_config_set_ca_path" tls_config_set_ca_path_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_cert_file" tls_config_set_cert_file_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_cert_mem" tls_config_set_cert_mem_c :: TLSConfigPtr -> Ptr Word8 -> CSize -> IO CInt
foreign import ccall safe "tls_config_set_ciphers" tls_config_set_ciphers_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_dheparams" tls_config_set_dheparams_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_ecdhecurve" tls_config_set_ecdhecurve_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_key_file" tls_config_set_key_file_c :: TLSConfigPtr -> CString -> IO CInt
foreign import ccall safe "tls_config_set_key_mem" tls_config_set_key_mem_c :: TLSConfigPtr -> Ptr CChar -> CSize -> IO CInt
foreign import ccall safe "tls_config_set_keypair_file" tls_config_set_keypair_file_c :: TLSConfigPtr -> CString -> CString -> IO CInt
foreign import ccall safe "tls_config_set_protocols" tls_config_set_protocols_c :: TLSConfigPtr -> Word32 -> IO ()
foreign import ccall safe "tls_config_set_verify_depth" tls_config_set_verify_depth_c :: TLSConfigPtr -> CInt -> IO ()
foreign import ccall safe "tls_config_verify" tls_config_verify_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_verify_client" tls_config_verify_client_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_config_verify_client_optional" tls_config_verify_client_optional_c :: TLSConfigPtr -> IO ()
foreign import ccall safe "tls_configure" tls_configure_c :: TLSPtr -> TLSConfigPtr -> IO CInt
foreign import ccall safe "tls_conn_alpn_selected" tls_conn_alpn_selected_c :: TLSPtr -> CString
foreign import ccall safe "tls_conn_cipher" tls_conn_cipher_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_conn_version" tls_conn_version_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_connect" tls_connect_c :: TLSPtr -> CString -> CString -> IO CInt
foreign import ccall safe "tls_connect_fds" tls_connect_fds_c :: TLSPtr -> LibreFD -> LibreFD -> CString -> IO CInt
foreign import ccall safe "tls_connect_servername" tls_connect_servername_c :: TLSPtr -> CString -> CString -> CString -> IO CInt
foreign import ccall safe "tls_connect_socket" tls_connect_socket_c :: TLSPtr -> LibreSocket -> CString -> IO CInt
foreign import ccall safe "tls_error" tls_error_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_free" tls_free_c :: TLSPtr -> IO ()
foreign import ccall safe "tls_handshake" tls_handshake_c :: TLSPtr -> IO CInt
foreign import ccall safe "tls_init" tls_init_c :: IO CInt
foreign import ccall safe "tls_load_file" tls_load_file_c :: CString -> CSize -> CString -> IO CString
foreign import ccall safe "tls_peer_cert_contains_name" tls_peer_cert_contains_name_c :: TLSPtr -> CString -> IO CInt
foreign import ccall safe "tls_peer_cert_hash" tls_peer_cert_hash_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_peer_cert_issuer" tls_peer_cert_issuer_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_peer_cert_notafter" tls_peer_cert_notafter_c :: TLSPtr -> IO CTime
foreign import ccall safe "tls_peer_cert_notbefore" tls_peer_cert_notbefore_c :: TLSPtr -> IO CTime
foreign import ccall safe "tls_peer_cert_provided" tls_peer_cert_provided_c :: TLSPtr -> IO CInt
foreign import ccall safe "tls_peer_cert_subject" tls_peer_cert_subject_c :: TLSPtr -> IO CString
foreign import ccall safe "tls_write" tls_read_c :: TLSPtr -> CString -> CSize -> IO CSsize
foreign import ccall safe "tls_server" allocate_fresh_tls_server_context_c :: IO TLSPtr
foreign import ccall safe "tls_write" tls_write_c :: TLSPtr -> CString -> CSize -> IO CSsize