packages feed

botan-bindings-0.0.1.0: src/Botan/Bindings/PubKey/KeyEncapsulation.hs

{-|
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 { runBotanPKOpKEMEncrypt :: Ptr BotanPKOpKEMEncryptStruct }
        deriving newtype (Eq, Ord, 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 { runBotanPKOpKEMDecrypt :: Ptr BotanPKOpKEMDecryptStruct }
        deriving newtype (Eq, Ord, 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