diff --git a/cardano-crypto-class/src/Cardano/Crypto/KES/Class.hs b/cardano-crypto-class/src/Cardano/Crypto/KES/Class.hs index 57de0c207..242c03d55 100644 --- a/cardano-crypto-class/src/Cardano/Crypto/KES/Class.hs +++ b/cardano-crypto-class/src/Cardano/Crypto/KES/Class.hs @@ -24,6 +24,10 @@ module Cardano.Crypto.KES.Class , OptimizedKESAlgorithm (..) , verifyOptimizedKES + -- * 'SignKeyWithPeriodKES' wrapper + , SignKeyWithPeriodKES (..) + , updateKESWithPeriod + -- * 'SignedKES' wrapper , SignedKES (..) , signedKES @@ -77,6 +81,7 @@ import GHC.TypeLits (Nat, KnownNat, natVal, TypeError, ErrorMessage (..)) import NoThunks.Class (NoThunks) import Control.Monad.Class.MonadST (MonadST) import Control.Monad.Class.MonadThrow (MonadThrow) +import Control.Monad.Trans.Maybe (MaybeT (..), runMaybeT) import Cardano.Binary (Decoder, decodeBytes, Encoding, encodeBytes, Size, withWordSize) @@ -447,6 +452,30 @@ encodeSignedKES (SignedKES s) = encodeSigKES s decodeSignedKES :: KESAlgorithm v => Decoder s (SignedKES v a) decodeSignedKES = SignedKES <$> decodeSigKES +-- | A sign key bundled with its associated period. +data SignKeyWithPeriodKES v = + SignKeyWithPeriodKES + { skWithoutPeriodKES :: !(SignKeyKES v) + , periodKES :: !Period + } + deriving (Generic) + +deriving instance (KESAlgorithm v, Eq (SignKeyKES v)) => Eq (SignKeyWithPeriodKES v) + +deriving instance (KESAlgorithm v, Show (SignKeyKES v)) => Show (SignKeyWithPeriodKES v) + +instance KESAlgorithm v => NoThunks (SignKeyWithPeriodKES v) + -- use generic instance + +updateKESWithPeriod + :: (KESAlgorithm v, MonadST m, MonadThrow m) + => ContextKES v + -> SignKeyWithPeriodKES v + -> m (Maybe (SignKeyWithPeriodKES v)) +updateKESWithPeriod c (SignKeyWithPeriodKES sk t) = runMaybeT $ do + sk' <- MaybeT $ updateKES c sk t + return $ SignKeyWithPeriodKES sk' (succ t) + -- -- 'Size' expressions for 'ToCBOR' instances. --