import Test.Framework (defaultMain, testGroup, Test)
import Test.Framework.Providers.HUnit
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck
import Test.HUnit hiding (Test)
import Crypto.Random
import Data.Binary
import qualified Data.OpenPGP as OpenPGP
import qualified Data.OpenPGP.CryptoAPI as OpenPGP
import qualified Data.ByteString.Lazy as LZ
import qualified Data.ByteString.Lazy.UTF8 as LZ (fromString)
instance Arbitrary OpenPGP.HashAlgorithm where
arbitrary = elements [OpenPGP.MD5, OpenPGP.SHA1, OpenPGP.RIPEMD160, OpenPGP.SHA256, OpenPGP.SHA384, OpenPGP.SHA512, OpenPGP.SHA224]
testFingerprint :: FilePath -> String -> Assertion
testFingerprint fp kf = do
bs <- LZ.readFile $ "tests/data/" ++ fp
let (OpenPGP.Message [packet]) = decode bs
assertEqual ("for " ++ fp) kf (OpenPGP.fingerprint packet)
testVerifyMessage :: FilePath -> FilePath -> Assertion
testVerifyMessage keyring message = do
keys <- fmap decode $ LZ.readFile $ "tests/data/" ++ keyring
m <- fmap decode $ LZ.readFile $ "tests/data/" ++ message
let verification = OpenPGP.verify keys m 0
assertEqual (keyring ++ " for " ++ message) True verification
prop_sign_and_verify :: (CryptoRandomGen g) => OpenPGP.Message -> g -> OpenPGP.HashAlgorithm -> String -> String -> Gen Bool
prop_sign_and_verify secring g halgo filename msg = do
keyid <- elements ["FEF8AFA0F661C3EE","7F69FA376B020509"]
let m = OpenPGP.LiteralDataPacket {
OpenPGP.format = 'u',
OpenPGP.filename = filename,
OpenPGP.timestamp = 12341234,
OpenPGP.content = LZ.fromString msg
}
let sig = OpenPGP.sign secring (OpenPGP.Message [m])
halgo keyid 12341234 g
return $ OpenPGP.verify secring (OpenPGP.Message [sig,m]) 0
tests :: (CryptoRandomGen g) => OpenPGP.Message -> g -> [Test]
tests secring rng =
[
testGroup "Fingerprint" [
testCase "000001-006.public_key" (testFingerprint "000001-006.public_key" "421F28FEAAD222F856C8FFD5D4D54EA16F87040E"),
testCase "000016-006.public_key" (testFingerprint "000016-006.public_key" "AF95E4D7BAC521EE9740BED75E9F1523413262DC"),
testCase "000027-006.public_key" (testFingerprint "000027-006.public_key" "1EB20B2F5A5CC3BEAFD6E5CB7732CF988A63EA86"),
testCase "000035-006.public_key" (testFingerprint "000035-006.public_key" "CB7933459F59C70DF1C3FBEEDEDC3ECF689AF56D")
],
testGroup "Message verification" [
testCase "uncompressed-ops-dsa" (testVerifyMessage "pubring.gpg" "uncompressed-ops-dsa.gpg"),
testCase "uncompressed-ops-dsa-sha384" (testVerifyMessage "pubring.gpg" "uncompressed-ops-dsa-sha384.txt.gpg"),
testCase "uncompressed-ops-rsa" (testVerifyMessage "pubring.gpg" "uncompressed-ops-rsa.gpg"),
testCase "compressedsig" (testVerifyMessage "pubring.gpg" "compressedsig.gpg"),
testCase "compressedsig-zlib" (testVerifyMessage "pubring.gpg" "compressedsig-zlib.gpg"),
testCase "compressedsig-bzip2" (testVerifyMessage "pubring.gpg" "compressedsig-bzip2.gpg")
],
testGroup "Signing" [
testProperty "Crypto signatures verify" (prop_sign_and_verify secring rng)
]
]
main :: IO ()
main = do
rng <- newGenIO :: IO SystemRandom
secring <- fmap decode $ LZ.readFile "tests/data/secring.gpg"
defaultMain (tests secring rng)