{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE CPP #-} -- | -- -- Module : indef:Implementation -- Copyright : (c) Piyush P Kurur, 2019 -- License : Apache-2.0 OR BSD-3-Clause -- Maintainer : Piyush P Kurur -- Stability : experimental -- -- This signature give the interface through which a cryptographic -- bulk primitive, like cryptographic hash or a cipher is -- implemented. The main interface is through the `processBlocks` -- which gives the method to process data that is multiples of its -- block size. The last chuck of data might not be a full multiple of -- blocks in which case the `processLast` takes care of handling -- it. Fast implementations involve other details like the alignment -- restriction on the input buffer and all that. We package all this -- in the following signature. signature Implementation where import Raaz.Core # if MIN_VERSION_base(4,13,0) import GHC.TypeLits # endif -- | Name of the implementation. name :: String -- | Description of the implementation. description :: String -- | The primitive for which the implementation is given data Prim -- | The internal memory used by the implementation. data Internals instance Primitive Prim instance Memory Internals # if MIN_VERSION_base(4,13,0) -- | The alignment requirements on the buffer. data BufferAlignment :: Nat instance KnownNat BufferAlignment # else -- | The alignment required for buffer (hack around bug -- https://ghc.haskell.org/trac/ghc/ticket/15138) type BufferAlignment = 32 #endif -- | The pointer type associated with the buffer used by the -- implementation. type BufferPtr = AlignedBlockPtr BufferAlignment Prim -- | The additional space other than the payload that required in the -- buffer for processing the data. There are multiple reasons for -- having this additional space. The most important case is for -- handling padding when processing the last block. Some fast -- implementations, particularly those which use SIMD instructions, -- handle data that is often a multiple of the block size. In such -- cases, it make sense to have additional blocks in such cases to -- make the overall implementation simple. additionalBlocks :: BlockCount Prim -- | The function that process bytes in multiples of the block size of -- the primitive. processBlocks :: BufferPtr -> BlockCount Prim -> Internals -> IO () -- | Process the last bytes of the stream. processLast :: BufferPtr -> BYTES Int -> Internals -> IO ()