packages feed

hwormhole-0.1.0.0: tests/CryptoTests.hs

-- | Crypto module tests
module CryptoTests
  ( cryptoRoundTripTests
  ) where

import Protolude

import Hedgehog (forAll, property, (===), failure, Property, Group(..), checkSequential)

import qualified Transit.Internal.Crypto as C
import qualified Crypto.Saltine.Class as Saltine
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import qualified Generator

prop_roundTrip :: Property
prop_roundTrip = property $ do
  purpose <- forAll Generator.purposeGen
  secret <- forAll $ Gen.bytes (Range.singleton 32)
  nonceBytes <- forAll Generator.nonceBytesGen
  let nonce = fromMaybe (panic "cannot decode nonce") $ Saltine.decode nonceBytes
  let secret' = fromMaybe (panic "cannot decode secret") $ Saltine.decode secret
  let key = C.deriveKeyFromPurpose purpose secret'
  let key' = fromMaybe (panic "cannot decode key") $ Saltine.decode key
  plaintext <- forAll $ Gen.bytes (Range.linear 1 256)
  let result = C.encrypt key' nonce (C.PlainText plaintext) >>= C.decrypt key'
  case result of
    Right (pt, _) -> pt === C.PlainText plaintext
    Left _ -> failure

cryptoRoundTripTests :: IO Bool
cryptoRoundTripTests =
  checkSequential $ Group "Crypto"
  [ ("encrypt decrypt roundtrip", prop_roundTrip)
  ]