{-|
Module      : Botan.Low.PubKey.Decrypt
Description : Public Key Decryption
Copyright   : (c) Leo D, 2023
License     : BSD-3-Clause
Maintainer  : leo@apotheca.io
Stability   : experimental
Portability : POSIX
-}

module Botan.Low.PubKey.Decrypt
(

-- * Public key decryption
  Decrypt(..)
, withDecrypt
, decryptCreate
, decryptDestroy
, decryptOutputLength
, decrypt  

) where

import qualified Data.ByteString as ByteString

import Botan.Bindings.PubKey.Decrypt

import Botan.Low.Error
import Botan.Low.Make
import Botan.Low.Prelude
import Botan.Low.RNG
import Botan.Low.PubKey
import Botan.Low.Remake

-- /*
-- * Public Key Decryption
-- */

newtype Decrypt = MkDecrypt { Decrypt -> ForeignPtr BotanPKOpDecryptStruct
getDecryptForeignPtr :: ForeignPtr BotanPKOpDecryptStruct }

newDecrypt      :: BotanPKOpDecrypt -> IO Decrypt
withDecrypt     :: Decrypt -> (BotanPKOpDecrypt -> IO a) -> IO a
decryptDestroy  :: Decrypt -> IO ()
createDecrypt   :: (Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt
(BotanPKOpDecrypt -> IO Decrypt
newDecrypt, Decrypt -> (BotanPKOpDecrypt -> IO a) -> IO a
withDecrypt, Decrypt -> IO ()
decryptDestroy, (Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt
createDecrypt, (Ptr BotanPKOpDecrypt -> Ptr CSize -> IO CInt) -> IO [Decrypt]
_)
    = (Ptr BotanPKOpDecryptStruct -> BotanPKOpDecrypt)
-> (BotanPKOpDecrypt -> Ptr BotanPKOpDecryptStruct)
-> (ForeignPtr BotanPKOpDecryptStruct -> Decrypt)
-> (Decrypt -> ForeignPtr BotanPKOpDecryptStruct)
-> FinalizerPtr BotanPKOpDecryptStruct
-> (BotanPKOpDecrypt -> IO Decrypt,
    Decrypt -> (BotanPKOpDecrypt -> IO a) -> IO a, Decrypt -> IO (),
    (Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt,
    (Ptr BotanPKOpDecrypt -> Ptr CSize -> IO CInt) -> IO [Decrypt])
forall botan struct object a.
Storable botan =>
(Ptr struct -> botan)
-> (botan -> Ptr struct)
-> (ForeignPtr struct -> object)
-> (object -> ForeignPtr struct)
-> FinalizerPtr struct
-> (botan -> IO object, object -> (botan -> IO a) -> IO a,
    object -> IO (), (Ptr botan -> IO CInt) -> IO object,
    (Ptr botan -> Ptr CSize -> IO CInt) -> IO [object])
mkBindings
        Ptr BotanPKOpDecryptStruct -> BotanPKOpDecrypt
MkBotanPKOpDecrypt BotanPKOpDecrypt -> Ptr BotanPKOpDecryptStruct
runBotanPKOpDecrypt
        ForeignPtr BotanPKOpDecryptStruct -> Decrypt
MkDecrypt Decrypt -> ForeignPtr BotanPKOpDecryptStruct
getDecryptForeignPtr
        FinalizerPtr BotanPKOpDecryptStruct
botan_pk_op_decrypt_destroy

decryptCreate
    :: PrivKey  -- ^ __key__
    -> EMEName  -- ^ __padding__
    -> IO Decrypt
decryptCreate :: PrivKey -> EMEName -> IO Decrypt
decryptCreate PrivKey
sk EMEName
padding =  PrivKey -> (BotanPrivKey -> IO Decrypt) -> IO Decrypt
forall a. PrivKey -> (BotanPrivKey -> IO a) -> IO a
withPrivKey PrivKey
sk ((BotanPrivKey -> IO Decrypt) -> IO Decrypt)
-> (BotanPrivKey -> IO Decrypt) -> IO Decrypt
forall a b. (a -> b) -> a -> b
$ \ BotanPrivKey
skPtr -> do
    EMEName -> (Ptr CChar -> IO Decrypt) -> IO Decrypt
forall a. EMEName -> (Ptr CChar -> IO a) -> IO a
asCString EMEName
padding ((Ptr CChar -> IO Decrypt) -> IO Decrypt)
-> (Ptr CChar -> IO Decrypt) -> IO Decrypt
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
paddingPtr -> do
        (Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt
createDecrypt ((Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt)
-> (Ptr BotanPKOpDecrypt -> IO CInt) -> IO Decrypt
forall a b. (a -> b) -> a -> b
$ \ Ptr BotanPKOpDecrypt
out -> Ptr BotanPKOpDecrypt
-> BotanPrivKey -> Ptr CChar -> Word32 -> IO CInt
botan_pk_op_decrypt_create
            Ptr BotanPKOpDecrypt
out
            BotanPrivKey
skPtr
            Ptr CChar
paddingPtr
            Word32
forall a. (Eq a, Num a) => a
BOTAN_PUBKEY_DECRYPT_FLAGS_NONE

-- WARNING: withFooInit-style limited lifetime functions moved to high-level botan
withDecryptCreate :: PrivKey -> EMEName -> (Decrypt -> IO a) -> IO a
withDecryptCreate :: forall a. PrivKey -> EMEName -> (Decrypt -> IO a) -> IO a
withDecryptCreate = (PrivKey -> EMEName -> IO Decrypt)
-> (Decrypt -> IO ())
-> PrivKey
-> EMEName
-> (Decrypt -> IO a)
-> IO a
forall x y t a.
(x -> y -> IO t) -> (t -> IO ()) -> x -> y -> (t -> IO a) -> IO a
mkWithTemp2 PrivKey -> EMEName -> IO Decrypt
decryptCreate Decrypt -> IO ()
decryptDestroy

decryptOutputLength
    :: Decrypt  -- ^ __op__
    -> Int      -- ^ __ctext_len__
    -> IO Int   -- ^ __ptext_len__
decryptOutputLength :: Decrypt -> Int -> IO Int
decryptOutputLength = WithPtr Decrypt BotanPKOpDecrypt
-> GetSize_csize BotanPKOpDecrypt -> Decrypt -> Int -> IO Int
forall typ ptr.
WithPtr typ ptr -> GetSize_csize ptr -> typ -> Int -> IO Int
mkGetSize_csize Decrypt -> (BotanPKOpDecrypt -> IO a) -> IO a
WithPtr Decrypt BotanPKOpDecrypt
withDecrypt GetSize_csize BotanPKOpDecrypt
botan_pk_op_decrypt_output_length

decrypt
    :: Decrypt          -- ^ __op__
    -> ByteString       -- ^ __ciphertext__
    -> IO ByteString    -- ^ __plaintext__
decrypt :: Decrypt -> EMEName -> IO EMEName
decrypt Decrypt
dec EMEName
ctext = Decrypt -> (BotanPKOpDecrypt -> IO EMEName) -> IO EMEName
WithPtr Decrypt BotanPKOpDecrypt
withDecrypt Decrypt
dec ((BotanPKOpDecrypt -> IO EMEName) -> IO EMEName)
-> (BotanPKOpDecrypt -> IO EMEName) -> IO EMEName
forall a b. (a -> b) -> a -> b
$ \ BotanPKOpDecrypt
decPtr -> do
    EMEName -> (Ptr Word8 -> CSize -> IO EMEName) -> IO EMEName
forall byte a. EMEName -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen EMEName
ctext ((Ptr Word8 -> CSize -> IO EMEName) -> IO EMEName)
-> (Ptr Word8 -> CSize -> IO EMEName) -> IO EMEName
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
ctextPtr CSize
ctextLen -> do
        (Ptr Word8 -> Ptr CSize -> IO CInt) -> IO EMEName
forall byte. (Ptr byte -> Ptr CSize -> IO CInt) -> IO EMEName
allocBytesQuerying ((Ptr Word8 -> Ptr CSize -> IO CInt) -> IO EMEName)
-> (Ptr Word8 -> Ptr CSize -> IO CInt) -> IO EMEName
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr Ptr CSize
szPtr -> BotanPKOpDecrypt
-> Ptr Word8 -> Ptr CSize -> ConstPtr Word8 -> CSize -> IO CInt
botan_pk_op_decrypt
            BotanPKOpDecrypt
decPtr
            Ptr Word8
outPtr
            Ptr CSize
szPtr
            (Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
ctextPtr)
            CSize
ctextLen