packages feed

cacophony-0.4.0: tests/SymmetricState.hs

{-# LANGUAGE OverloadedStrings #-}
module SymmetricState where

import Imports
import Instances()

import Control.Monad.State (runState, state)

import Crypto.Noise.Cipher
import Crypto.Noise.Cipher.ChaChaPoly1305
import Crypto.Noise.Hash.SHA256
import Crypto.Noise.Internal.SymmetricState
import Crypto.Noise.Types

shs :: SymmetricState ChaChaPoly1305 SHA256
shs = symmetricState $ bsToSB' "handshake name"

roundTripProp :: Plaintext -> Property
roundTripProp pt = (decrypt . encrypt) pt === pt
  where
    encrypt p = encryptAndHash p shs
    decrypt (ct, _) = fst $ decryptAndHash (cipherBytesToText ct) shs

manyRoundTripsProp :: [Plaintext] -> Property
manyRoundTripsProp pts = (fst . manyDecrypts . manyEncrypts) pts === pts
  where
    encrypt = encryptAndHash
    decrypt = decryptAndHash . cipherBytesToText
    doMany f xs = runState . mapM (state . f) $ xs
    manyEncrypts xs = doMany encrypt xs shs
    manyDecrypts (cts, _) = doMany decrypt cts shs

tests :: TestTree
tests = testGroup "SymmetricState"
  [ testProperty "ChaChaPoly1305 one roundtrip" $ property roundTripProp
  , testProperty "ChaChaPoly1305 many roundtrips" $ property manyRoundTripsProp
  ]