ppad-hmac-drbg 0.3.0 → 0.3.1
raw patch · 5 files changed
+41/−7 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Crypto.DRBG.HMAC.SHA256: _read_k :: PrimMonad m => DRBG (PrimState m) -> m ByteString
- Crypto.DRBG.HMAC.SHA256: _read_v :: PrimMonad m => DRBG (PrimState m) -> m ByteString
- Crypto.DRBG.HMAC.SHA512: _read_k :: PrimMonad m => DRBG (PrimState m) -> m ByteString
- Crypto.DRBG.HMAC.SHA512: _read_v :: PrimMonad m => DRBG (PrimState m) -> m ByteString
Files
- CHANGELOG +3/−0
- bench/Weight.hs +0/−3
- lib/Crypto/DRBG/HMAC/SHA256.hs +20/−3
- lib/Crypto/DRBG/HMAC/SHA512.hs +17/−0
- ppad-hmac-drbg.cabal +1/−1
CHANGELOG view
@@ -1,5 +1,8 @@ # Changelog +- 0.3.1 (2026-02-01)+ * Adds SPECIALIZE pragmas for IO and ST to improve the generated Core.+ - 0.3.0 (2026-02-01) * This backwards-incompatible version changes the "bring your own HMAC function" design and simply provides specialized DRBGs for
bench/Weight.hs view
@@ -22,9 +22,6 @@ instance NFData (DRBG512.DRBG s) where rnf d = d `seq` () -instance NFData DRBG512.Error where- rnf e = e `seq` ()- main :: IO () main = do !drbg256 <- DRBG256.new mempty mempty mempty
lib/Crypto/DRBG/HMAC/SHA256.hs view
@@ -1,10 +1,11 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE UnboxedTuples #-} -- |--- Module: Crypto.DRBG.HMAC+-- Module: Crypto.DRBG.HMAC.SHA256 -- Copyright: (c) 2024 Jared Tobin -- License: MIT -- Maintainer: Jared Tobin <jared@ppad.tech>@@ -33,6 +34,8 @@ import Crypto.Hash.SHA256.Internal (Registers(..)) import qualified Crypto.Hash.SHA256.Internal as SHA256 (cat) import Control.Monad.Primitive (PrimMonad, PrimState)+import Control.Monad.ST (ST)+import GHC.Exts (RealWorld) import qualified Control.Monad.Primitive as Prim (unsafeIOToPrim) import Data.Bits ((.<<.), (.>>.), (.|.)) import qualified Data.ByteString as BS@@ -87,6 +90,10 @@ update drbg (entropy <> nonce <> ps) pure $! DRBG drbg {-# INLINABLE new #-}+{-# SPECIALIZE new+ :: BS.ByteString -> BS.ByteString -> BS.ByteString -> IO (DRBG RealWorld) #-}+{-# SPECIALIZE new+ :: BS.ByteString -> BS.ByteString -> BS.ByteString -> ST s (DRBG s) #-} -- | Reseed a DRBG. --@@ -160,13 +167,19 @@ !(GHC.Word.W32# v05) <- PA.readPrimArray drbg 15 !(GHC.Word.W32# v06) <- PA.readPrimArray drbg 16 !(GHC.Word.W32# v07) <- PA.readPrimArray drbg 17- let !k0 = Registers (# k00, k01, k02, k03, k04, k05, k06, k07 #)- !v0 = Registers (# v00, v01, v02, v03, v04, v05, v06, v07 #)+ let !k0 = Registers (# k00, k01, k02, k03, k04, k05, k06, k07 #)+ !v0 = Registers (# v00, v01, v02, v03, v04, v05, v06, v07 #) !res <- gen_loop drbg k0 v0 bytes update drbg addl write_counter drbg (ctr + 1) pure $! Right res {-# INLINABLE gen #-}+{-# SPECIALIZE gen+ :: DRBG RealWorld -> BS.ByteString -> Word64+ -> IO (Either Error BS.ByteString) #-}+{-# SPECIALIZE gen+ :: DRBG s -> BS.ByteString -> Word64+ -> ST s (Either Error BS.ByteString) #-} -- | Wipe the state of a DRBG. --@@ -287,6 +300,10 @@ let !k2 = Registers (# k20, k21, k22, k23, k24, k25, k26, k27 #) Prim.unsafeIOToPrim $ SHA256._hmac_rr vp sp k2 v1 {-# INLINABLE update #-}+{-# SPECIALIZE update+ :: PA.MutablePrimArray RealWorld Word32 -> BS.ByteString -> IO () #-}+{-# SPECIALIZE update+ :: PA.MutablePrimArray s Word32 -> BS.ByteString -> ST s () #-} init_counter :: PrimMonad m
lib/Crypto/DRBG/HMAC/SHA512.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE PatternSynonyms #-}@@ -33,6 +34,8 @@ import Crypto.Hash.SHA512.Internal (Registers(..)) import qualified Crypto.Hash.SHA512.Internal as SHA512 (cat) import Control.Monad.Primitive (PrimMonad, PrimState)+import Control.Monad.ST (ST)+import GHC.Exts (RealWorld) import qualified Control.Monad.Primitive as Prim (unsafeIOToPrim) import qualified Data.ByteString as BS import qualified Data.ByteString.Builder as BSB@@ -87,6 +90,10 @@ update drbg (entropy <> nonce <> ps) pure $! DRBG drbg {-# INLINABLE new #-}+{-# SPECIALIZE new+ :: BS.ByteString -> BS.ByteString -> BS.ByteString -> IO (DRBG RealWorld) #-}+{-# SPECIALIZE new+ :: BS.ByteString -> BS.ByteString -> BS.ByteString -> ST s (DRBG s) #-} -- | Reseed a DRBG. --@@ -167,6 +174,12 @@ write_counter drbg (ctr + 1) pure $! Right res {-# INLINABLE gen #-}+{-# SPECIALIZE gen+ :: DRBG RealWorld -> BS.ByteString -> Word64+ -> IO (Either Error BS.ByteString) #-}+{-# SPECIALIZE gen+ :: DRBG s -> BS.ByteString -> Word64+ -> ST s (Either Error BS.ByteString) #-} -- | Wipe the state of a DRBG. --@@ -282,6 +295,10 @@ let !k2 = Registers (# k20, k21, k22, k23, k24, k25, k26, k27 #) Prim.unsafeIOToPrim $ SHA512._hmac_rr vp sp k2 v1 {-# INLINABLE update #-}+{-# SPECIALIZE update+ :: PA.MutablePrimArray RealWorld Word64 -> BS.ByteString -> IO () #-}+{-# SPECIALIZE update+ :: PA.MutablePrimArray s Word64 -> BS.ByteString -> ST s () #-} init_counter :: PrimMonad m
ppad-hmac-drbg.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: ppad-hmac-drbg-version: 0.3.0+version: 0.3.1 synopsis: HMAC-based deterministic random bit generator license: MIT license-file: LICENSE