packages feed

botan-low-0.0.1.0: test/Botan/Low/BlockCipherSpec.hs

module Main where

import Test.Prelude

import qualified Data.ByteString.Char8 as Char8
import qualified Data.ByteString as ByteString

import Botan.Low.BlockCipher
import Botan.Low.RNG

message = "Fee fi fo fum! I smell the blood of an Englishman!"

main :: IO ()
main = hspec $ testSuite allBlockCiphers chars $ \ bc -> do
    it "can initialize a block cipher context" $ do
        ctx <- blockCipherInit bc
        pass
    it "has a name" $ do
        ctx <- blockCipherInit bc
        name <- blockCipherName ctx
        -- name `shouldBe` bc -- Name expands to include default parameters - need to record
        pass
    it "has a key spec" $ do
        ctx <- blockCipherInit bc
        (_,_,_) <- blockCipherGetKeyspec ctx
        pass
    it "has a block size" $ do
        ctx <- blockCipherInit bc
        _ <- blockCipherBlockSize ctx
        pass
    it "can set the key" $ do
        ctx <- blockCipherInit bc
        (_,mx,_) <- blockCipherGetKeyspec ctx
        k <- systemRNGGet mx
        blockCipherSetKey ctx k
        pass
    it "can encipher a message" $ do
        ctx <- blockCipherInit bc
        (_,mx,_) <- blockCipherGetKeyspec ctx
        k <- systemRNGGet mx
        blockCipherSetKey ctx k
        bsz <- blockCipherBlockSize ctx
        msg <- systemRNGGet $ bsz * 10
        encmsg <- blockCipherEncryptBlocks ctx msg
        pass
    -- NOTE: It does not actually throw an error - this is slightly concerning.
    -- it "can only encipher messages that are a multiple of the block size" $ do
    --     ctx <- blockCipherInitName bc
    --     bsz <- blockCipherBlockSize ctx
    --     if bsz == 1
    --         then pass
    --         else do
    --             (_,mx,_) <- blockCipherGetKeyspec ctx
    --             k <- systemRNGGetIO mx
    --             blockCipherSetKey ctx k
    --             msg <- systemRNGGetIO $ bsz + 1
    --             blockCipherEncryptBlocks ctx msg `shouldThrow` anyBotanException
    it "can decipher an enciphered message" $ do
        ctx <- blockCipherInit bc
        (_,mx,_) <- blockCipherGetKeyspec ctx
        k <- systemRNGGet mx
        blockCipherSetKey ctx k
        bsz <- blockCipherBlockSize ctx
        msg <- systemRNGGet $ bsz * 10
        encmsg <- blockCipherEncryptBlocks ctx msg
        decmsg <- blockCipherDecryptBlocks ctx encmsg
        decmsg `shouldBe` msg 
        pass