hOpenPGP-1.5.2: Codec/Encryption/OpenPGP/Arbitrary.hs
-- Arbitrary.hs: QuickCheck instances
-- Copyright © 2014 Clint Adams
-- This software is released under the terms of the Expat license.
-- (See the LICENSE file).
module Codec.Encryption.OpenPGP.Arbitrary () where
import Codec.Encryption.OpenPGP.Types
import qualified Data.ByteString as B
import Test.QuickCheck (Arbitrary(..), choose, elements, frequency, getPositive, oneof, vector)
import Test.QuickCheck.Instances ()
instance Arbitrary PKESK where
arbitrary = do pv <- arbitrary
eoki <- arbitrary
pka <- arbitrary
mpis <- arbitrary
return $ PKESK pv eoki pka mpis
instance Arbitrary Signature where
arbitrary = arbitrary >>= return . Signature
instance Arbitrary UserId where
arbitrary = arbitrary >>= return . UserId
--
instance Arbitrary SignaturePayload where
arbitrary = frequency [(2,three),(3,four),(1,other)]
where
three = do
st <- arbitrary
w32 <- arbitrary
eoki <- arbitrary
pka <- arbitrary
ha <- arbitrary
w16 <- arbitrary
mpis <- arbitrary
return (SigV3 st w32 eoki pka ha w16 mpis)
four = do
st <- arbitrary
pka <- arbitrary
ha <- arbitrary
has <- arbitrary
uhas <- arbitrary
w16 <- arbitrary
mpis <- arbitrary
return (SigV4 st pka ha has uhas w16 mpis)
other = do
v <- choose (5, maxBound)
bs <- arbitrary
return (SigVOther v bs)
instance Arbitrary SigSubPacket where
arbitrary = do
crit <- arbitrary
pl <- arbitrary
return (SigSubPacket crit pl)
instance Arbitrary SigSubPacketPayload where
arbitrary = oneof [sct, set, ec, ts, re, ket, psa, rk, i, nd, phas, pcas, ksps, pks, puid, purl, kfs, suid, rfr, fs, st {-, es -}]
where
sct = arbitrary >>= return . SigCreationTime
set = arbitrary >>= return . SigExpirationTime
ec = arbitrary >>= return . ExportableCertification
ts = arbitrary >>= \tl -> arbitrary >>= \ta -> return (TrustSignature tl ta)
re = arbitrary >>= return . RegularExpression
ket = arbitrary >>= return . KeyExpirationTime
psa = arbitrary >>= return . PreferredSymmetricAlgorithms
rk = arbitrary >>= \rcs -> arbitrary >>= \pka -> arbitrary >>= \tof -> return (RevocationKey rcs pka tof)
i = arbitrary >>= return . Issuer
nd = arbitrary >>= \nfs -> arbitrary >>= \nn -> arbitrary >>= \nv -> return (NotationData nfs nn nv)
phas = arbitrary >>= return . PreferredHashAlgorithms
pcas = arbitrary >>= return . PreferredCompressionAlgorithms
ksps = arbitrary >>= return . KeyServerPreferences
pks = arbitrary >>= return . PreferredKeyServer
puid = arbitrary >>= return . PrimaryUserId
purl = arbitrary >>= return . PolicyURL
kfs = arbitrary >>= return . KeyFlags
suid = arbitrary >>= return . SignersUserId
rfr = arbitrary >>= \rc -> arbitrary >>= \rr -> return (ReasonForRevocation rc rr)
fs = arbitrary >>= return . Features
st = arbitrary >>= \pka -> arbitrary >>= \ha -> arbitrary >>= \sh -> return (SignatureTarget pka ha sh)
es = arbitrary >>= return . EmbeddedSignature -- FIXME: figure out why EmbeddedSignature fails to serialize properly
-- FIXME: finish this
--
instance Arbitrary PubKeyAlgorithm where
arbitrary = elements [RSA, DSA, ECDH, ECDSA, DH]
instance Arbitrary EightOctetKeyId where
arbitrary = vector 8 >>= return . EightOctetKeyId . B.pack
instance Arbitrary TwentyOctetFingerprint where
arbitrary = vector 20 >>= return . TwentyOctetFingerprint . B.pack
instance Arbitrary MPI where
arbitrary = arbitrary >>= return . MPI . getPositive
instance Arbitrary SigType where
arbitrary = elements [BinarySig, CanonicalTextSig, StandaloneSig, GenericCert, PersonaCert, CasualCert, PositiveCert, SubkeyBindingSig, PrimaryKeyBindingSig, SignatureDirectlyOnAKey, KeyRevocationSig, SubkeyRevocationSig, CertRevocationSig, TimestampSig, ThirdPartyConfirmationSig]
instance Arbitrary HashAlgorithm where
arbitrary = elements [DeprecatedMD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224]
instance Arbitrary SymmetricAlgorithm where
arbitrary = elements [Plaintext, IDEA, TripleDES, CAST5, Blowfish, ReservedSAFER, ReservedDES, AES128, AES192, AES256, Twofish]
instance Arbitrary RevocationClass where
arbitrary = frequency [(9,srk),(1,rco)]
where
srk = return SensitiveRK
rco = choose (2,7) >>= return . RClOther
instance Arbitrary NotationFlag where
arbitrary = frequency [(9,hr),(1,onf)]
where
hr = return HumanReadable
onf = choose (1,31) >>= return . OtherNF
instance Arbitrary CompressionAlgorithm where
arbitrary = elements [Uncompressed,ZIP,ZLIB,BZip2]
instance Arbitrary KSPFlag where
arbitrary = frequency [(9,nm),(1,kspo)]
where
nm = return NoModify
kspo = choose (2,63) >>= return . KSPOther
instance Arbitrary KeyFlag where
arbitrary = elements [GroupKey, AuthKey, SplitKey, EncryptStorageKey, EncryptCommunicationsKey, SignDataKey, CertifyKeysKey]
instance Arbitrary RevocationCode where
arbitrary = elements [NoReason, KeySuperseded, KeyMaterialCompromised, KeyRetiredAndNoLongerUsed, UserIdInfoNoLongerValid]
instance Arbitrary FeatureFlag where
arbitrary = frequency [(9,md),(1,fo)]
where
md = return ModificationDetection
fo = choose (8,63) >>= return . FeatureOther