module Ciphers ( propertyBulkFunctional ) where import Control.Applicative ((<$>), (<*>)) import Test.QuickCheck import qualified Data.ByteString as B import Network.TLS.Cipher import Network.TLS.Extra.Cipher arbitraryKey :: Bulk -> Gen B.ByteString arbitraryKey bulk = B.pack `fmap` vector (fromIntegral $ bulkKeySize bulk) arbitraryIV :: Bulk -> Gen B.ByteString arbitraryIV bulk = B.pack `fmap` vector (fromIntegral $ bulkIVSize bulk) arbitraryText :: Bulk -> Gen B.ByteString arbitraryText bulk = B.pack `fmap` vector (fromIntegral $ bulkBlockSize bulk) data BulkTest = BulkTest Bulk B.ByteString B.ByteString B.ByteString deriving (Show,Eq) instance Arbitrary BulkTest where arbitrary = do bulk <- cipherBulk `fmap` elements ciphersuite_all BulkTest bulk <$> arbitraryKey bulk <*> arbitraryIV bulk <*> arbitraryText bulk propertyBulkFunctional :: BulkTest -> Bool propertyBulkFunctional (BulkTest bulk key iv t) = case bulkF bulk of BulkBlockF enc dec -> block enc dec BulkStreamF ktoi enc dec -> stream ktoi enc dec where block e d = (d key iv . e key iv) t == t stream ktoi e d = (fst . d siv . fst . e siv) t == t where siv = ktoi key