hs-tls/core/Tests/Certificate.hs
2013-07-21 08:57:56 +01:00

101 lines
3.2 KiB
Haskell

module Certificate
( arbitraryX509
, arbitraryX509WithPublicKey
, simpleCertificate
, simpleX509
) where
import Test.QuickCheck
import Data.X509
import Data.Time.Calendar (fromGregorian)
import Data.Time.Clock (secondsToDiffTime, UTCTime(..))
import qualified Data.ByteString as B
import PubKey
arbitraryDN = return $ DistinguishedName []
arbitraryTime = do
year <- choose (1951, 2050)
month <- choose (1, 12)
day <- choose (1, 30)
hour <- choose (0, 23)
minute <- choose (0, 59)
second <- choose (0, 59)
--z <- arbitrary
return $ UTCTime (fromGregorian year month day) (secondsToDiffTime (hour * 3600 + minute * 60 + second))
maxSerial = 16777216
arbitraryCertificate pubKey = do
version <- choose (1,3)
serial <- choose (0,maxSerial)
issuerdn <- arbitraryDN
subjectdn <- arbitraryDN
time1 <- arbitraryTime
time2 <- arbitraryTime
let sigalg = SignatureALG HashMD5 PubKeyALG_RSA
return $ Certificate
{ certVersion = version
, certSerial = serial
, certSignatureAlg = sigalg
, certIssuerDN = issuerdn
, certSubjectDN = subjectdn
, certValidity = (time1, time2)
, certPubKey = pubKey
, certExtensions = Extensions Nothing
}
simpleCertificate pubKey =
Certificate
{ certVersion = 3
, certSerial = 0
, certSignatureAlg = SignatureALG HashSHA1 PubKeyALG_RSA
, certIssuerDN = simpleDN
, certSubjectDN = simpleDN
, certValidity = (time1, time2)
, certPubKey = pubKey
, certExtensions = Extensions Nothing
}
where time1 = UTCTime (fromGregorian 1999 1 1) 0
time2 = UTCTime (fromGregorian 2901 1 1) 0
simpleDN = DistinguishedName []
simpleX509 pubKey = do
let cert = simpleCertificate pubKey
sig = replicate 40 1
sigalg = SignatureALG HashMD5 PubKeyALG_RSA
(signedExact, ()) = objectToSignedExact (\_ -> (B.pack sig,sigalg,())) cert
in signedExact
{-
arbitraryX509Cert pubKey = do
version <- choose (1,3)
serial <- choose (0,maxSerial)
issuerdn <- arbitraryDN
subjectdn <- arbitraryDN
time1 <- arbitraryTime
time2 <- arbitraryTime
let sigalg = X509.SignatureALG X509.HashMD5 X509.PubKeyALG_RSA
return $ Cert.Certificate
{ X509.certVersion = version
, X509.certSerial = serial
, X509.certSignatureAlg = sigalg
, X509.certIssuerDN = issuerdn
, X509.certSubjectDN = subjectdn
, X509.certValidity = (time1, time2)
, X509.certPubKey = pubKey
, X509.certExtensions = Nothing
}
-}
arbitraryX509WithPublicKey pubKey = do
cert <- arbitraryCertificate (PubKeyRSA pubKey)
sig <- resize 40 $ listOf1 arbitrary
let sigalg = SignatureALG HashMD5 PubKeyALG_RSA
let (signedExact, ()) = objectToSignedExact (\_ -> (B.pack sig,sigalg,())) cert
return signedExact
arbitraryX509 = do
let pubKey = fst $ getGlobalRSAPair
arbitraryX509WithPublicKey pubKey