add bytes manipulation function

This commit is contained in:
Vincent Hanquez 2015-02-15 00:13:51 +00:00
parent b5dbc9caae
commit 41361968f6
2 changed files with 55 additions and 0 deletions

54
Crypto/Internal/Bytes.hs Normal file
View File

@ -0,0 +1,54 @@
-- |
-- Module : Crypto.Internal.Bytes
-- License : BSD-style
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
-- Stability : experimental
-- Portability : unknown
--
-- internal helpers function to manipulate sequence of bytes
-- like ByteString and buffer.
--
module Crypto.Internal.Bytes
( withByteStringPtr
, tempBufCreate
, bufCreate
, bufXor
) where
import Control.Applicative ((<$>), (<*>))
import Foreign.Ptr (Ptr, plusPtr)
import Foreign.ForeignPtr (withForeignPtr)
import Foreign.Storable (peek, poke)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import Data.ByteString (ByteString)
import Data.ByteString.Internal (ByteString(..), mallocByteString)
import Data.Bits (xor)
import Data.Word (Word8)
import Data.ByteString.Internal (toForeignPtr)
withByteStringPtr :: ByteString -> (Ptr Word8 -> IO a) -> IO a
withByteStringPtr b f =
withForeignPtr fptr $ \ptr -> f (ptr `plusPtr` off)
where (fptr, off, _) = toForeignPtr b
-- | Create a buffer, and turns the final resulting ByteString
bufCreate :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
bufCreate size f = do
fptr <- mallocByteString size
withForeignPtr fptr f
return $! PS fptr 0 size
-- | Create a new temporary buffer
tempBufCreate :: Int -> (Ptr Word8 -> IO a) -> IO a
tempBufCreate size f = allocaBytesAligned size 8 f
-- | xor bytes from source1 and source2 to destination
--
-- d = s1 xor s2
--
-- s1, nor s2 are modified unless
bufXor :: Ptr Word8 -> Ptr Word8 -> Ptr Word8 -> Int -> IO ()
bufXor _ _ _ 0 = return ()
bufXor d s1 s2 n = do
(xor <$> peek s1 <*> peek s2) >>= poke d
bufXor (d `plusPtr` 1) (s1 `plusPtr` 1) (s2 `plusPtr` 1) (n-1)

View File

@ -85,6 +85,7 @@ Library
, Crypto.Random.Entropy.Source
, Crypto.Random.Entropy.Backend
, Crypto.Internal.Compat
, Crypto.Internal.Bytes
Build-depends: base >= 4.3 && < 5
, bytestring
, securemem >= 0.1.7