packages feed

cryptonite 0.3 → 0.4

raw patch · 4 files changed

+74/−2 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Crypto.Random: data SystemDRG
+ Crypto.Random: getSystemDRG :: IO SystemDRG

Files

CHANGELOG.md view
@@ -1,3 +1,8 @@+## 0.4++* Add a System DRG that represent a referentially transparent of evaluated bytes+  while using lazy evaluation for future entropy values.+ ## 0.3  * Allow drgNew to run in any MonadRandom, providing cascading initialization
Crypto/Random.hs view
@@ -9,7 +9,9 @@     (     -- * Deterministic instances       ChaChaDRG+    , SystemDRG     -- * Deterministic Random class+    , getSystemDRG     , drgNew     , drgNewTest     , withDRG@@ -22,7 +24,7 @@  import Crypto.Random.Types import Crypto.Random.ChaChaDRG-import Crypto.Random.Entropy+import Crypto.Random.SystemDRG import Data.ByteArray (ByteArray, ScrubbedBytes) import Crypto.Internal.Imports 
+ Crypto/Random/SystemDRG.hs view
@@ -0,0 +1,64 @@+-- |+-- Module      : Crypto.Random.SystemDRG+-- License     : BSD-style+-- Maintainer  : Vincent Hanquez <vincent@snarc.org>+-- Stability   : experimental+-- Portability : Good+--+{-# LANGUAGE BangPatterns #-}+module Crypto.Random.SystemDRG+    ( SystemDRG+    , getSystemDRG+    ) where++import           Crypto.Random.Types+import           Crypto.Random.Entropy.Unsafe+import           Crypto.Internal.Compat+import           Crypto.Internal.Imports+import           Data.ByteArray (ScrubbedBytes, ByteArray)+import           Data.Memory.PtrMethods as B (memCopy)+import           Data.Maybe (catMaybes)+import           Data.Tuple (swap)+import           Foreign.Ptr+import qualified Data.ByteArray as B+import           System.IO.Unsafe (unsafeInterleaveIO)++-- | A referentially transparent System representation of+-- the random evaluated out of the system.+--+-- Holding onto a specific DRG means that all the already+-- evaluated bytes will be consistently replayed.+--+-- There's no need to reseed this DRG, as only pure+-- entropy is represented here.+data SystemDRG = SystemDRG !Int [ScrubbedBytes]++instance DRG SystemDRG where+    randomBytesGenerate = generate++systemChunkSize :: Int+systemChunkSize = 256++-- | Grab one instance of the System DRG+getSystemDRG :: IO SystemDRG+getSystemDRG = do+    backends <- catMaybes `fmap` sequence supportedBackends+    let getNext = unsafeInterleaveIO $ do+            bs   <- B.alloc systemChunkSize (replenish systemChunkSize backends)+            more <- getNext+            return (bs:more)+    SystemDRG 0 <$> getNext++generate :: ByteArray output => Int -> SystemDRG -> (output, SystemDRG)+generate nbBytes (SystemDRG ofs sysChunks) = swap $ unsafeDoIO $ B.allocRet nbBytes $ loop ofs sysChunks nbBytes+  where loop currentOfs chunks 0 _ = return $! SystemDRG currentOfs chunks+        loop _          []     _ _ = error "SystemDRG: the impossible happened: empty chunk"+        loop currentOfs oChunks@(c:cs) n d = do+            let currentLeft = B.length c - currentOfs+                toCopy      = min n currentLeft+                nextOfs     = currentOfs + toCopy+                n'          = n - toCopy+            B.withByteArray c $ \src -> B.memCopy d (src `plusPtr` currentOfs) toCopy+            if nextOfs == B.length c+                then loop 0 cs n' (d `plusPtr` toCopy)+                else loop nextOfs oChunks n' (d `plusPtr` toCopy)
cryptonite.cabal view
@@ -1,5 +1,5 @@ Name:                cryptonite-Version:             0.3+Version:             0.4 Synopsis:            Cryptography Primitives sink Description:     A repository of cryptographic primitives.@@ -147,6 +147,7 @@                      Crypto.Random.Entropy.Source                      Crypto.Random.Entropy.Backend                      Crypto.Random.ChaChaDRG+                     Crypto.Random.SystemDRG                      Crypto.Random.Probabilistic                      Crypto.PubKey.Internal                      Crypto.PubKey.ElGamal