{-# LANGUAGE CApiFFI             #-}
{-# LANGUAGE DerivingStrategies  #-}
module Cardano.Crypto.Libsodium.C (
    
    c_sodium_init,
    
    c_sodium_memzero,
    c_sodium_malloc,
    c_sodium_free,
    c_sodium_free_funptr,
    
    
    c_crypto_hash_sha256,
    c_crypto_hash_sha256_final,
    c_crypto_hash_sha256_init,
    c_crypto_hash_sha256_update,
    
    c_crypto_generichash_blake2b,
    c_crypto_generichash_blake2b_final,
    c_crypto_generichash_blake2b_init,
    c_crypto_generichash_blake2b_update,
    
    c_crypto_sign_ed25519_seed_keypair,
    c_crypto_sign_ed25519_sk_to_seed,
    c_crypto_sign_ed25519_detached,
    c_crypto_sign_ed25519_verify_detached,
    c_crypto_sign_ed25519_sk_to_pk,
    
    c_sodium_compare,
    
    CRYPTO_SHA256_BYTES,
    CRYPTO_SHA512_BYTES,
    CRYPTO_BLAKE2B_256_BYTES,
    CRYPTO_SHA256_STATE_SIZE,
    CRYPTO_SHA512_STATE_SIZE,
    CRYPTO_BLAKE2B_256_STATE_SIZE,
    CRYPTO_SIGN_ED25519_BYTES,
    CRYPTO_SIGN_ED25519_SEEDBYTES,
    CRYPTO_SIGN_ED25519_PUBLICKEYBYTES,
    CRYPTO_SIGN_ED25519_SECRETKEYBYTES,
    ) where
import Foreign.C.Types
import Foreign.Ptr (FunPtr, Ptr)
import Cardano.Foreign
import Cardano.Crypto.Libsodium.Constants
foreign import capi "sodium.h sodium_init"  c_sodium_init :: IO Int
foreign import capi unsafe "sodium.h sodium_memzero" c_sodium_memzero :: Ptr a -> CSize -> IO ()
foreign import capi unsafe "sodium.h sodium_malloc" c_sodium_malloc :: CSize -> IO (Ptr a)
foreign import capi unsafe "sodium.h sodium_free" c_sodium_free :: Ptr a -> IO ()
foreign import capi unsafe "sodium.h &sodium_free" c_sodium_free_funptr :: FunPtr (Ptr a -> IO ())
foreign import capi unsafe "sodium.h crypto_hash_sha256" c_crypto_hash_sha256 :: SizedPtr CRYPTO_SHA256_BYTES -> Ptr CUChar -> CULLong -> IO Int
foreign import capi unsafe "sodium.h crypto_hash_sha256_init" c_crypto_hash_sha256_init :: SizedPtr CRYPTO_SHA256_STATE_SIZE -> IO Int
foreign import capi unsafe "sodium.h crypto_hash_sha256_update" c_crypto_hash_sha256_update :: SizedPtr CRYPTO_SHA256_STATE_SIZE -> Ptr CUChar -> CULLong -> IO Int
foreign import capi unsafe "sodium.h crypto_hash_sha256_final" c_crypto_hash_sha256_final :: SizedPtr CRYPTO_SHA256_STATE_SIZE -> SizedPtr CRYPTO_SHA256_BYTES -> IO Int
foreign import capi unsafe "sodium.h crypto_generichash_blake2b" c_crypto_generichash_blake2b
    :: Ptr out -> CSize
    -> Ptr CUChar -> CULLong
    -> Ptr key -> CSize
    -> IO Int
foreign import capi unsafe "sodium.h crypto_generichash_blake2b_init" c_crypto_generichash_blake2b_init :: SizedPtr CRYPTO_BLAKE2B_256_STATE_SIZE -> Ptr key -> CSize -> CSize -> IO Int
foreign import capi unsafe "sodium.h crypto_generichash_blake2b_update" c_crypto_generichash_blake2b_update :: SizedPtr CRYPTO_BLAKE2B_256_STATE_SIZE -> Ptr CUChar -> CULLong -> IO Int
foreign import capi unsafe "sodium.h crypto_generichash_blake2b_final" c_crypto_generichash_blake2b_final :: SizedPtr CRYPTO_BLAKE2B_256_STATE_SIZE -> Ptr out -> CSize -> IO Int
foreign import capi unsafe "sodium.h crypto_sign_ed25519_seed_keypair" c_crypto_sign_ed25519_seed_keypair
    :: SizedPtr CRYPTO_SIGN_ED25519_PUBLICKEYBYTES
    -> SizedPtr CRYPTO_SIGN_ED25519_SECRETKEYBYTES
    -> SizedPtr CRYPTO_SIGN_ED25519_SEEDBYTES
    -> IO Int
foreign import capi unsafe "sodium.h crypto_sign_ed25519_sk_to_seed" c_crypto_sign_ed25519_sk_to_seed
    :: SizedPtr CRYPTO_SIGN_ED25519_SEEDBYTES
    -> SizedPtr CRYPTO_SIGN_ED25519_SECRETKEYBYTES
    -> IO Int
foreign import capi unsafe "sodium.h crypto_sign_ed25519_detached" c_crypto_sign_ed25519_detached
    :: SizedPtr CRYPTO_SIGN_ED25519_BYTES
    -> Ptr CULLong
    -> Ptr CUChar
    -> CULLong
    -> SizedPtr CRYPTO_SIGN_ED25519_SECRETKEYBYTES
    -> IO Int
foreign import capi unsafe "sodium.h crypto_sign_ed25519_verify_detached" c_crypto_sign_ed25519_verify_detached
    :: SizedPtr CRYPTO_SIGN_ED25519_BYTES
    -> Ptr CUChar
    -> CULLong
    -> SizedPtr CRYPTO_SIGN_ED25519_PUBLICKEYBYTES
    -> IO Int
foreign import capi unsafe "sodium.h crypto_sign_ed25519_sk_to_pk" c_crypto_sign_ed25519_sk_to_pk
    :: SizedPtr CRYPTO_SIGN_ED25519_PUBLICKEYBYTES
    -> SizedPtr CRYPTO_SIGN_ED25519_SECRETKEYBYTES -> IO Int
foreign import capi unsafe "sodium.h sodium_compare" c_sodium_compare :: Ptr a -> Ptr a -> CSize -> IO Int