1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- | Orphan instances.
module PKCS12.Instances
( arbitraryPassword
, arbitraryAlias
, arbitraryIntegrityParams
, arbitraryPKCS12
) where
import qualified Data.ByteArray as B
import Data.ByteString (ByteString)
import Data.Semigroup
import Test.Tasty.QuickCheck
import Crypto.Store.PKCS12
import Crypto.Store.PKCS5
import CMS.Instances
import PKCS8.Instances ()
arbitrarySmall :: Gen ByteString
arbitrarySmall = resize 10 (B.pack <$> arbitrary)
arbitraryAlias :: Gen String
arbitraryAlias = resize 16 asciiChar
where asciiChar = listOf $ choose ('\x20','\x7f')
arbitraryIntegrityParams :: Gen IntegrityParams
arbitraryIntegrityParams = (,) <$> arbitraryIntegrityDigest <*> arbitrary
arbitraryPKCS12 :: ProtectionPassword -> Gen PKCS12
arbitraryPKCS12 pwd = do
p <- one
ps <- listOf one
return (foldr (<>) p ps)
where
one = oneof [ unencrypted <$> arbitrary
, arbitrary >>= arbitraryEncrypted
]
arbitraryEncrypted sc = do
alg <- arbitrary
case encrypted alg pwd sc of
Left e -> error ("failed generating PKCS12: " ++ show e)
Right aSafe -> return aSafe
instance Arbitrary SafeContents where
arbitrary = SafeContents <$> arbitrary
instance Arbitrary info => Arbitrary (Bag info) where
arbitrary = do
info <- arbitrary
attrs <- arbitraryAttributes
return Bag { bagInfo = info, bagAttributes = attrs }
instance Arbitrary CertInfo where
arbitrary = CertX509 <$> arbitrary
instance Arbitrary CRLInfo where
arbitrary = CRLX509 <$> arbitrary
instance Arbitrary SafeInfo where
arbitrary = oneof [ KeyBag <$> arbitrary
, PKCS8ShroudedKeyBag <$> arbitraryShrouded
, CertBag <$> arbitrary
, CRLBag <$> arbitrary
--, SecretBag <$> arbitrary
, SafeContentsBag <$> arbitrary
]
arbitraryShrouded :: Gen PKCS5
arbitraryShrouded = do
alg <- arbitrary
bs <- arbitrarySmall -- fake content, tested with PKCS8
return PKCS5 { encryptionAlgorithm = alg, encryptedData = bs }
|