raaz-0.3.0: implementation/ChaCha20/CHandWritten.hs
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE DataKinds #-}
-- | The portable C-implementation of Blake2b.
module ChaCha20.CHandWritten where
import Raaz.Core
import Raaz.Core.Types.Internal
import Raaz.Primitive.ChaCha20.Internal
name :: String
name = "chacha20-c-handwritten"
description :: String
description = "Hand written ChaCha20 Implementation using portable C"
type Prim = ChaCha20
type Internals = ChaCha20Mem
type BufferAlignment = 32
type BufferPtr = AlignedBlockPtr BufferAlignment Prim
additionalBlocks :: BlockCount ChaCha20
additionalBlocks = blocksOf 1 Proxy
------------------------ The foreign function calls ---------------------
-- | Chacha20 block transformation.
foreign import ccall unsafe
"raaz/cipher/chacha20/cportable.h raazChaCha20Block"
c_chacha20_block :: BufferPtr -- message
-> BlockCount ChaCha20 -- number of blocks
-> Ptr (Key ChaCha20) -- key
-> Ptr (Nounce ChaCha20) -- iv
-> Ptr (WordType ChaCha20)
-> IO ()
processBlocks :: BufferPtr
-> BlockCount Prim
-> Internals
-> IO ()
processBlocks buf blks mem =
let keyPtr = keyCellPtr mem
ivPtr = ivCellPtr mem
counterPtr = counterCellPtr mem
in c_chacha20_block buf blks keyPtr ivPtr counterPtr
-- | Process the last bytes.
processLast :: BufferPtr
-> BYTES Int
-> Internals
-> IO ()
processLast buf = processBlocks buf . atLeast
-- | The number of blocks of the cipher that is generated in one go
-- encoded as a type level nat.
type RandomBufferSize = 16
-- | How many blocks of the primitive to generated before re-seeding.
reseedAfter :: BlockCount Prim
reseedAfter = blocksOf (1024 * 1024 * 1024) (Proxy :: Proxy Prim)
randomBlocks :: BufferPtr
-> BlockCount Prim
-> Internals
-> IO ()
randomBlocks = processBlocks