packages feed

haskell-tor-0.1.2: test/Test/HybridEncrypt.hs

{-# LANGUAGE CPP #-}
module Test.HybridEncrypt(hybridEncryptionTest)
 where

#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
import Crypto.PubKey.RSA
import Control.Applicative
import Control.Monad
import Crypto.Random
import Data.ByteString(ByteString,pack)
import qualified Data.ByteString as BS
import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck
import Test.Standard
import Tor.State.Credentials
import Tor.HybridCrypto

data InputValues = Input PublicKey PrivateKey ByteString ChaChaDRG

instance Eq InputValues where
  (Input pub priv bstr _) == (Input pub' priv' bstr' _) =
    (pub == pub') && (priv == priv') && (bstr == bstr')

instance Show InputValues where
  show (Input pub priv bstr _) =
    "Input " ++ show pub ++ " " ++ show priv ++ " " ++ show bstr

instance Arbitrary InputValues where
  arbitrary = do g <- arbitraryRNG
                 let (pub, priv, g') = generateKeyPair g 1024
                 len <- choose (0, 2048)
                 msg <- pack <$> replicateM len arbitrary
                 return (Input pub priv msg g')

prop_hybridEncWorks :: Bool -> InputValues -> Property
prop_hybridEncWorks force (Input pub priv m g) =
  (not force || (BS.length m > 70)) ==>
    let (m', _) = withDRG g (do em <- hybridEncrypt force pub m
                                hybridDecrypt priv em)
    in m == m'

hybridEncryptionTest :: Test
hybridEncryptionTest =
  testGroup "Hybrid encryption tests" [
    testProperty "Hybrid encryption works when forced"
                 (prop_hybridEncWorks True)
  , testProperty "Hybrid encryption works in general"
                 (prop_hybridEncWorks False)
  ]