{-|
Module      : Botan.Bindings.KeyEncapsulation
Description : Key Encapsulation
Copyright   : (c) Leo D, 2023
License     : BSD-3-Clause
Maintainer  : leo@apotheca.io
Stability   : experimental
Portability : POSIX
-}

{-# LANGUAGE CApiFFI #-}

module Botan.Bindings.PubKey.KeyEncapsulation where

import Botan.Bindings.Prelude
import Botan.Bindings.PubKey
import Botan.Bindings.RNG

-- | Opaque KEM encrypt struct
data {-# CTYPE "botan/ffi.h" "struct botan_pk_op_kem_encrypt_struct" #-} BotanPKOpKEMEncryptStruct

-- | Botan KEM encrypt object
newtype {-# CTYPE "botan/ffi.h" "botan_pk_op_kem_encrypt_t" #-} BotanPKOpKEMEncrypt
    = MkBotanPKOpKEMEncrypt { BotanPKOpKEMEncrypt -> Ptr BotanPKOpKEMEncryptStruct
runBotanPKOpKEMEncrypt :: Ptr BotanPKOpKEMEncryptStruct }
        deriving newtype (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
(BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> Eq BotanPKOpKEMEncrypt
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
== :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
$c/= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
/= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
Eq, Eq BotanPKOpKEMEncrypt
Eq BotanPKOpKEMEncrypt
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Ordering)
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> (BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool)
-> (BotanPKOpKEMEncrypt
    -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt)
-> (BotanPKOpKEMEncrypt
    -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt)
-> Ord BotanPKOpKEMEncrypt
BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Ordering
BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Ordering
compare :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Ordering
$c< :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
< :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
$c<= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
<= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
$c> :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
> :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
$c>= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
>= :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> Bool
$cmax :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt
max :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt
$cmin :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt
min :: BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt
Ord, Ptr BotanPKOpKEMEncrypt -> IO BotanPKOpKEMEncrypt
Ptr BotanPKOpKEMEncrypt -> Int -> IO BotanPKOpKEMEncrypt
Ptr BotanPKOpKEMEncrypt -> Int -> BotanPKOpKEMEncrypt -> IO ()
Ptr BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> IO ()
BotanPKOpKEMEncrypt -> Int
(BotanPKOpKEMEncrypt -> Int)
-> (BotanPKOpKEMEncrypt -> Int)
-> (Ptr BotanPKOpKEMEncrypt -> Int -> IO BotanPKOpKEMEncrypt)
-> (Ptr BotanPKOpKEMEncrypt -> Int -> BotanPKOpKEMEncrypt -> IO ())
-> (forall b. Ptr b -> Int -> IO BotanPKOpKEMEncrypt)
-> (forall b. Ptr b -> Int -> BotanPKOpKEMEncrypt -> IO ())
-> (Ptr BotanPKOpKEMEncrypt -> IO BotanPKOpKEMEncrypt)
-> (Ptr BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> IO ())
-> Storable BotanPKOpKEMEncrypt
forall b. Ptr b -> Int -> IO BotanPKOpKEMEncrypt
forall b. Ptr b -> Int -> BotanPKOpKEMEncrypt -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
$csizeOf :: BotanPKOpKEMEncrypt -> Int
sizeOf :: BotanPKOpKEMEncrypt -> Int
$calignment :: BotanPKOpKEMEncrypt -> Int
alignment :: BotanPKOpKEMEncrypt -> Int
$cpeekElemOff :: Ptr BotanPKOpKEMEncrypt -> Int -> IO BotanPKOpKEMEncrypt
peekElemOff :: Ptr BotanPKOpKEMEncrypt -> Int -> IO BotanPKOpKEMEncrypt
$cpokeElemOff :: Ptr BotanPKOpKEMEncrypt -> Int -> BotanPKOpKEMEncrypt -> IO ()
pokeElemOff :: Ptr BotanPKOpKEMEncrypt -> Int -> BotanPKOpKEMEncrypt -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpKEMEncrypt
peekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpKEMEncrypt
$cpokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpKEMEncrypt -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpKEMEncrypt -> IO ()
$cpeek :: Ptr BotanPKOpKEMEncrypt -> IO BotanPKOpKEMEncrypt
peek :: Ptr BotanPKOpKEMEncrypt -> IO BotanPKOpKEMEncrypt
$cpoke :: Ptr BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> IO ()
poke :: Ptr BotanPKOpKEMEncrypt -> BotanPKOpKEMEncrypt -> IO ()
Storable)

-- | Destroy a KEM encrypt object
foreign import capi safe "botan/ffi.h &botan_pk_op_kem_encrypt_destroy"
    botan_pk_op_kem_encrypt_destroy
        :: FinalizerPtr BotanPKOpKEMEncryptStruct

foreign import capi safe "botan/ffi.h botan_pk_op_kem_encrypt_create"
    botan_pk_op_kem_encrypt_create
        :: Ptr BotanPKOpKEMEncrypt       -- ^ __op__
        -> BotanPubKey                   -- ^ __key__
        -> ConstPtr CChar                -- ^ __kdf__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_kem_encrypt_shared_key_length"
    botan_pk_op_kem_encrypt_shared_key_length
        :: BotanPKOpKEMEncrypt       -- ^ __op__
        -> CSize                     -- ^ __desired_shared_key_length__
        -> Ptr CSize                 -- ^ __output_shared_key_length__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_kem_encrypt_encapsulated_key_length"
    botan_pk_op_kem_encrypt_encapsulated_key_length
        :: BotanPKOpKEMEncrypt       -- ^ __op__
        -> Ptr CSize                 -- ^ __output_encapsulated_key_length__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_kem_encrypt_create_shared_key"
    botan_pk_op_kem_encrypt_create_shared_key
        :: BotanPKOpKEMEncrypt       -- ^ __op__
        -> BotanRNG                  -- ^ __rng__
        -> ConstPtr Word8            -- ^ __salt[]__
        -> CSize                     -- ^ __salt_len__
        -> CSize                     -- ^ __desired_shared_key_len__
        -> Ptr Word8                 -- ^ __shared_key[]__
        -> Ptr CSize                 -- ^ __shared_key_len__
        -> Ptr Word8                 -- ^ __encapsulated_key[]__
        -> Ptr CSize                 -- ^ __encapsulated_key_len__
        -> IO CInt

-- | Opaque KEM decrypt struct
data {-# CTYPE "botan/ffi.h" "struct botan_pk_op_kem_decrypt_struct" #-} BotanPKOpKEMDecryptStruct

-- | Botan KEM decrypt object
newtype {-# CTYPE "botan/ffi.h" "botan_pk_op_kem_decrypt_t" #-} BotanPKOpKEMDecrypt
    = MkBotanPKOpKEMDecrypt { BotanPKOpKEMDecrypt -> Ptr BotanPKOpKEMDecryptStruct
runBotanPKOpKEMDecrypt :: Ptr BotanPKOpKEMDecryptStruct }
        deriving newtype (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
(BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> Eq BotanPKOpKEMDecrypt
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
== :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
$c/= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
/= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
Eq, Eq BotanPKOpKEMDecrypt
Eq BotanPKOpKEMDecrypt
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Ordering)
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> (BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool)
-> (BotanPKOpKEMDecrypt
    -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt)
-> (BotanPKOpKEMDecrypt
    -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt)
-> Ord BotanPKOpKEMDecrypt
BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Ordering
BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Ordering
compare :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Ordering
$c< :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
< :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
$c<= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
<= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
$c> :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
> :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
$c>= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
>= :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> Bool
$cmax :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt
max :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt
$cmin :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt
min :: BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt
Ord, Ptr BotanPKOpKEMDecrypt -> IO BotanPKOpKEMDecrypt
Ptr BotanPKOpKEMDecrypt -> Int -> IO BotanPKOpKEMDecrypt
Ptr BotanPKOpKEMDecrypt -> Int -> BotanPKOpKEMDecrypt -> IO ()
Ptr BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> IO ()
BotanPKOpKEMDecrypt -> Int
(BotanPKOpKEMDecrypt -> Int)
-> (BotanPKOpKEMDecrypt -> Int)
-> (Ptr BotanPKOpKEMDecrypt -> Int -> IO BotanPKOpKEMDecrypt)
-> (Ptr BotanPKOpKEMDecrypt -> Int -> BotanPKOpKEMDecrypt -> IO ())
-> (forall b. Ptr b -> Int -> IO BotanPKOpKEMDecrypt)
-> (forall b. Ptr b -> Int -> BotanPKOpKEMDecrypt -> IO ())
-> (Ptr BotanPKOpKEMDecrypt -> IO BotanPKOpKEMDecrypt)
-> (Ptr BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> IO ())
-> Storable BotanPKOpKEMDecrypt
forall b. Ptr b -> Int -> IO BotanPKOpKEMDecrypt
forall b. Ptr b -> Int -> BotanPKOpKEMDecrypt -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
$csizeOf :: BotanPKOpKEMDecrypt -> Int
sizeOf :: BotanPKOpKEMDecrypt -> Int
$calignment :: BotanPKOpKEMDecrypt -> Int
alignment :: BotanPKOpKEMDecrypt -> Int
$cpeekElemOff :: Ptr BotanPKOpKEMDecrypt -> Int -> IO BotanPKOpKEMDecrypt
peekElemOff :: Ptr BotanPKOpKEMDecrypt -> Int -> IO BotanPKOpKEMDecrypt
$cpokeElemOff :: Ptr BotanPKOpKEMDecrypt -> Int -> BotanPKOpKEMDecrypt -> IO ()
pokeElemOff :: Ptr BotanPKOpKEMDecrypt -> Int -> BotanPKOpKEMDecrypt -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpKEMDecrypt
peekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpKEMDecrypt
$cpokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpKEMDecrypt -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpKEMDecrypt -> IO ()
$cpeek :: Ptr BotanPKOpKEMDecrypt -> IO BotanPKOpKEMDecrypt
peek :: Ptr BotanPKOpKEMDecrypt -> IO BotanPKOpKEMDecrypt
$cpoke :: Ptr BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> IO ()
poke :: Ptr BotanPKOpKEMDecrypt -> BotanPKOpKEMDecrypt -> IO ()
Storable)

-- | Destroy a KEM decrypt object
foreign import capi safe "botan/ffi.h &botan_pk_op_kem_decrypt_destroy"
    botan_pk_op_kem_decrypt_destroy
        :: FinalizerPtr BotanPKOpKEMDecryptStruct

foreign import capi safe "botan/ffi.h botan_pk_op_kem_decrypt_create"
    botan_pk_op_kem_decrypt_create
        :: Ptr BotanPKOpKEMDecrypt       -- ^ __op__
        -> BotanPrivKey                  -- ^ __key__
        -> ConstPtr CChar                -- ^ __kdf__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_kem_decrypt_shared_key_length"
    botan_pk_op_kem_decrypt_shared_key_length
        :: BotanPKOpKEMDecrypt       -- ^ __op__
        -> CSize                     -- ^ __desired_shared_key_length__
        -> Ptr CSize                 -- ^ __output_shared_key_length__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_kem_decrypt_shared_key"
    botan_pk_op_kem_decrypt_shared_key
        :: BotanPKOpKEMDecrypt       -- ^ __op__
        -> ConstPtr Word8            -- ^ __salt[]__
        -> CSize                     -- ^ __salt_len__
        -> ConstPtr Word8            -- ^ __encapsulated_key[]__
        -> CSize                     -- ^ __encapsulated_key_len__
        -> CSize                     -- ^ __desired_shared_key_len__
        -> Ptr Word8                 -- ^ __shared_key[]__
        -> Ptr CSize                 -- ^ __shared_key_len__
        -> IO CInt