content: {-# LANGUAGE FlexibleContexts #-}
  
  -- | The interface for a stream cipher. For stream ciphers, both
  -- encrypt and decrypt are same. One of the advantage of stream cipher
  -- is that it allows rewinding/advancing the stream before encrypting
  -- and decryption. This interface also supports such
  -- rewinding/advancing.
  module Interface( Cipher
                  , encrypt
                  , decrypt
                  , encryptAt
                  , decryptAt
                  , name
                  , description
                  ) where
  
  import           Data.ByteString
  import           System.IO.Unsafe ( unsafePerformIO )
  
  import           Raaz.Core
  import           Implementation
  
  import qualified Utils as U
  
  type Cipher = Implementation.Prim
  
  -- | Encrypt using the cipher.
  encrypt :: Key Prim     -- ^ The key for the stream cipher
          -> Nounce Prim  -- ^ The nounce used by the stream cipher.
          -> ByteString   -- ^ The bytestring to process
          -> ByteString
  encrypt key nounce = encryptAt key nounce mempty
  
  -- | Same as encrypt but first advances so many blocks.
  encryptAt :: Key Prim
            -> Nounce Prim
            -> BlockCount Prim
            -> ByteString
            -> ByteString
  encryptAt key nounce blk bs = unsafePerformIO $ withMemory $ \ mem -> do
    initialise key mem
    initialise nounce mem
    initialise blk mem
    U.transform bs mem
  
  -- | Same as decrypt but first advance so many blocks.
  decryptAt :: Key Prim
            -> Nounce Prim
            -> BlockCount Prim
            -> ByteString
            -> ByteString
  decryptAt = encryptAt
  
  -- | Decrypt using the cipher. Since we are concerned with stream
  -- ciphers both encrypt and decrypt are the same.
  decrypt :: Key Prim
          -> Nounce Prim
          -> ByteString
          -> ByteString
  decrypt = encrypt
  