diff --git a/Crypto/Internal/ByteArray.hs b/Crypto/Internal/ByteArray.hs new file mode 100644 index 0000000..d17c78b --- /dev/null +++ b/Crypto/Internal/ByteArray.hs @@ -0,0 +1,46 @@ +-- | +-- Module : Crypto.Internal.ByteArray +-- License : BSD-style +-- Maintainer : Vincent Hanquez +-- Stability : stable +-- Portability : Good +-- +-- Simple and efficient byte array types +-- +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE UnboxedTuples #-} +module Crypto.Internal.ByteArray + ( ByteArray(..) + , byteArrayAllocAndFreeze + ) where + +import Data.SecureMem +import Crypto.Internal.Memory +import Crypto.Internal.Compat +import Foreign.Ptr +import Foreign.ForeignPtr + +import Data.ByteString (ByteString) +import qualified Data.ByteString.Internal as B + +class ByteArray ba where + byteArrayAlloc :: Int -> (Ptr p -> IO ()) -> IO ba + +instance ByteArray Bytes where + byteArrayAlloc = bytesAlloc + +instance ByteArray ByteString where + byteArrayAlloc sz f = do + fptr <- B.mallocByteString sz + withForeignPtr fptr (f . castPtr) + return $! B.PS fptr 0 sz + +instance ByteArray SecureMem where + byteArrayAlloc sz f = do + out <- allocateSecureMem sz + withSecureMemPtr out (f . castPtr) + return out + +byteArrayAllocAndFreeze :: ByteArray a => Int -> (Ptr p -> IO ()) -> a +byteArrayAllocAndFreeze sz f = unsafeDoIO (byteArrayAlloc sz f)