securemem 0.1.0 → 0.1.1
raw patch · 2 files changed
+46/−28 lines, 2 filesdep ~byteablePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: byteable
API changes (from Hackage documentation)
Files
- Data/SecureMem.hs +44/−26
- securemem.cabal +2/−2
Data/SecureMem.hs view
@@ -34,6 +34,7 @@ import Data.Word (Word8) import Data.Monoid import Control.Applicative ((<$>))+import Control.Monad (foldM, void) import Data.ByteString (ByteString) import Data.Byteable import qualified Data.ByteString.Internal as B@@ -52,36 +53,53 @@ MallocPtr mba _ -> I# (sizeofMutableByteArray# mba) _ -> error "cannot happen" +secureMemEq :: SecureMem -> SecureMem -> Bool+secureMemEq sm1 sm2 = sz1 == sz2 && B.inlinePerformIO meq+ where meq = withSecureMemPtr sm1 $ \ptr1 ->+ withSecureMemPtr sm2 $ \ptr2 ->+ feq ptr1 ptr2+ !sz1 = secureMemGetSize sm1+ !sz2 = secureMemGetSize sm2+ feq | sz1 == 8 = compareEq8+ | sz1 == 16 = compareEq16+ | sz1 == 24 = compareEq24+ | sz1 == 32 = compareEq32+ | sz1 == 64 = compareEq64+ | sz1 == 128 = compareEq128+ | sz1 == 256 = compareEq256+ | otherwise = compareEq (fromIntegral sz1)++secureMemAppend :: SecureMem -> SecureMem -> SecureMem+secureMemAppend s1 s2 =+ unsafeCreateSecureMem (sz1+sz2) $ \dst -> do+ withSecureMemPtr s1 $ \sp1 -> B.memcpy dst sp1 (fromIntegral sz1)+ withSecureMemPtr s2 $ \sp2 -> B.memcpy (dst `plusPtr` sz1) sp2 (fromIntegral sz2)+ where !sz1 = secureMemGetSize s1+ !sz2 = secureMemGetSize s2++secureMemConcat :: [SecureMem] -> SecureMem+secureMemConcat l = unsafeCreateSecureMem total $ \dst -> void $ foldM copy dst l+ where total = sum $ map secureMemGetSize l+ copy dst s = withSecureMemPtr s $ \sp -> do+ B.memcpy dst sp sz+ return (dst `plusPtr` sz)+ where sz = secureMemGetSize s+ instance Show SecureMem where show _ = "<secure-mem>" instance Byteable SecureMem where- toBytes = secureMemToByteString+ toBytes = secureMemToByteString+ byteableLength = secureMemGetSize+ withBytePtr = withSecureMemPtr instance Eq SecureMem where- sm1 == sm2 = sz1 == sz2 && B.inlinePerformIO meq- where meq = withSecureMemPtr sm1 $ \ptr1 ->- withSecureMemPtr sm2 $ \ptr2 ->- feq ptr1 ptr2- !sz1 = secureMemGetSize sm1- !sz2 = secureMemGetSize sm2- feq | sz1 == 8 = compareEq8- | sz1 == 16 = compareEq16- | sz1 == 24 = compareEq24- | sz1 == 32 = compareEq32- | sz1 == 64 = compareEq64- | sz1 == 128 = compareEq128- | sz1 == 256 = compareEq256- | otherwise = compareEq (fromIntegral sz1)+ (==) = secureMemEq instance Monoid SecureMem where- mempty = unsafeCreateSecureMem 0 (\_ -> return ())- mappend s1 s2 = unsafeCreateSecureMem (sz1+sz2) $ \dst -> do- withSecureMemPtr s1 $ \sp1 -> B.memcpy dst sp1 (fromIntegral sz1)- withSecureMemPtr s2 $ \sp2 -> B.memcpy (dst `plusPtr` sz1) sp2 (fromIntegral sz2)- where - !sz1 = secureMemGetSize s1- !sz2 = secureMemGetSize s2+ mempty = unsafeCreateSecureMem 0 (\_ -> return ())+ mappend = secureMemAppend+ mconcat = secureMemConcat type Finalizer = Ptr Word8 -> IO () type FinalizerWithSize = CInt -> Ptr Word8 -> IO ()@@ -135,7 +153,7 @@ fptr@(ForeignPtr addr _) <- mallocForeignPtrBytes sz addForeignPtrConcFinalizer fptr (scruber (Ptr addr)) return fptr- where !scruber = szToScruber sz+ where !scruber = szToScruber sz -- | Allocate a new SecureMem --@@ -178,7 +196,7 @@ B.unsafeCreate sz $ \dst -> withSecureMemPtr sm $ \src -> B.memcpy dst src (fromIntegral sz)- where !sz = secureMemGetSize sm+ where !sz = secureMemGetSize sm -- | Create a SecureMem from a bytestring secureMemFromByteString :: ByteString -> SecureMem@@ -186,5 +204,5 @@ sm <- allocateSecureMem len withSecureMemPtr sm $ \dst -> withBytestringPtr $ \src -> B.memcpy dst src (fromIntegral len) return sm- where (fp, off, !len) = B.toForeignPtr b- withBytestringPtr f = withForeignPtr fp $ \p -> f (p `plusPtr` off)+ where (fp, off, !len) = B.toForeignPtr b+ withBytestringPtr f = withForeignPtr fp $ \p -> f (p `plusPtr` off)
securemem.cabal view
@@ -1,5 +1,5 @@ Name: securemem-Version: 0.1.0+Version: 0.1.1 Synopsis: abstraction to an auto scrubbing and const time eq, memory chunk. Description: SecureMem is similar to ByteString, except that it provides a memory chunk that@@ -20,7 +20,7 @@ Exposed-modules: Data.SecureMem Build-depends: base >= 4 && < 5 , bytestring- , byteable+ , byteable >= 0.1.1 , ghc-prim C-sources: cbits/utils.c ghc-options: -Wall -fwarn-tabs