packages feed

longshot-0.1.0.4: test/Spec.hs

import           Test.Tasty
import           Test.Tasty.QuickCheck
import           Test.Tasty.HUnit
import           Control.Monad
import qualified Data.ByteString.Char8         as C
import qualified Data.ByteString.Base16        as H
import           Crypto.Longshot.Internal
import           Crypto.Longshot.Hasher

main :: IO ()
main = defaultMain tests

-- | Search Length limit
-- The key length was limited to 4 as it takes a long time to test
limit :: Int
limit = 4

-- | Characters prepared for test
chars :: String
chars = "0123456789abcdef~'*+-%^?[]/"

-- | Hash algorithms available
hashers :: [String]
hashers =
  [ "md5"
  , "sha1"
  , "ripemd160"
  , "whirlpool"
  , "sha256"
  , "sha3_256"
  , "sha3_384"
  , "sha3_512"
  , "blake2s_256"
  , "blake2b_256"
  , "blake2b_384"
  , "blake2b_512"
  , "blake3_256"
  , "blake3_384"
  , "blake3_512"
  , "keccak_256"
  , "keccak_384"
  , "keccak_512"
  , "skein_256"
  , "skein_384"
  , "skein_512"
  ]

-- | Test for { strict | deep } mode of Brute-force search
testLongshot :: String -> String -> Gen Bool
testLongshot mode algo = do
  size <- choose (1, limit) :: Gen Int
  key  <- replicateM size (elements chars :: Gen Char)
  let hasher = getHasher algo
  let hex    = C.unpack . H.encode . hasher . C.pack $ key
  let solver | mode == "strict" = bruteforce size
             | otherwise        = bruteforceDeep
  let found = solver chars hex hasher
  case found of
    Just x | x == key -> return True
    _                 -> return False

-- | Property test generator
genTestProp
  :: (String -> String -> Gen Bool) -> String -> String -> String -> TestTree
genTestProp f mode desc algo = testProperty (desc <> algo) (f mode algo)

-- | Main test of properties
tests :: TestTree
tests = testGroup
  "Longshot Tests"
  [ testGroup
    "Strict-Longshot search"
    (genTestProp testLongshot "strict" "Strict longshot with " <$> hashers)
  , testGroup
    "Deep-Longshot search"
    (genTestProp testLongshot "deep" "Deep longshot with " <$> hashers)
  ]