raaz-0.1.0: Raaz/Cipher/ChaCha20/Implementation/Vector128.hs
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Raaz.Cipher.ChaCha20.Implementation.Vector128
( implementation
) where
import Control.Monad.IO.Class ( liftIO )
import Foreign.Ptr ( Ptr )
import Raaz.Core
import Raaz.Cipher.Internal
import Raaz.Cipher.ChaCha20.Internal
implementation :: SomeCipherI ChaCha20
implementation = SomeCipherI chacha20Vector
-- | Chacha20 block transformation.
foreign import ccall unsafe "raazChaCha20BlockVector"
c_chacha20_block :: Pointer -- Message
-> Int -- number of blocks
-> Ptr KEY -- key
-> Ptr IV -- iv
-> Ptr Counter -- Counter value
-> IO ()
chacha20Block :: Pointer -> BLOCKS ChaCha20 -> MT ChaCha20Mem ()
chacha20Block msgPtr nblocks = do keyPtr <- onSubMemory keyCell getCellPointer
ivPtr <- onSubMemory ivCell getCellPointer
ctrPtr <- onSubMemory counterCell getCellPointer
liftIO $ c_chacha20_block msgPtr (fromEnum nblocks) keyPtr ivPtr ctrPtr
chacha20Vector :: CipherI ChaCha20 ChaCha20Mem ChaCha20Mem
chacha20Vector = makeCipherI
"chacha20-vector-128"
"Implementation of the chacha20 stream cipher using the gcc's vector instructions"
chacha20Block
16