{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Cardano.Crypto.Libsodium.MLockedBytes.Internal (
MLockedSizedBytes (..),
SizedVoid,
mlsbNew,
mlsbNewZero,
mlsbZero,
mlsbUseAsCPtr,
mlsbUseAsSizedPtr,
mlsbCopy,
mlsbFinalize,
mlsbCompare,
mlsbEq,
withMLSB,
withMLSBChunk,
mlsbNewWith,
mlsbNewZeroWith,
mlsbCopyWith,
traceMLSB,
mlsbFromByteString,
mlsbFromByteStringCheck,
mlsbAsByteString,
mlsbToByteString,
mlsbFromByteStringWith,
mlsbFromByteStringCheckWith,
) where
import Control.DeepSeq (NFData (..))
import Control.Monad.Class.MonadST
import Control.Monad.ST.Unsafe (unsafeIOToST)
import Data.Proxy (Proxy (..))
import Data.Word (Word8)
import Foreign.C.Types (CSize (..))
import Foreign.ForeignPtr (castForeignPtr, newForeignPtr_)
import Foreign.Ptr (Ptr, castPtr, plusPtr)
import GHC.TypeLits (KnownNat, Nat, natVal)
import NoThunks.Class (NoThunks)
import Cardano.Crypto.Libsodium.C
import Cardano.Crypto.Libsodium.Memory
import Cardano.Crypto.Libsodium.Memory.Internal (MLockedForeignPtr (..))
import Cardano.Foreign
import Data.Bits (Bits, shiftL)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BSI
data SizedVoid (n :: Nat)
newtype MLockedSizedBytes (n :: Nat) = MLSB (MLockedForeignPtr (SizedVoid n))
deriving newtype (Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
Proxy (MLockedSizedBytes n) -> String
(Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo))
-> (Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo))
-> (Proxy (MLockedSizedBytes n) -> String)
-> NoThunks (MLockedSizedBytes n)
forall (n :: Nat).
Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
forall (n :: Nat). Proxy (MLockedSizedBytes n) -> String
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: forall (n :: Nat).
Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
noThunks :: Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (n :: Nat).
Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> MLockedSizedBytes n -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (n :: Nat). Proxy (MLockedSizedBytes n) -> String
showTypeOf :: Proxy (MLockedSizedBytes n) -> String
NoThunks)
deriving newtype (MLockedSizedBytes n -> ()
(MLockedSizedBytes n -> ()) -> NFData (MLockedSizedBytes n)
forall (n :: Nat). MLockedSizedBytes n -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall (n :: Nat). MLockedSizedBytes n -> ()
rnf :: MLockedSizedBytes n -> ()
NFData)
instance KnownNat n => Show (MLockedSizedBytes n) where
show :: MLockedSizedBytes n -> String
show MLockedSizedBytes n
mlsb = String
"MLockedSizedBytes[" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Integer -> String
forall a. Show a => a -> String
show (MLockedSizedBytes n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal MLockedSizedBytes n
mlsb) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"]"
nextPowerOf2 :: forall n. (Num n, Ord n, Bits n) => n -> n
nextPowerOf2 :: forall n. (Num n, Ord n, Bits n) => n -> n
nextPowerOf2 n
i =
n -> n
go n
1
where
go :: n -> n
go :: n -> n
go n
c =
let c' :: n
c' = n
c n -> Int -> n
forall a. Bits a => a -> Int -> a
`shiftL` Int
1
in if n
c n -> n -> Bool
forall a. Ord a => a -> a -> Bool
>= n
i then n
c else n -> n
go n
c'
traceMLSB :: KnownNat n => MLockedSizedBytes n -> IO ()
traceMLSB :: forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> IO ()
traceMLSB = MLockedSizedBytes n -> IO ()
forall a. Show a => a -> IO ()
print
{-# DEPRECATED traceMLSB "Don't leave traceMLockedForeignPtr in production" #-}
withMLSB :: forall b n m. MonadST m => MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB :: forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB (MLSB MLockedForeignPtr (SizedVoid n)
fptr) Ptr (SizedVoid n) -> m b
action = MLockedForeignPtr (SizedVoid n)
-> (Ptr (SizedVoid n) -> m b) -> m b
forall (m :: * -> *) a b.
MonadST m =>
MLockedForeignPtr a -> (Ptr a -> m b) -> m b
withMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
fptr Ptr (SizedVoid n) -> m b
action
withMLSBChunk ::
forall b n n' m.
(MonadST m, KnownNat n, KnownNat n') =>
MLockedSizedBytes n ->
Int ->
(MLockedSizedBytes n' -> m b) ->
m b
withMLSBChunk :: forall b (n :: Nat) (n' :: Nat) (m :: * -> *).
(MonadST m, KnownNat n, KnownNat n') =>
MLockedSizedBytes n -> Int -> (MLockedSizedBytes n' -> m b) -> m b
withMLSBChunk MLockedSizedBytes n
mlsb Int
offset MLockedSizedBytes n' -> m b
action
| Int
offset Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 =
String -> m b
forall a. HasCallStack => String -> a
error String
"Negative offset not allowed"
| Int
offset Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
parentSize Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
chunkSize =
String -> m b
forall a. HasCallStack => String -> a
error (String -> m b) -> String -> m b
forall a b. (a -> b) -> a -> b
$ String
"Overrun (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
offset String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" + " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
chunkSize String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" > " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
parentSize String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
| Bool
otherwise =
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB MLockedSizedBytes n
mlsb ((Ptr (SizedVoid n) -> m b) -> m b)
-> (Ptr (SizedVoid n) -> m b) -> m b
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
ptr -> do
ForeignPtr (SizedVoid n')
fptr <-
ST (PrimState m) (ForeignPtr (SizedVoid n'))
-> m (ForeignPtr (SizedVoid n'))
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO (ST (PrimState m) (ForeignPtr (SizedVoid n'))
-> m (ForeignPtr (SizedVoid n')))
-> ST (PrimState m) (ForeignPtr (SizedVoid n'))
-> m (ForeignPtr (SizedVoid n'))
forall a b. (a -> b) -> a -> b
$ IO (ForeignPtr (SizedVoid n'))
-> ST (PrimState m) (ForeignPtr (SizedVoid n'))
forall a s. IO a -> ST s a
unsafeIOToST (Ptr (SizedVoid n') -> IO (ForeignPtr (SizedVoid n'))
forall a. Ptr a -> IO (ForeignPtr a)
newForeignPtr_ (Ptr (SizedVoid n') -> IO (ForeignPtr (SizedVoid n')))
-> (Ptr Any -> Ptr (SizedVoid n'))
-> Ptr Any
-> IO (ForeignPtr (SizedVoid n'))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Any -> Ptr (SizedVoid n')
forall a b. Ptr a -> Ptr b
castPtr (Ptr Any -> IO (ForeignPtr (SizedVoid n')))
-> Ptr Any -> IO (ForeignPtr (SizedVoid n'))
forall a b. (a -> b) -> a -> b
$ Ptr (SizedVoid n) -> Int -> Ptr Any
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr (SizedVoid n)
ptr Int
offset)
MLockedSizedBytes n' -> m b
action (MLockedForeignPtr (SizedVoid n') -> MLockedSizedBytes n'
forall (n :: Nat).
MLockedForeignPtr (SizedVoid n) -> MLockedSizedBytes n
MLSB (MLockedForeignPtr (SizedVoid n') -> MLockedSizedBytes n')
-> MLockedForeignPtr (SizedVoid n') -> MLockedSizedBytes n'
forall a b. (a -> b) -> a -> b
$! ForeignPtr (SizedVoid n') -> MLockedForeignPtr (SizedVoid n')
forall a. ForeignPtr a -> MLockedForeignPtr a
SFP (ForeignPtr (SizedVoid n') -> MLockedForeignPtr (SizedVoid n'))
-> ForeignPtr (SizedVoid n') -> MLockedForeignPtr (SizedVoid n')
forall a b. (a -> b) -> a -> b
$! ForeignPtr (SizedVoid n')
fptr)
where
chunkSize :: Int
chunkSize = Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Proxy n' -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n'))
parentSize :: Int
parentSize = Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (MLockedSizedBytes n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal MLockedSizedBytes n
mlsb)
mlsbSize :: KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize :: forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
mlsb = Integer -> CSize
forall a. Num a => Integer -> a
fromInteger (MLockedSizedBytes n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal MLockedSizedBytes n
mlsb)
mlsbNew :: forall n m. (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNew :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
m (MLockedSizedBytes n)
mlsbNew = MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith MLockedAllocator m
forall (m :: * -> *). MonadST m => MLockedAllocator m
mlockedMalloc
mlsbNewWith :: forall n m. MLockedAllocator m -> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith :: forall (n :: Nat) (m :: * -> *).
MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith MLockedAllocator m
allocator =
MLockedForeignPtr (SizedVoid n) -> MLockedSizedBytes n
forall (n :: Nat).
MLockedForeignPtr (SizedVoid n) -> MLockedSizedBytes n
MLSB (MLockedForeignPtr (SizedVoid n) -> MLockedSizedBytes n)
-> m (MLockedForeignPtr (SizedVoid n)) -> m (MLockedSizedBytes n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MLockedAllocator m
-> CSize -> CSize -> m (MLockedForeignPtr (SizedVoid n))
forall (m :: * -> *) a.
MLockedAllocator m -> CSize -> CSize -> m (MLockedForeignPtr a)
mlockedAllocForeignPtrBytesWith MLockedAllocator m
allocator CSize
size CSize
align
where
size :: CSize
size = Integer -> CSize
forall a. Num a => Integer -> a
fromInteger (Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n))
align :: CSize
align = CSize -> CSize
forall n. (Num n, Ord n, Bits n) => n -> n
nextPowerOf2 CSize
size
mlsbNewZero :: forall n m. (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewZero :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
m (MLockedSizedBytes n)
mlsbNewZero = MLockedAllocator m -> m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> m (MLockedSizedBytes n)
mlsbNewZeroWith MLockedAllocator m
forall (m :: * -> *). MonadST m => MLockedAllocator m
mlockedMalloc
mlsbNewZeroWith ::
forall n m. (KnownNat n, MonadST m) => MLockedAllocator m -> m (MLockedSizedBytes n)
mlsbNewZeroWith :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> m (MLockedSizedBytes n)
mlsbNewZeroWith MLockedAllocator m
allocator = do
MLockedSizedBytes n
mlsb <- MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith MLockedAllocator m
allocator
MLockedSizedBytes n -> m ()
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedSizedBytes n -> m ()
mlsbZero MLockedSizedBytes n
mlsb
MLockedSizedBytes n -> m (MLockedSizedBytes n)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MLockedSizedBytes n
mlsb
mlsbZero :: forall n m. (KnownNat n, MonadST m) => MLockedSizedBytes n -> m ()
mlsbZero :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedSizedBytes n -> m ()
mlsbZero MLockedSizedBytes n
mlsb = do
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m ()) -> m ()
forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB MLockedSizedBytes n
mlsb ((Ptr (SizedVoid n) -> m ()) -> m ())
-> (Ptr (SizedVoid n) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
ptr -> Ptr (SizedVoid n) -> CSize -> m ()
forall (m :: * -> *) a. MonadST m => Ptr a -> CSize -> m ()
zeroMem Ptr (SizedVoid n)
ptr (MLockedSizedBytes n -> CSize
forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
mlsb)
mlsbCopy ::
forall n m.
(KnownNat n, MonadST m) =>
MLockedSizedBytes n ->
m (MLockedSizedBytes n)
mlsbCopy :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedSizedBytes n -> m (MLockedSizedBytes n)
mlsbCopy = MLockedAllocator m
-> MLockedSizedBytes n -> m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m
-> MLockedSizedBytes n -> m (MLockedSizedBytes n)
mlsbCopyWith MLockedAllocator m
forall (m :: * -> *). MonadST m => MLockedAllocator m
mlockedMalloc
mlsbCopyWith ::
forall n m.
(KnownNat n, MonadST m) =>
MLockedAllocator m ->
MLockedSizedBytes n ->
m (MLockedSizedBytes n)
mlsbCopyWith :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m
-> MLockedSizedBytes n -> m (MLockedSizedBytes n)
mlsbCopyWith MLockedAllocator m
allocator MLockedSizedBytes n
src = MLockedSizedBytes n
-> (Ptr Word8 -> m (MLockedSizedBytes n))
-> m (MLockedSizedBytes n)
forall (m :: * -> *) (n :: Nat) r.
MonadST m =>
MLockedSizedBytes n -> (Ptr Word8 -> m r) -> m r
mlsbUseAsCPtr MLockedSizedBytes n
src ((Ptr Word8 -> m (MLockedSizedBytes n)) -> m (MLockedSizedBytes n))
-> (Ptr Word8 -> m (MLockedSizedBytes n))
-> m (MLockedSizedBytes n)
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptrSrc -> do
MLockedSizedBytes n
dst <- MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith MLockedAllocator m
allocator
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m ()) -> m ()
forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB MLockedSizedBytes n
dst ((Ptr (SizedVoid n) -> m ()) -> m ())
-> (Ptr (SizedVoid n) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
ptrDst -> do
Ptr Any -> Ptr Any -> CSize -> m ()
forall (m :: * -> *) a.
MonadST m =>
Ptr a -> Ptr a -> CSize -> m ()
copyMem (Ptr (SizedVoid n) -> Ptr Any
forall a b. Ptr a -> Ptr b
castPtr Ptr (SizedVoid n)
ptrDst) (Ptr Word8 -> Ptr Any
forall a b. Ptr a -> Ptr b
castPtr Ptr Word8
ptrSrc) (MLockedSizedBytes n -> CSize
forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
src)
MLockedSizedBytes n -> m (MLockedSizedBytes n)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MLockedSizedBytes n
dst
mlsbFromByteString ::
forall n m.
(KnownNat n, MonadST m) =>
BS.ByteString -> m (MLockedSizedBytes n)
mlsbFromByteString :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
ByteString -> m (MLockedSizedBytes n)
mlsbFromByteString = MLockedAllocator m -> ByteString -> m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> ByteString -> m (MLockedSizedBytes n)
mlsbFromByteStringWith MLockedAllocator m
forall (m :: * -> *). MonadST m => MLockedAllocator m
mlockedMalloc
mlsbFromByteStringWith ::
forall n m.
(KnownNat n, MonadST m) =>
MLockedAllocator m -> BS.ByteString -> m (MLockedSizedBytes n)
mlsbFromByteStringWith :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> ByteString -> m (MLockedSizedBytes n)
mlsbFromByteStringWith MLockedAllocator m
allocator ByteString
bs = do
MLockedSizedBytes n
dst <- MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
MLockedAllocator m
-> (KnownNat n, MonadST m) => m (MLockedSizedBytes n)
mlsbNewWith MLockedAllocator m
allocator
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m ()) -> m ()
forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB MLockedSizedBytes n
dst ((Ptr (SizedVoid n) -> m ()) -> m ())
-> (Ptr (SizedVoid n) -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
ptr -> ST (PrimState m) () -> m ()
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO (ST (PrimState m) () -> m ())
-> (IO () -> ST (PrimState m) ()) -> IO () -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> ST (PrimState m) ()
forall a s. IO a -> ST s a
unsafeIOToST (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
ByteString -> (CStringLen -> IO ()) -> IO ()
forall a. ByteString -> (CStringLen -> IO a) -> IO a
BS.useAsCStringLen ByteString
bs ((CStringLen -> IO ()) -> IO ()) -> (CStringLen -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr CChar
ptrBS, Int
len) -> do
Ptr CChar -> Ptr CChar -> CSize -> IO ()
forall (m :: * -> *) a.
MonadST m =>
Ptr a -> Ptr a -> CSize -> m ()
copyMem (Ptr (SizedVoid n) -> Ptr CChar
forall a b. Ptr a -> Ptr b
castPtr Ptr (SizedVoid n)
ptr) Ptr CChar
ptrBS (CSize -> CSize -> CSize
forall a. Ord a => a -> a -> a
min (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len) (MLockedSizedBytes n -> CSize
forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
dst))
MLockedSizedBytes n -> m (MLockedSizedBytes n)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MLockedSizedBytes n
dst
mlsbFromByteStringCheck ::
forall n m.
(KnownNat n, MonadST m) =>
BS.ByteString ->
m (Maybe (MLockedSizedBytes n))
mlsbFromByteStringCheck :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
ByteString -> m (Maybe (MLockedSizedBytes n))
mlsbFromByteStringCheck = MLockedAllocator m -> ByteString -> m (Maybe (MLockedSizedBytes n))
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> ByteString -> m (Maybe (MLockedSizedBytes n))
mlsbFromByteStringCheckWith MLockedAllocator m
forall (m :: * -> *). MonadST m => MLockedAllocator m
mlockedMalloc
mlsbFromByteStringCheckWith ::
forall n m.
(KnownNat n, MonadST m) =>
MLockedAllocator m ->
BS.ByteString ->
m (Maybe (MLockedSizedBytes n))
mlsbFromByteStringCheckWith :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> ByteString -> m (Maybe (MLockedSizedBytes n))
mlsbFromByteStringCheckWith MLockedAllocator m
allocator ByteString
bs
| ByteString -> Int
BS.length ByteString
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
size = Maybe (MLockedSizedBytes n) -> m (Maybe (MLockedSizedBytes n))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (MLockedSizedBytes n)
forall a. Maybe a
Nothing
| Bool
otherwise = MLockedSizedBytes n -> Maybe (MLockedSizedBytes n)
forall a. a -> Maybe a
Just (MLockedSizedBytes n -> Maybe (MLockedSizedBytes n))
-> m (MLockedSizedBytes n) -> m (Maybe (MLockedSizedBytes n))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MLockedAllocator m -> ByteString -> m (MLockedSizedBytes n)
forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedAllocator m -> ByteString -> m (MLockedSizedBytes n)
mlsbFromByteStringWith MLockedAllocator m
allocator ByteString
bs
where
size :: Int
size :: Int
size = Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n))
mlsbAsByteString :: forall n. KnownNat n => MLockedSizedBytes n -> BS.ByteString
mlsbAsByteString :: forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> ByteString
mlsbAsByteString mlsb :: MLockedSizedBytes n
mlsb@(MLSB (SFP ForeignPtr (SizedVoid n)
fptr)) = ForeignPtr Word8 -> Int -> Int -> ByteString
BSI.PS (ForeignPtr (SizedVoid n) -> ForeignPtr Word8
forall a b. ForeignPtr a -> ForeignPtr b
castForeignPtr ForeignPtr (SizedVoid n)
fptr) Int
0 Int
size
where
size :: Int
size :: Int
size = CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (MLockedSizedBytes n -> CSize
forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
mlsb)
mlsbToByteString :: forall n m. (KnownNat n, MonadST m) => MLockedSizedBytes n -> m BS.ByteString
mlsbToByteString :: forall (n :: Nat) (m :: * -> *).
(KnownNat n, MonadST m) =>
MLockedSizedBytes n -> m ByteString
mlsbToByteString MLockedSizedBytes n
mlsb =
MLockedSizedBytes n
-> (Ptr (SizedVoid n) -> m ByteString) -> m ByteString
forall b (n :: Nat) (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (Ptr (SizedVoid n) -> m b) -> m b
withMLSB MLockedSizedBytes n
mlsb ((Ptr (SizedVoid n) -> m ByteString) -> m ByteString)
-> (Ptr (SizedVoid n) -> m ByteString) -> m ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
ptr ->
ST (PrimState m) ByteString -> m ByteString
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO (ST (PrimState m) ByteString -> m ByteString)
-> (IO ByteString -> ST (PrimState m) ByteString)
-> IO ByteString
-> m ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ByteString -> ST (PrimState m) ByteString
forall a s. IO a -> ST s a
unsafeIOToST (IO ByteString -> m ByteString) -> IO ByteString -> m ByteString
forall a b. (a -> b) -> a -> b
$ CStringLen -> IO ByteString
BS.packCStringLen (Ptr (SizedVoid n) -> Ptr CChar
forall a b. Ptr a -> Ptr b
castPtr Ptr (SizedVoid n)
ptr, Int
size)
where
size :: Int
size :: Int
size = CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (MLockedSizedBytes n -> CSize
forall (n :: Nat). KnownNat n => MLockedSizedBytes n -> CSize
mlsbSize MLockedSizedBytes n
mlsb)
mlsbUseAsCPtr :: MonadST m => MLockedSizedBytes n -> (Ptr Word8 -> m r) -> m r
mlsbUseAsCPtr :: forall (m :: * -> *) (n :: Nat) r.
MonadST m =>
MLockedSizedBytes n -> (Ptr Word8 -> m r) -> m r
mlsbUseAsCPtr (MLSB MLockedForeignPtr (SizedVoid n)
x) Ptr Word8 -> m r
k =
MLockedForeignPtr (SizedVoid n)
-> (Ptr (SizedVoid n) -> m r) -> m r
forall (m :: * -> *) a b.
MonadST m =>
MLockedForeignPtr a -> (Ptr a -> m b) -> m b
withMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
x (Ptr Word8 -> m r
k (Ptr Word8 -> m r)
-> (Ptr (SizedVoid n) -> Ptr Word8) -> Ptr (SizedVoid n) -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (SizedVoid n) -> Ptr Word8
forall a b. Ptr a -> Ptr b
castPtr)
mlsbUseAsSizedPtr :: forall n r m. MonadST m => MLockedSizedBytes n -> (SizedPtr n -> m r) -> m r
mlsbUseAsSizedPtr :: forall (n :: Nat) r (m :: * -> *).
MonadST m =>
MLockedSizedBytes n -> (SizedPtr n -> m r) -> m r
mlsbUseAsSizedPtr (MLSB MLockedForeignPtr (SizedVoid n)
x) SizedPtr n -> m r
k =
MLockedForeignPtr (SizedVoid n)
-> (Ptr (SizedVoid n) -> m r) -> m r
forall (m :: * -> *) a b.
MonadST m =>
MLockedForeignPtr a -> (Ptr a -> m b) -> m b
withMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
x (SizedPtr n -> m r
k (SizedPtr n -> m r)
-> (Ptr (SizedVoid n) -> SizedPtr n) -> Ptr (SizedVoid n) -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Void -> SizedPtr n
forall (n :: Nat). Ptr Void -> SizedPtr n
SizedPtr (Ptr Void -> SizedPtr n)
-> (Ptr (SizedVoid n) -> Ptr Void)
-> Ptr (SizedVoid n)
-> SizedPtr n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (SizedVoid n) -> Ptr Void
forall a b. Ptr a -> Ptr b
castPtr)
mlsbFinalize :: MonadST m => MLockedSizedBytes n -> m ()
mlsbFinalize :: forall (m :: * -> *) (n :: Nat).
MonadST m =>
MLockedSizedBytes n -> m ()
mlsbFinalize (MLSB MLockedForeignPtr (SizedVoid n)
ptr) = MLockedForeignPtr (SizedVoid n) -> m ()
forall (m :: * -> *) a. MonadST m => MLockedForeignPtr a -> m ()
finalizeMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
ptr
mlsbCompare ::
forall n m. (MonadST m, KnownNat n) => MLockedSizedBytes n -> MLockedSizedBytes n -> m Ordering
mlsbCompare :: forall (n :: Nat) (m :: * -> *).
(MonadST m, KnownNat n) =>
MLockedSizedBytes n -> MLockedSizedBytes n -> m Ordering
mlsbCompare (MLSB MLockedForeignPtr (SizedVoid n)
x) (MLSB MLockedForeignPtr (SizedVoid n)
y) =
MLockedForeignPtr (SizedVoid n)
-> (Ptr (SizedVoid n) -> m Ordering) -> m Ordering
forall (m :: * -> *) a b.
MonadST m =>
MLockedForeignPtr a -> (Ptr a -> m b) -> m b
withMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
x ((Ptr (SizedVoid n) -> m Ordering) -> m Ordering)
-> (Ptr (SizedVoid n) -> m Ordering) -> m Ordering
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
x' ->
MLockedForeignPtr (SizedVoid n)
-> (Ptr (SizedVoid n) -> m Ordering) -> m Ordering
forall (m :: * -> *) a b.
MonadST m =>
MLockedForeignPtr a -> (Ptr a -> m b) -> m b
withMLockedForeignPtr MLockedForeignPtr (SizedVoid n)
y ((Ptr (SizedVoid n) -> m Ordering) -> m Ordering)
-> (Ptr (SizedVoid n) -> m Ordering) -> m Ordering
forall a b. (a -> b) -> a -> b
$ \Ptr (SizedVoid n)
y' -> do
Int
res <- ST (PrimState m) Int -> m Int
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO (ST (PrimState m) Int -> m Int)
-> (IO Int -> ST (PrimState m) Int) -> IO Int -> m Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO Int -> ST (PrimState m) Int
forall a s. IO a -> ST s a
unsafeIOToST (IO Int -> m Int) -> IO Int -> m Int
forall a b. (a -> b) -> a -> b
$ Ptr (SizedVoid n) -> Ptr (SizedVoid n) -> CSize -> IO Int
forall a. Ptr a -> Ptr a -> CSize -> IO Int
c_sodium_compare Ptr (SizedVoid n)
x' Ptr (SizedVoid n)
y' CSize
size
Ordering -> m Ordering
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ordering -> m Ordering) -> Ordering -> m Ordering
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
res Int
0
where
size :: CSize
size = Integer -> CSize
forall a. Num a => Integer -> a
fromInteger (Integer -> CSize) -> Integer -> CSize
forall a b. (a -> b) -> a -> b
$ Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n)
mlsbEq ::
forall n m. (MonadST m, KnownNat n) => MLockedSizedBytes n -> MLockedSizedBytes n -> m Bool
mlsbEq :: forall (n :: Nat) (m :: * -> *).
(MonadST m, KnownNat n) =>
MLockedSizedBytes n -> MLockedSizedBytes n -> m Bool
mlsbEq MLockedSizedBytes n
a MLockedSizedBytes n
b = (Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
EQ) (Ordering -> Bool) -> m Ordering -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MLockedSizedBytes n -> MLockedSizedBytes n -> m Ordering
forall (n :: Nat) (m :: * -> *).
(MonadST m, KnownNat n) =>
MLockedSizedBytes n -> MLockedSizedBytes n -> m Ordering
mlsbCompare MLockedSizedBytes n
a MLockedSizedBytes n
b