crypto-api 0.6.2.1 → 0.6.3
raw patch · 5 files changed
+9/−154 lines, 5 filesdep +entropyPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: entropy
API changes (from Hackage documentation)
- System.Crypto.Random: closeHandle :: CryptHandle -> IO ()
- System.Crypto.Random: data CryptHandle
- System.Crypto.Random: getEntropy :: ByteLength -> IO ByteString
- System.Crypto.Random: hGetEntropy :: CryptHandle -> Int -> IO ByteString
- System.Crypto.Random: openHandle :: IO CryptHandle
Files
- Crypto/Classes.hs +1/−1
- Crypto/Modes.hs +1/−1
- Crypto/Random.hs +1/−1
- System/Crypto/Random.hs +3/−145
- crypto-api.cabal +3/−6
Crypto/Classes.hs view
@@ -44,7 +44,7 @@ import Data.Tagged import Crypto.Types import Crypto.Random-import System.Crypto.Random+import System.Entropy -- |The Hash class is intended as the generic interface -- targeted by maintainers of Haskell digest implementations.
Crypto/Modes.hs view
@@ -45,7 +45,7 @@ import Crypto.Random import Crypto.Util import Crypto.CPoly-import System.Crypto.Random (getEntropy)+import System.Entropy (getEntropy) import Control.Monad (liftM, forM_) import Data.List (genericDrop) import Data.Word (Word8)
Crypto/Random.hs view
@@ -31,7 +31,7 @@ , SystemRandom ) where -import System.Crypto.Random+import System.Entropy import Crypto.Types import Control.Monad (liftM) import qualified Data.ByteString as B
System/Crypto/Random.hs view
@@ -8,149 +8,7 @@ though testing was requested from the community - please e-mail the maintainer with test results. -} -module System.Crypto.Random - ( getEntropy- , CryptHandle- , openHandle- , hGetEntropy- , closeHandle- ) where--import System.IO (openFile, hClose, IOMode(..), Handle)-import Control.Monad (liftM)-import Data.ByteString as B-import Data.ByteString.Lazy as L-import Crypto.Types--#if defined(isWindows)-{- C example for windows rng - taken from a blog, can't recall which one but thank you!- #include <Windows.h>- #include <Wincrypt.h>- ...- //- // DISCLAIMER: Don't forget to check your error codes!!- // I am not checking as to make the example simple...- //- HCRYPTPROV hCryptCtx = NULL;- BYTE randomArray[128];-- CryptAcquireContext(&hCryptCtx, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);- CryptGenRandom(hCryptCtx, 128, randomArray);- CryptReleaseContext(hCryptCtx, 0);--}--import Data.ByteString.Internal as B-import Data.Int (Int32)-import Data.Word (Word32, Word8)-import Foreign.C.String (CString, withCString)-import Foreign.Ptr (Ptr, nullPtr)-import Foreign.Marshal.Alloc (alloca)-import Foreign.Marshal.Utils (toBool)-import Foreign.Storable (peek)--newtype CryptHandle = CH Word32---- Define the constants we need from WinCrypt.h -msDefProv :: String-msDefProv = "Microsoft Base Cryptographic Provider v1.0"-provRSAFull :: Word32-provRSAFull = fromIntegral 1-cryptVerifyContext :: Word32-cryptVerifyContext = fromIntegral 0xF0000000---- Declare the required CryptoAPI imports -foreign import stdcall unsafe "CryptAcquireContextA"- c_cryptAcquireCtx :: Ptr Word32 -> CString -> CString -> Word32 -> Word32 -> IO Int32-foreign import stdcall unsafe "CryptGenRandom"- c_cryptGenRandom :: Word32 -> Word32 -> Ptr Word8 -> IO Int32-foreign import stdcall unsafe "CryptReleaseContext"- c_cryptReleaseCtx :: Word32 -> Word32 -> IO Int32--cryptAcquireCtx :: IO Word32-cryptAcquireCtx = - alloca $ \handlePtr -> - withCString msDefProv $ \provName -> do- stat <- c_cryptAcquireCtx handlePtr nullPtr provName (fromIntegral 1) (fromIntegral cryptVerifyContext)- if (toBool stat)- then peek handlePtr- else fail "c_cryptAcquireCtx"--cryptGenRandom :: Word32 -> Int -> IO B.ByteString-cryptGenRandom h i = - B.create i $ \c_buffer -> do- stat <- c_cryptGenRandom (fromIntegral h) (fromIntegral i) c_buffer- if (toBool stat)- then return ()- else fail "c_cryptGenRandom"--cryptReleaseCtx :: Word32 -> IO ()-cryptReleaseCtx h = do- stat <- c_cryptReleaseCtx h 0- if (toBool stat)- then return ()- else fail "c_cryptReleaseCtx"---- |Inefficiently get a specific number of bytes of cryptographically--- secure random data using the system-specific facilities.------ This function will return zero bytes--- on platforms without a secure RNG!-getEntropy :: ByteLength -> IO B.ByteString-getEntropy n = do- h <- cryptAcquireCtx- bs <- cryptGenRandom h n- let !bs' = bs- cryptReleaseCtx h- return bs'---- |Open a handle from which random data can be read-openHandle :: IO CryptHandle-openHandle = liftM CH cryptAcquireCtx---- |Close the `CryptHandle`-closeHandle (CH h) = cryptReleaseCtx h---- |Read from `CryptHandle`-hGetEntropy :: CryptHandle -> Int -> IO B.ByteString -hGetEntropy (CH h) = cryptGenRandom h--#else--- |Handle for manual resource mangement-newtype CryptHandle = CH Handle---- |Open a `CryptHandle`-openHandle :: IO CryptHandle-openHandle = liftM CH (openFile "/dev/urandom" ReadMode)---- |Close the `CryptHandle`-closeHandle :: CryptHandle -> IO ()-closeHandle (CH h) = hClose h---- |Read random data from a `CryptHandle`-hGetEntropy :: CryptHandle -> Int -> IO B.ByteString -hGetEntropy (CH h) = B.hGet h---- |Inefficiently get a specific number of bytes of cryptographically--- secure random data using the system-specific facilities.------ Use '/dev/urandom' on *nix and CryptAPI when on Windows.-getEntropy :: ByteLength -> IO B.ByteString-getEntropy = getEnt "/dev/urandom"---- "getTrueEntropy" was a thought, but if you are so security sensitive as to--- know you want /dev/random then you should be concerned about--- the platform you sit on, thus writing non-portable code--- reading /dev/random yourself is a non-issue.------ getTrueEntropy :: ByteLength -> IO B.ByteString--- getTrueEntropy = getEnt "/dev/random"--getEnt :: FilePath -> ByteLength -> IO B.ByteString-getEnt file n = do- h <- openFile file ReadMode- bs <- B.hGet h n- let !bs' = bs- hClose h- return bs'-#endif+module System.Crypto.Random {-# DEPRECATED "Use the 'entropy' package module System.Entropy instead" #-}+ (module System.Entropy) where +import System.Entropy
crypto-api.cabal view
@@ -1,5 +1,5 @@ name: crypto-api-version: 0.6.2.1+version: 0.6.3 license: BSD3 license-file: LICENSE copyright: Thomas DuBuisson <thomas.dubuisson@gmail.com>, Francisco Blas Izquierdo Riera (klondike) (see AUTHORS)@@ -53,14 +53,11 @@ bytestring >= 0.9 && < 0.10, cereal >= 0.2 && < 0.4, tagged >= 0.1 && < 0.3,- largeword >= 1.0.0, array+ largeword >= 1.0.0, array, entropy ghc-options: -O2 hs-source-dirs:- exposed-modules: Crypto.Classes, Crypto.Types, Crypto.HMAC, Crypto.Modes, System.Crypto.Random, Crypto.Random, Crypto.Padding+ exposed-modules: Crypto.Classes, Crypto.Types, Crypto.HMAC, Crypto.Modes, Crypto.Random, Crypto.Padding, System.Crypto.Random other-modules: Crypto.Util, Crypto.CPoly- if os(windows)- cpp-options: -DisWindows- extra-libraries: advapi32 if flag(tests) exposed-modules: Test.Crypto, Test.AES, Test.SHA, Test.HMAC, Test.ParseNistKATs, Test.TwoFish build-depends: QuickCheck >= 2.3 && < 2.4, directory >= 1.0.1.0 && < 1.2, filepath