module Botan.Low.MAC
(
MAC(..)
, MACName(..)
, MACKey(..)
, MACNonce(..)
, MACDigest(..)
, withMAC
, macInit
, macDestroy
, macName
, macOutputLength
, macGetKeyspec
, macSetKey
, macSetNonce
, macUpdate
, macFinal
, macClear
, pattern CMAC
, cmac
, pattern GMAC
, gmac
, pattern HMAC
, hmac
, pattern Poly1305
, pattern SipHash
, sipHash
, pattern X9_19_MAC
) where
import qualified Data.ByteString as ByteString
import Botan.Bindings.MAC
import Botan.Low.BlockCipher
import Botan.Low.Error
import Botan.Low.Hash
import Botan.Low.Make
import Botan.Low.Prelude
import Botan.Low.Remake
newtype MAC = MkMAC { MAC -> ForeignPtr BotanMACStruct
getMACForeignPtr :: ForeignPtr BotanMACStruct }
newMAC :: BotanMAC -> IO MAC
withMAC :: MAC -> (BotanMAC -> IO a) -> IO a
macDestroy :: MAC -> IO ()
createMAC :: (Ptr BotanMAC -> IO CInt) -> IO MAC
(BotanMAC -> IO MAC
newMAC, MAC -> (BotanMAC -> IO a) -> IO a
withMAC, MAC -> IO ()
macDestroy, (Ptr BotanMAC -> IO CInt) -> IO MAC
createMAC, (Ptr BotanMAC -> Ptr CSize -> IO CInt) -> IO [MAC]
_)
= (Ptr BotanMACStruct -> BotanMAC)
-> (BotanMAC -> Ptr BotanMACStruct)
-> (ForeignPtr BotanMACStruct -> MAC)
-> (MAC -> ForeignPtr BotanMACStruct)
-> FinalizerPtr BotanMACStruct
-> (BotanMAC -> IO MAC, MAC -> (BotanMAC -> IO a) -> IO a,
MAC -> IO (), (Ptr BotanMAC -> IO CInt) -> IO MAC,
(Ptr BotanMAC -> Ptr CSize -> IO CInt) -> IO [MAC])
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 BotanMACStruct -> BotanMAC
MkBotanMAC BotanMAC -> Ptr BotanMACStruct
runBotanMAC
ForeignPtr BotanMACStruct -> MAC
MkMAC MAC -> ForeignPtr BotanMACStruct
getMACForeignPtr
FinalizerPtr BotanMACStruct
botan_mac_destroy
type MACName = ByteString
pattern CMAC
, GMAC
, HMAC
, Poly1305
, SipHash
, X9_19_MAC
:: MACName
pattern $mCMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bCMAC :: MACName
CMAC = BOTAN_MAC_CMAC
pattern $mGMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bGMAC :: MACName
GMAC = BOTAN_MAC_GMAC
pattern $mHMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bHMAC :: MACName
HMAC = BOTAN_MAC_HMAC
pattern $mPoly1305 :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bPoly1305 :: MACName
Poly1305 = BOTAN_MAC_Poly1305
pattern $mSipHash :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bSipHash :: MACName
SipHash = BOTAN_MAC_SipHash
pattern $mX9_19_MAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
$bX9_19_MAC :: MACName
X9_19_MAC = BOTAN_MAC_X9_19_MAC
cmac :: BlockCipherName -> MACName
cmac :: MACName -> MACName
cmac MACName
bc = MACName
CMAC MACName -> MACName -> MACName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ MACName
bc
gmac :: BlockCipherName -> MACName
gmac :: MACName -> MACName
gmac MACName
bc = MACName
GMAC MACName -> MACName -> MACName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ MACName
bc
hmac :: BlockCipherName -> MACName
hmac :: MACName -> MACName
hmac MACName
h = MACName
HMAC MACName -> MACName -> MACName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ MACName
h
sipHash :: Int -> Int -> MACName
sipHash :: Int -> Int -> MACName
sipHash Int
ir Int
fr = MACName
SipHash MACName -> MACName -> MACName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ Int -> MACName
forall a. Show a => a -> MACName
showBytes Int
ir MACName -> MACName -> MACName
forall a. Semigroup a => a -> a -> a
<> MACName
"," MACName -> MACName -> MACName
forall a. Semigroup a => a -> a -> a
<> Int -> MACName
forall a. Show a => a -> MACName
showBytes Int
fr
type MACKey = ByteString
type MACNonce = ByteString
type MACDigest = ByteString
macInit
:: MACName
-> IO MAC
macInit :: MACName -> IO MAC
macInit = ((Ptr BotanMAC -> IO CInt) -> IO MAC)
-> (Ptr BotanMAC -> ConstPtr CChar -> IO CInt) -> MACName -> IO MAC
forall botan object.
((Ptr botan -> IO CInt) -> IO object)
-> (Ptr botan -> ConstPtr CChar -> IO CInt) -> MACName -> IO object
mkCreateObjectCString (Ptr BotanMAC -> IO CInt) -> IO MAC
createMAC (\ Ptr BotanMAC
out ConstPtr CChar
name -> Ptr BotanMAC -> ConstPtr CChar -> Word32 -> IO CInt
botan_mac_init Ptr BotanMAC
out ConstPtr CChar
name Word32
0)
withMACInit :: MACName -> (MAC -> IO a) -> IO a
withMACInit :: forall a. MACName -> (MAC -> IO a) -> IO a
withMACInit = (MACName -> IO MAC)
-> (MAC -> IO ()) -> MACName -> (MAC -> IO a) -> IO a
forall x t a.
(x -> IO t) -> (t -> IO ()) -> x -> (t -> IO a) -> IO a
mkWithTemp1 MACName -> IO MAC
macInit MAC -> IO ()
macDestroy
macOutputLength
:: MAC
-> IO Int
macOutputLength :: MAC -> IO Int
macOutputLength = WithPtr MAC BotanMAC -> GetSize BotanMAC -> MAC -> IO Int
forall typ ptr. WithPtr typ ptr -> GetSize ptr -> typ -> IO Int
mkGetSize MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC GetSize BotanMAC
botan_mac_output_length
macSetKey
:: MAC
-> ByteString
-> IO ()
macSetKey :: MAC -> MACName -> IO ()
macSetKey = WithPtr MAC BotanMAC
-> (BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt)
-> MAC
-> MACName
-> IO ()
forall object botan.
(forall a. object -> (botan -> IO a) -> IO a)
-> (botan -> ConstPtr Word8 -> CSize -> IO CInt)
-> object
-> MACName
-> IO ()
mkWithObjectSetterCBytesLen MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt
botan_mac_set_key
macSetNonce
:: MAC
-> ByteString
-> IO ()
macSetNonce :: MAC -> MACName -> IO ()
macSetNonce = WithPtr MAC BotanMAC
-> (BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt)
-> MAC
-> MACName
-> IO ()
forall object botan.
(forall a. object -> (botan -> IO a) -> IO a)
-> (botan -> ConstPtr Word8 -> CSize -> IO CInt)
-> object
-> MACName
-> IO ()
mkWithObjectSetterCBytesLen MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt
botan_mac_set_nonce
macUpdate
:: MAC
-> ByteString
-> IO ()
macUpdate :: MAC -> MACName -> IO ()
macUpdate = WithPtr MAC BotanMAC
-> (BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt)
-> MAC
-> MACName
-> IO ()
forall object botan.
(forall a. object -> (botan -> IO a) -> IO a)
-> (botan -> ConstPtr Word8 -> CSize -> IO CInt)
-> object
-> MACName
-> IO ()
mkWithObjectSetterCBytesLen MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC BotanMAC -> ConstPtr Word8 -> CSize -> IO CInt
botan_mac_update
macFinal
:: MAC
-> IO MACDigest
macFinal :: MAC -> IO MACName
macFinal MAC
mac = MAC -> (BotanMAC -> IO MACName) -> IO MACName
WithPtr MAC BotanMAC
withMAC MAC
mac ((BotanMAC -> IO MACName) -> IO MACName)
-> (BotanMAC -> IO MACName) -> IO MACName
forall a b. (a -> b) -> a -> b
$ \ BotanMAC
macPtr -> do
Int
sz <- MAC -> IO Int
macOutputLength MAC
mac
Int -> (Ptr Word8 -> IO ()) -> IO MACName
forall byte. Int -> (Ptr byte -> IO ()) -> IO MACName
allocBytes Int
sz ((Ptr Word8 -> IO ()) -> IO MACName)
-> (Ptr Word8 -> IO ()) -> IO MACName
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
bytesPtr -> do
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ BotanMAC -> Ptr Word8 -> IO CInt
botan_mac_final BotanMAC
macPtr Ptr Word8
bytesPtr
macClear
:: MAC
-> IO ()
macClear :: MAC -> IO ()
macClear = WithPtr MAC BotanMAC -> Action BotanMAC -> MAC -> IO ()
forall typ ptr. WithPtr typ ptr -> Action ptr -> typ -> IO ()
mkAction MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC Action BotanMAC
botan_mac_clear
macName
:: MAC
-> IO ByteString
macName :: MAC -> IO MACName
macName = WithPtr MAC BotanMAC
-> GetCString BotanMAC CChar -> MAC -> IO MACName
forall typ ptr byte.
WithPtr typ ptr -> GetCString ptr byte -> typ -> IO MACName
mkGetCString MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC GetCString BotanMAC CChar
botan_mac_name
macGetKeyspec
:: MAC
-> IO (Int,Int,Int)
macGetKeyspec :: MAC -> IO (Int, Int, Int)
macGetKeyspec = WithPtr MAC BotanMAC
-> GetSizes3 BotanMAC -> MAC -> IO (Int, Int, Int)
forall typ ptr.
WithPtr typ ptr -> GetSizes3 ptr -> typ -> IO (Int, Int, Int)
mkGetSizes3 MAC -> (BotanMAC -> IO a) -> IO a
WithPtr MAC BotanMAC
withMAC GetSizes3 BotanMAC
botan_mac_get_keyspec