module Z.Crypto.FPE ( FPE, newFPE, encryptFPE, decryptFPE ) where
import GHC.Generics
import Z.Botan.FFI
import Z.Botan.Exception
import Z.Crypto.MPI
import qualified Z.Data.Vector as V
import qualified Z.Data.Text as T
import Z.Foreign
newtype FPE = FPE BotanStruct
deriving (Int -> FPE -> ShowS
[FPE] -> ShowS
FPE -> String
(Int -> FPE -> ShowS)
-> (FPE -> String) -> ([FPE] -> ShowS) -> Show FPE
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FPE] -> ShowS
$cshowList :: [FPE] -> ShowS
show :: FPE -> String
$cshow :: FPE -> String
showsPrec :: Int -> FPE -> ShowS
$cshowsPrec :: Int -> FPE -> ShowS
Show, (forall x. FPE -> Rep FPE x)
-> (forall x. Rep FPE x -> FPE) -> Generic FPE
forall x. Rep FPE x -> FPE
forall x. FPE -> Rep FPE x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep FPE x -> FPE
$cfrom :: forall x. FPE -> Rep FPE x
Generic)
deriving anyclass Int -> FPE -> Builder ()
(Int -> FPE -> Builder ()) -> Print FPE
forall a. (Int -> a -> Builder ()) -> Print a
toUTF8BuilderP :: Int -> FPE -> Builder ()
$ctoUTF8BuilderP :: Int -> FPE -> Builder ()
T.Print
newFPE :: HasCallStack
=> MPI
-> V.Bytes
-> IO FPE
{-# INLINABLE newFPE #-}
newFPE :: MPI -> Bytes -> IO FPE
newFPE MPI
mpi Bytes
key =
MPI -> (BotanStructT -> IO FPE) -> IO FPE
forall a. MPI -> (BotanStructT -> IO a) -> IO a
withMPI MPI
mpi ((BotanStructT -> IO FPE) -> IO FPE)
-> (BotanStructT -> IO FPE) -> IO FPE
forall a b. (a -> b) -> a -> b
$ \ BotanStructT
mpi' ->
Bytes -> (BA# Word8 -> Int -> Int -> IO FPE) -> IO FPE
forall a b.
Prim a =>
PrimVector a -> (BA# Word8 -> Int -> Int -> IO b) -> IO b
withPrimVectorUnsafe Bytes
key ((BA# Word8 -> Int -> Int -> IO FPE) -> IO FPE)
-> (BA# Word8 -> Int -> Int -> IO FPE) -> IO FPE
forall a b. (a -> b) -> a -> b
$ \ BA# Word8
key' Int
keyOff Int
keyLen ->
BotanStruct -> FPE
FPE (BotanStruct -> FPE) -> IO BotanStruct -> IO FPE
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MBA# BotanStructT -> IO CInt)
-> FunPtr (BotanStructT -> IO ()) -> IO BotanStruct
forall a.
HasCallStack =>
(MBA# BotanStructT -> IO CInt)
-> FunPtr (BotanStructT -> IO a) -> IO BotanStruct
newBotanStruct (\ MBA# BotanStructT
fpe ->
MBA# BotanStructT
-> BotanStructT
-> BA# Word8
-> Int
-> Int
-> Int
-> Word32
-> IO CInt
hs_botan_fpe_fe1_init MBA# BotanStructT
fpe BotanStructT
mpi' BA# Word8
key' Int
keyOff Int
keyLen Int
3 Word32
1)
FunPtr (BotanStructT -> IO ())
botan_fpe_destroy
encryptFPE :: HasCallStack
=>FPE
-> MPI
-> V.Bytes
-> IO MPI
{-# INLINABLE encryptFPE #-}
encryptFPE :: FPE -> MPI -> Bytes -> IO MPI
encryptFPE (FPE BotanStruct
fpe) MPI
mpi Bytes
tweak = do
MPI
mpi' <- MPI -> IO MPI
copyMPI MPI
mpi
BotanStruct -> (BotanStructT -> IO ()) -> IO ()
forall a. BotanStruct -> (BotanStructT -> IO a) -> IO a
withBotanStruct BotanStruct
fpe ((BotanStructT -> IO ()) -> IO ())
-> (BotanStructT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BotanStructT
fpe' ->
MPI -> (BotanStructT -> IO ()) -> IO ()
forall a. MPI -> (BotanStructT -> IO a) -> IO a
withMPI MPI
mpi' ((BotanStructT -> IO ()) -> IO ())
-> (BotanStructT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BotanStructT
mpi'' ->
Bytes -> (BA# Word8 -> Int -> Int -> IO ()) -> IO ()
forall a b.
Prim a =>
PrimVector a -> (BA# Word8 -> Int -> Int -> IO b) -> IO b
withPrimVectorUnsafe Bytes
tweak ((BA# Word8 -> Int -> Int -> IO ()) -> IO ())
-> (BA# Word8 -> Int -> Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BA# Word8
t Int
toff Int
tlen ->
IO CInt -> IO ()
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwBotanIfMinus_ (BotanStructT -> BotanStructT -> BA# Word8 -> Int -> Int -> IO CInt
hs_botan_fpe_encrypt BotanStructT
fpe' BotanStructT
mpi'' BA# Word8
t Int
toff Int
tlen)
MPI -> IO MPI
forall (m :: * -> *) a. Monad m => a -> m a
return MPI
mpi'
decryptFPE :: HasCallStack
=> FPE
-> MPI
-> V.Bytes
-> IO MPI
{-# INLINABLE decryptFPE #-}
decryptFPE :: FPE -> MPI -> Bytes -> IO MPI
decryptFPE (FPE BotanStruct
fpe) MPI
mpi Bytes
tweak = do
MPI
mpi' <- MPI -> IO MPI
copyMPI MPI
mpi
BotanStruct -> (BotanStructT -> IO ()) -> IO ()
forall a. BotanStruct -> (BotanStructT -> IO a) -> IO a
withBotanStruct BotanStruct
fpe ((BotanStructT -> IO ()) -> IO ())
-> (BotanStructT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BotanStructT
fpe' ->
MPI -> (BotanStructT -> IO ()) -> IO ()
forall a. MPI -> (BotanStructT -> IO a) -> IO a
withMPI MPI
mpi' ((BotanStructT -> IO ()) -> IO ())
-> (BotanStructT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BotanStructT
mpi'' ->
Bytes -> (BA# Word8 -> Int -> Int -> IO ()) -> IO ()
forall a b.
Prim a =>
PrimVector a -> (BA# Word8 -> Int -> Int -> IO b) -> IO b
withPrimVectorUnsafe Bytes
tweak ((BA# Word8 -> Int -> Int -> IO ()) -> IO ())
-> (BA# Word8 -> Int -> Int -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ BA# Word8
t Int
toff Int
tlen ->
IO CInt -> IO ()
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwBotanIfMinus_ (BotanStructT -> BotanStructT -> BA# Word8 -> Int -> Int -> IO CInt
hs_botan_fpe_decrypt BotanStructT
fpe' BotanStructT
mpi'' BA# Word8
t Int
toff Int
tlen)
MPI -> IO MPI
forall (m :: * -> *) a. Monad m => a -> m a
return MPI
mpi'