module Main(main) where
import Data.Bits
import Data.Cipher
import Data.LargeWord
import Codec.Encryption.Twofish
import Test.HUnit
tfTest128 :: Test
tfTest128 = tfTest (\k b -> b)
(0 :: Word128)
(0x21f9527982aa147e98c63345a524a7bc :: Word128)
48
tfTest192 :: Test
tfTest192 = tfTest (\k b -> (fromIntegral b) .|. (k `shiftL` 128))
(0 :: Word192)
(0x4109640a86bd90a3f4f9ee2b214954e7 :: Word128)
50
tfTest256 :: Test
tfTest256 = tfTest (\k b -> (fromIntegral b) .|. (k `shiftL` 128))
(0 :: Word256)
(0x05a2973bc3f4ddf57561f61cff26fe37)
50
-- |Test Twofish using the given test vectors in the Twofish
-- paper: a 128/192/256 bit key consisting of all zeroes, an
-- initial block consisting of all zeroes, and a known
-- final cipher text after 48 rounds
tfTest :: (Key a) => (a -> Word128 -> a) -> a -> Word128 -> Int -> Test
tfTest f k o r = TestCase $ assertEqual ("Key Size: " ++ (show (bitSize k)))
o
$ run k 0 1
where run key block n
| n < r = let c = encrypt (mkStdCipher key) block
in run (f key block) c (n + 1)
| otherwise = block
main = runTestTT $ TestList [tfTest128, tfTest192, tfTest256]