{-# LANGUAGE OverloadedStrings #-}
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 Botan.Bindings.MAC
import Botan.Low.BlockCipher
import Botan.Low.Error.Internal
import Botan.Low.Internal.ByteString
import Botan.Low.Internal.String
import Botan.Low.Make
import Botan.Low.Remake
import Data.ByteString (ByteString)
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr
newtype MAC = MkMAC { MAC -> ForeignPtr BotanMACStruct
foreignPtr :: ForeignPtr BotanMACStruct }
withMAC :: MAC -> (BotanMAC -> IO a) -> IO a
macDestroy :: MAC -> IO ()
createMAC :: (Ptr BotanMAC -> IO CInt) -> IO MAC
(MAC -> (BotanMAC -> IO a) -> IO a
withMAC, MAC -> IO ()
macDestroy, (Ptr BotanMAC -> IO CInt) -> IO MAC
createMAC)
= (Ptr BotanMACStruct -> BotanMAC)
-> (BotanMAC -> Ptr BotanMACStruct)
-> (ForeignPtr BotanMACStruct -> MAC)
-> (MAC -> ForeignPtr BotanMACStruct)
-> FinalizerPtr BotanMACStruct
-> (MAC -> (BotanMAC -> IO a) -> IO a, MAC -> IO (),
(Ptr BotanMAC -> 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
-> (object -> (botan -> IO a) -> IO a, object -> IO (),
(Ptr botan -> IO CInt) -> IO object)
mkBindings
Ptr BotanMACStruct -> BotanMAC
MkBotanMAC (.ptr)
ForeignPtr BotanMACStruct -> MAC
MkMAC (.foreignPtr)
FinalizerPtr BotanMACStruct
botan_mac_destroy
type MACName = ByteString
pattern CMAC
, GMAC
, HMAC
, Poly1305
, SipHash
, X9_19_MAC
:: MACName
pattern $bCMAC :: MACName
$mCMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
CMAC = BOTAN_MAC_CMAC
pattern $bGMAC :: MACName
$mGMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
GMAC = BOTAN_MAC_GMAC
pattern $bHMAC :: MACName
$mHMAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
HMAC = BOTAN_MAC_HMAC
pattern $bPoly1305 :: MACName
$mPoly1305 :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
Poly1305 = BOTAN_MAC_Poly1305
pattern $bSipHash :: MACName
$mSipHash :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
SipHash = BOTAN_MAC_SipHash
pattern $bX9_19_MAC :: MACName
$mX9_19_MAC :: forall {r}. MACName -> ((# #) -> r) -> ((# #) -> r) -> r
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)
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