hmac-drbg

Pure Haskell HMAC-DRBG (docs.ppad.tech/hmac-drbg).
git clone git://git.ppad.tech/hmac-drbg.git
Log | Files | Refs | README | LICENSE

commit de2e199b2f48e3e10fb804a89fabde63163bd12c
parent 41529155f1d85720234136978ab4e5313b472bcc
Author: Jared Tobin <jared@jtobin.io>
Date:   Sun,  1 Feb 2026 15:41:18 +0400

lib: add internal module

Diffstat:
Alib/Crypto/DRBG/HMAC/Internal.hs | 33+++++++++++++++++++++++++++++++++
Mlib/Crypto/DRBG/HMAC/SHA256.hs | 14++------------
Mlib/Crypto/DRBG/HMAC/SHA512.hs | 14++------------
Mppad-hmac-drbg.cabal | 3++-
4 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/lib/Crypto/DRBG/HMAC/Internal.hs b/lib/Crypto/DRBG/HMAC/Internal.hs @@ -0,0 +1,33 @@ +{-# OPTIONS_HADDOCK hide #-} + +-- | +-- Module: Crypto.DRBG.HMAC.Internal +-- Copyright: (c) 2024 Jared Tobin +-- License: MIT +-- Maintainer: Jared Tobin <jared@ppad.tech> +-- +-- Internal HMAC-DRBG definitions. + +module Crypto.DRBG.HMAC.Internal ( + Error(..) + , _RESEED_COUNTER + , _MAX_BYTES + ) where + +import Data.Word (Word64) + +-- | A DRBG error. +data Error = + MaxBytesExceeded -- ^ More than 65536 bytes have been requested. + | ReseedRequired -- ^ The DRBG must be reseeded (via 'reseed'). + deriving (Eq, Show) + +-- see SP 800-90A table 2 +_RESEED_COUNTER :: Word64 +_RESEED_COUNTER = (2 :: Word64) ^ (48 :: Word64) +{-# INLINE _RESEED_COUNTER #-} + +-- see SP 800-90A table 2 +_MAX_BYTES :: Word64 +_MAX_BYTES = 0x10000 +{-# INLINE _MAX_BYTES #-} diff --git a/lib/Crypto/DRBG/HMAC/SHA256.hs b/lib/Crypto/DRBG/HMAC/SHA256.hs @@ -28,6 +28,7 @@ module Crypto.DRBG.HMAC.SHA256 ( , _read_k ) where +import Crypto.DRBG.HMAC.Internal (Error(..), _RESEED_COUNTER, _MAX_BYTES) import qualified Crypto.Hash.SHA256 as SHA256 import Crypto.Hash.SHA256.Internal (Registers(..)) import qualified Crypto.Hash.SHA256.Internal as SHA256 (cat) @@ -44,17 +45,6 @@ import qualified Foreign.Ptr as FP -- api ------------------------------------------------------------------------ --- | A DRBG error. -data Error = - MaxBytesExceeded -- ^ More than 65536 bytes have been requested. - | ReseedRequired -- ^ The DRBG must be reseeded (via 'reseed'). - deriving (Eq, Show) - --- see SP 800-90A table 2 -_RESEED_COUNTER :: Word64 -_RESEED_COUNTER = (2 :: Word64) ^ (48 :: Word64) -{-# NOINLINE _RESEED_COUNTER #-} - -- | A deterministic random bit generator (DRBG). -- -- Create a DRBG with 'new', and then use and reuse it to generate @@ -147,7 +137,7 @@ gen -> Word64 -> m (Either Error BS.ByteString) gen (DRBG drbg) addl@(BI.PS _ _ l) bytes - | bytes > 0x10000 = pure $! Left MaxBytesExceeded + | bytes > _MAX_BYTES = pure $! Left MaxBytesExceeded | otherwise = do ctr <- read_counter drbg if ctr > _RESEED_COUNTER diff --git a/lib/Crypto/DRBG/HMAC/SHA512.hs b/lib/Crypto/DRBG/HMAC/SHA512.hs @@ -28,6 +28,7 @@ module Crypto.DRBG.HMAC.SHA512 ( , _read_k ) where +import Crypto.DRBG.HMAC.Internal (Error(..), _RESEED_COUNTER, _MAX_BYTES) import qualified Crypto.Hash.SHA512 as SHA512 import Crypto.Hash.SHA512.Internal (Registers(..)) import qualified Crypto.Hash.SHA512.Internal as SHA512 (cat) @@ -43,17 +44,6 @@ import qualified Foreign.Ptr as FP -- api ------------------------------------------------------------------------ --- | A DRBG error. -data Error = - MaxBytesExceeded -- ^ More than 65536 bytes have been requested. - | ReseedRequired -- ^ The DRBG must be reseeded (via 'reseed'). - deriving (Eq, Show) - --- see SP 800-90A table 2 -_RESEED_COUNTER :: Word64 -_RESEED_COUNTER = (2 :: Word64) ^ (48 :: Word64) -{-# NOINLINE _RESEED_COUNTER #-} - -- | A deterministic random bit generator (DRBG). -- -- Create a DRBG with 'new', and then use and reuse it to generate @@ -147,7 +137,7 @@ gen -> Word64 -> m (Either Error BS.ByteString) gen (DRBG drbg) addl@(BI.PS _ _ l) bytes - | bytes > 0x10000 = pure $! Left MaxBytesExceeded + | bytes > _MAX_BYTES = pure $! Left MaxBytesExceeded | otherwise = do ctr <- read_counter drbg if ctr > _RESEED_COUNTER diff --git a/ppad-hmac-drbg.cabal b/ppad-hmac-drbg.cabal @@ -31,7 +31,8 @@ library if flag(llvm) ghc-options: -fllvm -O2 exposed-modules: - Crypto.DRBG.HMAC.SHA256 + Crypto.DRBG.HMAC.Internal + , Crypto.DRBG.HMAC.SHA256 , Crypto.DRBG.HMAC.SHA512 build-depends: base >= 4.9 && < 5