packages feed

botan-bindings-0.2.0.0: src/Botan/Bindings/PubKey/Sign.hsc

{-|
Module      : Botan.Bindings.Sign
Description : Signature Generation
Copyright   : (c) 2023-2024, Apotheca Labs
              (c) 2024-2025, Haskell Foundation
License     : BSD-3-Clause
Maintainer  : joris@well-typed.com, leo@apotheca.io
Stability   : experimental
Portability : POSIX
-}

{-# LANGUAGE CApiFFI #-}

module Botan.Bindings.PubKey.Sign (
    BotanPKOpSignStruct
  , BotanPKOpSign (..)
  , botan_pk_op_sign_destroy
  , pattern BOTAN_PUBKEY_STD_FORMAT_SIGNATURE
  , pattern BOTAN_PUBKEY_DER_FORMAT_SIGNATURE
  , botan_pk_op_sign_create
  , botan_pk_op_sign_output_length
  , botan_pk_op_sign_update
  , botan_pk_op_sign_finish
  ) where

import Botan.Bindings.ConstPtr
import Botan.Bindings.PubKey
import Botan.Bindings.RNG
import Data.Word
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr
import Foreign.Storable

#include <botan/ffi.h>

-- | 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 { runBotanPKOpSign :: Ptr BotanPKOpSignStruct }
        deriving newtype (Eq, Ord, 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 BOTAN_PUBKEY_STD_FORMAT_SIGNATURE = 0
pattern BOTAN_PUBKEY_DER_FORMAT_SIGNATURE = #const BOTAN_PUBKEY_DER_FORMAT_SIGNATURE

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