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 Data.Binary
import qualified Data.OpenPGP as OpenPGP
import qualified Data.OpenPGP.Crypto 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.SHA256, OpenPGP.SHA384, OpenPGP.SHA512]
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 :: OpenPGP.Message -> String -> OpenPGP.HashAlgorithm -> String -> String -> Bool
prop_sign_and_verify secring kid halgo filename msg =
let
m = OpenPGP.LiteralDataPacket {
OpenPGP.format = 'u',
OpenPGP.filename = filename,
OpenPGP.timestamp = 12341234,
OpenPGP.content = LZ.fromString msg
}
sig = OpenPGP.sign secring (OpenPGP.Message [m]) halgo kid 12341234
in
OpenPGP.verify secring (OpenPGP.Message [m,sig]) 0
tests :: OpenPGP.Message -> [Test]
tests secring =
[
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 "FEF8AFA0F661C3EE")
]
]
main :: IO ()
main = do
secring <- fmap decode $ LZ.readFile "tests/data/secring.gpg"
defaultMain (tests secring)