{-# LINE 1 "src/Botan/Bindings/PubKey/Sign.hsc" #-}
{-|
Module      : Botan.Bindings.Sign
Description : Signature Generation
Copyright   : (c) Leo D, 2023
License     : BSD-3-Clause
Maintainer  : leo@apotheca.io
Stability   : experimental
Portability : POSIX
-}

{-# LANGUAGE CApiFFI #-}

module Botan.Bindings.PubKey.Sign where

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



-- | Opaque sign struct
data {-# CTYPE "botan/ffi.h" "struct botan_pk_op_sign_struct" #-} BotanPKOpSignStruct

-- | Botan sign object
newtype {-# CTYPE "botan/ffi.h" "botan_pk_op_sign_t" #-} BotanPKOpSign
    = MkBotanPKOpSign { BotanPKOpSign -> Ptr BotanPKOpSignStruct
runBotanPKOpSign :: Ptr BotanPKOpSignStruct }
        deriving newtype (BotanPKOpSign -> BotanPKOpSign -> Bool
(BotanPKOpSign -> BotanPKOpSign -> Bool)
-> (BotanPKOpSign -> BotanPKOpSign -> Bool) -> Eq BotanPKOpSign
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BotanPKOpSign -> BotanPKOpSign -> Bool
== :: BotanPKOpSign -> BotanPKOpSign -> Bool
$c/= :: BotanPKOpSign -> BotanPKOpSign -> Bool
/= :: BotanPKOpSign -> BotanPKOpSign -> Bool
Eq, Eq BotanPKOpSign
Eq BotanPKOpSign
-> (BotanPKOpSign -> BotanPKOpSign -> Ordering)
-> (BotanPKOpSign -> BotanPKOpSign -> Bool)
-> (BotanPKOpSign -> BotanPKOpSign -> Bool)
-> (BotanPKOpSign -> BotanPKOpSign -> Bool)
-> (BotanPKOpSign -> BotanPKOpSign -> Bool)
-> (BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign)
-> (BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign)
-> Ord BotanPKOpSign
BotanPKOpSign -> BotanPKOpSign -> Bool
BotanPKOpSign -> BotanPKOpSign -> Ordering
BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign
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 :: BotanPKOpSign -> BotanPKOpSign -> Ordering
compare :: BotanPKOpSign -> BotanPKOpSign -> Ordering
$c< :: BotanPKOpSign -> BotanPKOpSign -> Bool
< :: BotanPKOpSign -> BotanPKOpSign -> Bool
$c<= :: BotanPKOpSign -> BotanPKOpSign -> Bool
<= :: BotanPKOpSign -> BotanPKOpSign -> Bool
$c> :: BotanPKOpSign -> BotanPKOpSign -> Bool
> :: BotanPKOpSign -> BotanPKOpSign -> Bool
$c>= :: BotanPKOpSign -> BotanPKOpSign -> Bool
>= :: BotanPKOpSign -> BotanPKOpSign -> Bool
$cmax :: BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign
max :: BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign
$cmin :: BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign
min :: BotanPKOpSign -> BotanPKOpSign -> BotanPKOpSign
Ord, Ptr BotanPKOpSign -> IO BotanPKOpSign
Ptr BotanPKOpSign -> Int -> IO BotanPKOpSign
Ptr BotanPKOpSign -> Int -> BotanPKOpSign -> IO ()
Ptr BotanPKOpSign -> BotanPKOpSign -> IO ()
BotanPKOpSign -> Int
(BotanPKOpSign -> Int)
-> (BotanPKOpSign -> Int)
-> (Ptr BotanPKOpSign -> Int -> IO BotanPKOpSign)
-> (Ptr BotanPKOpSign -> Int -> BotanPKOpSign -> IO ())
-> (forall b. Ptr b -> Int -> IO BotanPKOpSign)
-> (forall b. Ptr b -> Int -> BotanPKOpSign -> IO ())
-> (Ptr BotanPKOpSign -> IO BotanPKOpSign)
-> (Ptr BotanPKOpSign -> BotanPKOpSign -> IO ())
-> Storable BotanPKOpSign
forall b. Ptr b -> Int -> IO BotanPKOpSign
forall b. Ptr b -> Int -> BotanPKOpSign -> 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 :: BotanPKOpSign -> Int
sizeOf :: BotanPKOpSign -> Int
$calignment :: BotanPKOpSign -> Int
alignment :: BotanPKOpSign -> Int
$cpeekElemOff :: Ptr BotanPKOpSign -> Int -> IO BotanPKOpSign
peekElemOff :: Ptr BotanPKOpSign -> Int -> IO BotanPKOpSign
$cpokeElemOff :: Ptr BotanPKOpSign -> Int -> BotanPKOpSign -> IO ()
pokeElemOff :: Ptr BotanPKOpSign -> Int -> BotanPKOpSign -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpSign
peekByteOff :: forall b. Ptr b -> Int -> IO BotanPKOpSign
$cpokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpSign -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> BotanPKOpSign -> IO ()
$cpeek :: Ptr BotanPKOpSign -> IO BotanPKOpSign
peek :: Ptr BotanPKOpSign -> IO BotanPKOpSign
$cpoke :: Ptr BotanPKOpSign -> BotanPKOpSign -> IO ()
poke :: Ptr BotanPKOpSign -> BotanPKOpSign -> IO ()
Storable)

-- | Destroy a sign object
foreign import capi safe "botan/ffi.h &botan_pk_op_sign_destroy"
    botan_pk_op_sign_destroy
        :: FinalizerPtr BotanPKOpSignStruct

-- NOTE: These are separate flags from BOTAN_PRIVKEY_EXPORT_FLAG_DER and BOTAN_PRIVKEY_EXPORT_FLAG_PEM
-- The correct default flag would be BOTAN_PUBKEY_STD_FORMAT_SIGNATURE, and is not necessarily
-- indicative of PEM encoding
pattern BOTAN_PUBKEY_STD_FORMAT_SIGNATURE   -- ^ Not an actual flag
    ,   BOTAN_PUBKEY_DER_FORMAT_SIGNATURE
    ::  (Eq a, Num a) => a
pattern $mBOTAN_PUBKEY_STD_FORMAT_SIGNATURE :: forall {r} {a}.
(Eq a, Num a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bBOTAN_PUBKEY_STD_FORMAT_SIGNATURE :: forall a. (Eq a, Num a) => a
BOTAN_PUBKEY_STD_FORMAT_SIGNATURE = 0
pattern $mBOTAN_PUBKEY_DER_FORMAT_SIGNATURE :: forall {r} {a}.
(Eq a, Num a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bBOTAN_PUBKEY_DER_FORMAT_SIGNATURE :: forall a. (Eq a, Num a) => a
BOTAN_PUBKEY_DER_FORMAT_SIGNATURE = 1
{-# LINE 42 "src/Botan/Bindings/PubKey/Sign.hsc" #-}

foreign import capi safe "botan/ffi.h botan_pk_op_sign_create"
    botan_pk_op_sign_create
        :: Ptr BotanPKOpSign      -- ^ __op__
        -> BotanPrivKey           -- ^ __key__
        -> ConstPtr CChar         -- ^ __hash_and_padding__
        -> Word32                 -- ^ __flags__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_sign_output_length"
    botan_pk_op_sign_output_length
        :: BotanPKOpSign      -- ^ __op__
        -> Ptr CSize          -- ^ __olen__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_sign_update"
    botan_pk_op_sign_update
        :: BotanPKOpSign      -- ^ __op__
        -> ConstPtr Word8     -- ^ __in[]__
        -> CSize              -- ^ __in_len__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pk_op_sign_finish"
    botan_pk_op_sign_finish
        :: BotanPKOpSign      -- ^ __op__
        -> BotanRNG           -- ^ __rng__
        -> Ptr Word8          -- ^ __sig[]__
        -> Ptr CSize          -- ^ __sig_len__
        -> IO CInt