module Botan.Low.SRP6 (
SRP6ServerSession(..)
, withSRP6ServerSession
, srp6ServerSessionInit
, srp6ServerSessionDestroy
, srp6ServerSessionStep1
, srp6ServerSessionStep2
, srp6GenerateVerifier
, srp6ClientAgree
, srp6GroupSize
, SRP6Verifier
, SRP6BValue
, SRP6AValue
, SRP6SharedSecret
, pattern MODP_SRP_1024
, pattern MODP_SRP_1536
, pattern MODP_SRP_2048
, pattern MODP_SRP_3072
, pattern MODP_SRP_4096
, pattern MODP_SRP_6144
, pattern MODP_SRP_8192
) where
import Botan.Bindings.ConstPtr (ConstPtr (..))
import Botan.Bindings.SRP6
import Botan.Low.Error.Internal
import Botan.Low.Hash
import Botan.Low.Internal.ByteString
import Botan.Low.PubKey
import Botan.Low.Remake
import Botan.Low.RNG
import Data.ByteString (ByteString)
import qualified Data.ByteString.Internal as BS
import Data.Word
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Marshal.Alloc
import Foreign.Ptr
import Foreign.Storable
type Identifier = ByteString
type Password = ByteString
type Salt = ByteString
type SRP6Verifier = ByteString
type SRP6BValue = ByteString
type SRP6AValue = ByteString
type SRP6SharedSecret = ByteString
newtype SRP6ServerSession = MkSRP6ServerSession { SRP6ServerSession -> ForeignPtr BotanSRP6ServerSessionStruct
foreignPtr :: ForeignPtr BotanSRP6ServerSessionStruct }
withSRP6ServerSession :: SRP6ServerSession -> (BotanSRP6ServerSession -> IO a) -> IO a
srp6ServerSessionDestroy :: SRP6ServerSession -> IO ()
createSRP6ServerSession :: (Ptr BotanSRP6ServerSession -> IO CInt) -> IO SRP6ServerSession
(SRP6ServerSession -> (BotanSRP6ServerSession -> IO a) -> IO a
withSRP6ServerSession, SRP6ServerSession -> IO ()
srp6ServerSessionDestroy, (Ptr BotanSRP6ServerSession -> IO CInt) -> IO SRP6ServerSession
createSRP6ServerSession)
= (Ptr BotanSRP6ServerSessionStruct -> BotanSRP6ServerSession)
-> (BotanSRP6ServerSession -> Ptr BotanSRP6ServerSessionStruct)
-> (ForeignPtr BotanSRP6ServerSessionStruct -> SRP6ServerSession)
-> (SRP6ServerSession -> ForeignPtr BotanSRP6ServerSessionStruct)
-> FinalizerPtr BotanSRP6ServerSessionStruct
-> (SRP6ServerSession -> (BotanSRP6ServerSession -> IO a) -> IO a,
SRP6ServerSession -> IO (),
(Ptr BotanSRP6ServerSession -> IO CInt) -> IO SRP6ServerSession)
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 BotanSRP6ServerSessionStruct -> BotanSRP6ServerSession
MkBotanSRP6ServerSession (.ptr)
ForeignPtr BotanSRP6ServerSessionStruct -> SRP6ServerSession
MkSRP6ServerSession (.foreignPtr)
FinalizerPtr BotanSRP6ServerSessionStruct
botan_srp6_server_session_destroy
srp6ServerSessionInit ::
IO SRP6ServerSession
srp6ServerSessionInit :: IO SRP6ServerSession
srp6ServerSessionInit = (Ptr BotanSRP6ServerSession -> IO CInt) -> IO SRP6ServerSession
createSRP6ServerSession Ptr BotanSRP6ServerSession -> IO CInt
botan_srp6_server_session_init
srp6ServerSessionStep1 ::
SRP6ServerSession
-> SRP6Verifier
-> DLGroupName
-> HashName
-> RNG
-> IO SRP6BValue
srp6ServerSessionStep1 :: SRP6ServerSession
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> RNG
-> IO SRP6Verifier
srp6ServerSessionStep1 SRP6ServerSession
srp6 SRP6Verifier
verifier SRP6Verifier
groupId SRP6Verifier
hashId RNG
rng =
SRP6ServerSession
-> (BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier
forall a.
SRP6ServerSession -> (BotanSRP6ServerSession -> IO a) -> IO a
withSRP6ServerSession SRP6ServerSession
srp6 ((BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ BotanSRP6ServerSession
srp6Ptr ->
SRP6Verifier
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall byte a. SRP6Verifier -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen SRP6Verifier
verifier ((Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
verifierPtr CSize
verifierLen ->
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
groupId ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
groupIdPtr ->
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
hashId ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
hashIdPtr ->
RNG -> (BotanRNG -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. RNG -> (BotanRNG -> IO a) -> IO a
withRNG RNG
rng ((BotanRNG -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (BotanRNG -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ BotanRNG
botanRNG ->
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithGroupSize SRP6Verifier
groupId ((Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier)
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr Ptr CSize
outLen ->
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
BotanSRP6ServerSession
-> ConstPtr Word8
-> CSize
-> ConstPtr CChar
-> ConstPtr CChar
-> BotanRNG
-> Ptr Word8
-> Ptr CSize
-> IO CInt
botan_srp6_server_session_step1
BotanSRP6ServerSession
srp6Ptr
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
verifierPtr)
CSize
verifierLen
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
groupIdPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
hashIdPtr)
BotanRNG
botanRNG
Ptr Word8
outPtr
Ptr CSize
outLen
srp6ServerSessionStep2 ::
SRP6ServerSession
-> SRP6AValue
-> DLGroupName
-> IO SRP6SharedSecret
srp6ServerSessionStep2 :: SRP6ServerSession
-> SRP6Verifier -> SRP6Verifier -> IO SRP6Verifier
srp6ServerSessionStep2 SRP6ServerSession
srp6 SRP6Verifier
groupId SRP6Verifier
a =
SRP6ServerSession
-> (BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier
forall a.
SRP6ServerSession -> (BotanSRP6ServerSession -> IO a) -> IO a
withSRP6ServerSession SRP6ServerSession
srp6 ((BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (BotanSRP6ServerSession -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ BotanSRP6ServerSession
srp6Ptr ->
SRP6Verifier
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall byte a. SRP6Verifier -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen SRP6Verifier
a ((Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
aPtr CSize
aLen ->
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithGroupSize SRP6Verifier
groupId ((Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier)
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr Ptr CSize
outLen ->
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
BotanSRP6ServerSession
-> ConstPtr Word8 -> CSize -> Ptr Word8 -> Ptr CSize -> IO CInt
botan_srp6_server_session_step2
BotanSRP6ServerSession
srp6Ptr
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
aPtr)
CSize
aLen
Ptr Word8
outPtr
Ptr CSize
outLen
srp6GenerateVerifier ::
Identifier
-> Password
-> Salt
-> DLGroupName
-> HashName
-> IO SRP6Verifier
srp6GenerateVerifier :: SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> IO SRP6Verifier
srp6GenerateVerifier SRP6Verifier
identifier SRP6Verifier
password SRP6Verifier
salt SRP6Verifier
groupId SRP6Verifier
hashId =
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
identifier ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
identifierPtr ->
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
password ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
passwordPtr ->
SRP6Verifier
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall byte a. SRP6Verifier -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen SRP6Verifier
salt ((Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr Word8 -> CSize -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
saltPtr CSize
saltLen ->
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
groupId ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
groupIdPtr ->
SRP6Verifier -> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
hashId ((Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier)
-> (Ptr CChar -> IO SRP6Verifier) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
hashIdPtr ->
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithGroupSize SRP6Verifier
groupId ((Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier)
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
outPtr Ptr CSize
outLen ->
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
ConstPtr CChar
-> ConstPtr CChar
-> ConstPtr Word8
-> CSize
-> ConstPtr CChar
-> ConstPtr CChar
-> Ptr Word8
-> Ptr CSize
-> IO CInt
botan_srp6_generate_verifier
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
identifierPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
passwordPtr)
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
saltPtr)
CSize
saltLen
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
groupIdPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
hashIdPtr)
Ptr Word8
outPtr
(Ptr CSize -> Ptr CSize
forall a b. Ptr a -> Ptr b
castPtr Ptr CSize
outLen)
srp6ClientAgree ::
Identifier
-> Password
-> DLGroupName
-> HashName
-> Salt
-> SRP6BValue
-> RNG
-> IO (SRP6AValue, SRP6SharedSecret)
srp6ClientAgree :: SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> SRP6Verifier
-> RNG
-> IO (SRP6Verifier, SRP6Verifier)
srp6ClientAgree SRP6Verifier
identifier SRP6Verifier
password SRP6Verifier
groupId SRP6Verifier
hashId SRP6Verifier
salt SRP6Verifier
b RNG
rng =
SRP6Verifier
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
identifier ((Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
identifierPtr ->
SRP6Verifier
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
password ((Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
passwordPtr ->
SRP6Verifier
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
groupId ((Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
groupIdPtr ->
SRP6Verifier
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
hashId ((Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr CChar -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
hashIdPtr ->
SRP6Verifier
-> (Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall byte a. SRP6Verifier -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen SRP6Verifier
salt ((Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
saltPtr CSize
saltLen ->
SRP6Verifier
-> (Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall byte a. SRP6Verifier -> (Ptr byte -> CSize -> IO a) -> IO a
asBytesLen SRP6Verifier
b ((Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr Word8 -> CSize -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
bPtr CSize
bLen ->
RNG
-> (BotanRNG -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a. RNG -> (BotanRNG -> IO a) -> IO a
withRNG RNG
rng ((BotanRNG -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier))
-> (BotanRNG -> IO (SRP6Verifier, SRP6Verifier))
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ BotanRNG
botanRNG ->
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO SRP6Verifier)
-> IO (SRP6Verifier, SRP6Verifier)
forall a.
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO a) -> IO (SRP6Verifier, a)
createWithGroupSize' SRP6Verifier
groupId ((Ptr Word8 -> Ptr CSize -> IO SRP6Verifier)
-> IO (SRP6Verifier, SRP6Verifier))
-> (Ptr Word8 -> Ptr CSize -> IO SRP6Verifier)
-> IO (SRP6Verifier, SRP6Verifier)
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
aPtr Ptr CSize
aSzPtr ->
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithGroupSize SRP6Verifier
groupId ((Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier)
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
kPtr Ptr CSize
kSzPtr ->
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
ConstPtr CChar
-> ConstPtr CChar
-> ConstPtr CChar
-> ConstPtr CChar
-> ConstPtr Word8
-> CSize
-> ConstPtr Word8
-> CSize
-> BotanRNG
-> Ptr Word8
-> Ptr CSize
-> Ptr Word8
-> Ptr CSize
-> IO CInt
botan_srp6_client_agree
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
identifierPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
passwordPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
groupIdPtr)
(Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
hashIdPtr)
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
saltPtr)
CSize
saltLen
(Ptr Word8 -> ConstPtr Word8
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr Word8
bPtr)
CSize
bLen
BotanRNG
botanRNG
Ptr Word8
aPtr
Ptr CSize
aSzPtr
Ptr Word8
kPtr
Ptr CSize
kSzPtr
srp6GroupSize ::
DLGroupName
-> IO Int
srp6GroupSize :: SRP6Verifier -> IO Int
srp6GroupSize SRP6Verifier
groupId =
SRP6Verifier -> (Ptr CChar -> IO Int) -> IO Int
forall a. SRP6Verifier -> (Ptr CChar -> IO a) -> IO a
asCString SRP6Verifier
groupId ((Ptr CChar -> IO Int) -> IO Int)
-> (Ptr CChar -> IO Int) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ Ptr CChar
groupIdPtr ->
(Ptr CSize -> IO Int) -> IO Int
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO Int) -> IO Int)
-> (Ptr CSize -> IO Int) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ Ptr CSize
szPtr -> do
HasCallStack => IO CInt -> IO ()
IO CInt -> IO ()
throwBotanIfNegative_ (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
ConstPtr CChar -> Ptr CSize -> IO CInt
botan_srp6_group_size (Ptr CChar -> ConstPtr CChar
forall a. Ptr a -> ConstPtr a
ConstPtr Ptr CChar
groupIdPtr) Ptr CSize
szPtr
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
szPtr
createWithGroupSize ::
DLGroupName
-> (Ptr Word8 -> Ptr CSize -> IO ())
-> IO ByteString
createWithGroupSize :: SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithGroupSize SRP6Verifier
groupId Ptr Word8 -> Ptr CSize -> IO ()
k = do
Int
sz <- SRP6Verifier -> IO Int
srp6GroupSize SRP6Verifier
groupId
Int -> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithSize Int
sz Ptr Word8 -> Ptr CSize -> IO ()
k
createWithSize ::
Int
-> (Ptr Word8 -> Ptr CSize -> IO ())
-> IO ByteString
createWithSize :: Int -> (Ptr Word8 -> Ptr CSize -> IO ()) -> IO SRP6Verifier
createWithSize Int
sz Ptr Word8 -> Ptr CSize -> IO ()
k =
Int -> (Ptr Word8 -> IO Int) -> IO SRP6Verifier
BS.createAndTrim Int
sz ((Ptr Word8 -> IO Int) -> IO SRP6Verifier)
-> (Ptr Word8 -> IO Int) -> IO SRP6Verifier
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
bytesPtr ->
(Ptr CSize -> IO Int) -> IO Int
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO Int) -> IO Int)
-> (Ptr CSize -> IO Int) -> IO Int
forall a b. (a -> b) -> a -> b
$ \Ptr CSize
lenPtr -> do
Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr CSize
lenPtr (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz)
Ptr Word8 -> Ptr CSize -> IO ()
k Ptr Word8
bytesPtr Ptr CSize
lenPtr
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
lenPtr
createWithGroupSize' ::
DLGroupName
-> (Ptr Word8 -> Ptr CSize -> IO a)
-> IO (ByteString, a)
createWithGroupSize' :: forall a.
SRP6Verifier
-> (Ptr Word8 -> Ptr CSize -> IO a) -> IO (SRP6Verifier, a)
createWithGroupSize' SRP6Verifier
groupId Ptr Word8 -> Ptr CSize -> IO a
k = do
Int
sz <- SRP6Verifier -> IO Int
srp6GroupSize SRP6Verifier
groupId
Int -> (Ptr Word8 -> Ptr CSize -> IO a) -> IO (SRP6Verifier, a)
forall a.
Int -> (Ptr Word8 -> Ptr CSize -> IO a) -> IO (SRP6Verifier, a)
createWithSize' Int
sz Ptr Word8 -> Ptr CSize -> IO a
k
createWithSize' ::
Int
-> (Ptr Word8 -> Ptr CSize -> IO a)
-> IO (ByteString, a)
createWithSize' :: forall a.
Int -> (Ptr Word8 -> Ptr CSize -> IO a) -> IO (SRP6Verifier, a)
createWithSize' Int
sz Ptr Word8 -> Ptr CSize -> IO a
k =
Int -> (Ptr Word8 -> IO (Int, Int, a)) -> IO (SRP6Verifier, a)
forall a.
Int -> (Ptr Word8 -> IO (Int, Int, a)) -> IO (SRP6Verifier, a)
BS.createAndTrim' Int
sz ((Ptr Word8 -> IO (Int, Int, a)) -> IO (SRP6Verifier, a))
-> (Ptr Word8 -> IO (Int, Int, a)) -> IO (SRP6Verifier, a)
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
bytesPtr ->
(Ptr CSize -> IO (Int, Int, a)) -> IO (Int, Int, a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CSize -> IO (Int, Int, a)) -> IO (Int, Int, a))
-> (Ptr CSize -> IO (Int, Int, a)) -> IO (Int, Int, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CSize
lenPtr -> do
Ptr CSize -> CSize -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr CSize
lenPtr (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz)
a
x <- Ptr Word8 -> Ptr CSize -> IO a
k Ptr Word8
bytesPtr Ptr CSize
lenPtr
Int
sz' <- 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
lenPtr
(Int, Int, a) -> IO (Int, Int, a)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
0, Int
sz', a
x)