module Botan.Low.PwdHash (
pwdhash
, pwdhashTimed
, PBKDFName
, pattern PBKDF2
, pbkdf2
, pattern Scrypt
, pattern Argon2d
, pattern Argon2i
, pattern Argon2id
, pattern Bcrypt_PBKDF
, pattern OpenPGP_S2K
, openPGP_S2K
) where
import Botan.Bindings.ConstPtr (ConstPtr (..))
import Botan.Bindings.PwdHash
import Botan.Low.Error.Internal
import Botan.Low.Hash
import Botan.Low.Internal.ByteString
import Botan.Low.Internal.String
import Data.ByteString (ByteString)
import Foreign.Marshal.Alloc
import Foreign.Storable
pwdhash ::
PBKDFName
-> Int
-> Int
-> Int
-> Int
-> ByteString
-> ByteString
-> IO ByteString
pwdhash :: PBKDFName
-> Int
-> Int
-> Int
-> Int
-> PBKDFName
-> PBKDFName
-> IO PBKDFName
pwdhash PBKDFName
algo Int
p1 Int
p2 Int
p3 Int
outLen PBKDFName
passphrase PBKDFName
salt =
Int -> (Ptr Word8 -> IO ()) -> IO PBKDFName
forall byte. Int -> (Ptr byte -> IO ()) -> IO PBKDFName
allocBytes Int
outLen ((Ptr Word8 -> IO ()) -> IO PBKDFName)
-> (Ptr Word8 -> IO ()) -> IO PBKDFName
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr ->
PBKDFName -> (Ptr CChar -> IO ()) -> IO ()
forall a. PBKDFName -> (Ptr CChar -> IO a) -> IO a
asCString PBKDFName
algo ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
algoPtr ->
PBKDFName -> (Ptr CChar -> CSize -> IO ()) -> IO ()
forall a. PBKDFName -> (Ptr CChar -> CSize -> IO a) -> IO a
asCStringLen PBKDFName
passphrase ((Ptr CChar -> CSize -> IO ()) -> IO ())
-> (Ptr CChar -> CSize -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
passphrasePtr CSize
passphraseLen ->
PBKDFName -> (Ptr Word8 -> CSize -> IO ()) -> IO ()
forall byte a. PBKDFName -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen PBKDFName
salt ((Ptr Word8 -> CSize -> IO ()) -> IO ())
-> (Ptr Word8 -> CSize -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
saltPtr CSize
saltLen ->
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ ConstPtr CChar
-> CSize
-> CSize
-> CSize
-> Ptr Word8
-> CSize
-> ConstPtr CChar
-> CSize
-> ConstPtr Word8
-> CSize
-> IO CInt
botan_pwdhash
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
algoPtr)
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
p1)
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
p2)
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
p3)
Ptr Word8
outPtr
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
outLen)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
passphrasePtr)
CSize
passphraseLen
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
saltPtr)
CSize
saltLen
pwdhashTimed ::
PBKDFName
-> Int
-> Int
-> ByteString
-> ByteString
-> IO (Int, Int, Int, ByteString)
pwdhashTimed :: PBKDFName
-> Int
-> Int
-> PBKDFName
-> PBKDFName
-> IO (Int, Int, Int, PBKDFName)
pwdhashTimed PBKDFName
algo Int
msec Int
outLen PBKDFName
passphrase PBKDFName
salt =
(Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName))
-> (Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. (a -> b) -> a -> b
$ \ Ptr CSize
p1Ptr ->
(Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName))
-> (Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. (a -> b) -> a -> b
$ \ Ptr CSize
p2Ptr ->
(Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName))
-> (Ptr CSize -> IO (Int, Int, Int, PBKDFName))
-> IO (Int, Int, Int, PBKDFName)
forall a b. (a -> b) -> a -> b
$ \ Ptr CSize
p3Ptr -> do
PBKDFName
out <- Int -> (Ptr Word8 -> IO ()) -> IO PBKDFName
forall byte. Int -> (Ptr byte -> IO ()) -> IO PBKDFName
allocBytes Int
outLen ((Ptr Word8 -> IO ()) -> IO PBKDFName)
-> (Ptr Word8 -> IO ()) -> IO PBKDFName
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr ->
PBKDFName -> (Ptr CChar -> IO ()) -> IO ()
forall a. PBKDFName -> (Ptr CChar -> IO a) -> IO a
asCString PBKDFName
algo ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
algoPtr ->
PBKDFName -> (Ptr CChar -> CSize -> IO ()) -> IO ()
forall a. PBKDFName -> (Ptr CChar -> CSize -> IO a) -> IO a
asCStringLen PBKDFName
passphrase ((Ptr CChar -> CSize -> IO ()) -> IO ())
-> (Ptr CChar -> CSize -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
passphrasePtr CSize
passphraseLen ->
PBKDFName -> (Ptr Word8 -> CSize -> IO ()) -> IO ()
forall byte a. PBKDFName -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen PBKDFName
salt ((Ptr Word8 -> CSize -> IO ()) -> IO ())
-> (Ptr Word8 -> CSize -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
saltPtr CSize
saltLen -> do
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ ConstPtr CChar
-> Word32
-> Ptr CSize
-> Ptr CSize
-> Ptr CSize
-> Ptr Word8
-> CSize
-> ConstPtr CChar
-> CSize
-> ConstPtr Word8
-> CSize
-> IO CInt
botan_pwdhash_timed
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
algoPtr)
(Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
msec)
Ptr CSize
p1Ptr
Ptr CSize
p2Ptr
Ptr CSize
p3Ptr
Ptr Word8
outPtr
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
outLen)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
passphrasePtr)
CSize
passphraseLen
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
saltPtr)
CSize
saltLen
Int
p1 <- CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CSize -> Int) -> IO CSize -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
p1Ptr
Int
p2 <- CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CSize -> Int) -> IO CSize -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
p2Ptr
Int
p3 <- CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CSize -> Int) -> IO CSize -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
p3Ptr
(Int, Int, Int, PBKDFName) -> IO (Int, Int, Int, PBKDFName)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
p1, Int
p2, Int
p3, PBKDFName
out)
type PBKDFName = ByteString
pattern PBKDF2
, Scrypt
, Argon2d
, Argon2i
, Argon2id
, Bcrypt_PBKDF
, OpenPGP_S2K
:: PBKDFName
pattern $bPBKDF2 :: PBKDFName
$mPBKDF2 :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
PBKDF2 = BOTAN_PBKDF_PBKDF2
pbkdf2 :: HashName -> PBKDFName
pbkdf2 :: PBKDFName -> PBKDFName
pbkdf2 PBKDFName
m = PBKDFName
PBKDF2 PBKDFName -> PBKDFName -> PBKDFName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ PBKDFName
m
pattern $bScrypt :: PBKDFName
$mScrypt :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
Scrypt = BOTAN_PBKDF_SCRYPT
pattern $bArgon2d :: PBKDFName
$mArgon2d :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
Argon2d = BOTAN_PBKDF_ARGON2D
pattern $bArgon2i :: PBKDFName
$mArgon2i :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
Argon2i = BOTAN_PBKDF_ARGON2I
pattern $bArgon2id :: PBKDFName
$mArgon2id :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
Argon2id = BOTAN_PBKDF_ARGON2ID
pattern $bBcrypt_PBKDF :: PBKDFName
$mBcrypt_PBKDF :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
Bcrypt_PBKDF = BOTAN_PBKDF_BCRYPT_PBKDF
pattern $bOpenPGP_S2K :: PBKDFName
$mOpenPGP_S2K :: forall {r}. PBKDFName -> ((# #) -> r) -> ((# #) -> r) -> r
OpenPGP_S2K = BOTAN_PBKDF_OPENPGP_S2K
openPGP_S2K:: HashName -> PBKDFName
openPGP_S2K :: PBKDFName -> PBKDFName
openPGP_S2K PBKDFName
h = PBKDFName
OpenPGP_S2K PBKDFName -> PBKDFName -> PBKDFName
forall a. (IsString a, Semigroup a) => a -> a -> a
/$ PBKDFName
h