x509 1.4.6 → 1.4.7
raw patch · 3 files changed
+63/−5 lines, 3 files
Files
- Data/X509/Ext.hs +39/−1
- Tests/Tests.hs +23/−3
- x509.cabal +1/−1
Data/X509/Ext.hs view
@@ -13,6 +13,8 @@ , ExtBasicConstraints(..) , ExtKeyUsage(..) , ExtKeyUsageFlag(..)+ , ExtExtendedKeyUsage(..)+ , ExtKeyUsagePurpose(..) , ExtSubjectKeyId(..) , ExtSubjectAltName(..) , ExtAuthorityKeyId(..)@@ -29,8 +31,9 @@ import qualified Data.ByteString as B import qualified Data.ByteString.Char8 as BC import Data.ASN1.Types+import Data.ASN1.Parse import Data.ASN1.BitArray-import Data.X509.Internal+import Data.List (find) import Data.X509.ExtensionRaw import Data.X509.DistinguishedName import Control.Applicative@@ -116,6 +119,41 @@ extEncode (ExtKeyUsage flags) = [BitString $ flagsToBits flags] extDecode [BitString bits] = Right $ ExtKeyUsage $ bitsToFlags bits extDecode _ = Left "unknown sequence"++data ExtKeyUsagePurpose =+ KeyUsagePurpose_ServerAuth+ | KeyUsagePurpose_ClientAuth+ | KeyUsagePurpose_CodeSigning+ | KeyUsagePurpose_EmailProtection+ | KeyUsagePurpose_TimeStamping+ | KeyUsagePurpose_OCSPSigning+ | KeyUsagePurpose_Unknown OID+ deriving (Show,Eq,Ord)++extKeyUsagePurposedOID :: [(OID, ExtKeyUsagePurpose)]+extKeyUsagePurposedOID =+ [(keyUsagePurposePrefix 1, KeyUsagePurpose_ServerAuth)+ ,(keyUsagePurposePrefix 2, KeyUsagePurpose_ClientAuth)+ ,(keyUsagePurposePrefix 3, KeyUsagePurpose_CodeSigning)+ ,(keyUsagePurposePrefix 4, KeyUsagePurpose_EmailProtection)+ ,(keyUsagePurposePrefix 8, KeyUsagePurpose_TimeStamping)+ ,(keyUsagePurposePrefix 9, KeyUsagePurpose_OCSPSigning)]+ where keyUsagePurposePrefix r = [1,3,6,1,5,5,7,3,r]++data ExtExtendedKeyUsage = ExtExtendedKeyUsage [ExtKeyUsagePurpose]+ deriving (Show,Eq)++instance Extension ExtExtendedKeyUsage where+ extOID = const [2,5,29,37]+ extEncode (ExtExtendedKeyUsage purposes) =+ [Start Sequence] ++ map (OID . lookupRev) purposes ++ [End Sequence]+ where lookupRev (KeyUsagePurpose_Unknown oid) = oid+ lookupRev kup = maybe (error "unknown key usage purpose") fst $ find ((==) kup . snd) extKeyUsagePurposedOID+ extDecode l = ExtExtendedKeyUsage `fmap` (flip runParseASN1 l $ onNextContainer Sequence $ getMany $ do+ n <- getNext+ case n of+ OID o -> return $ maybe (KeyUsagePurpose_Unknown o) id $ lookup o extKeyUsagePurposedOID+ _ -> error "invalid content in extended key usage") -- | Provide a way to identify a public key by a short hash. data ExtSubjectKeyId = ExtSubjectKeyId B.ByteString
Tests/Tests.hs view
@@ -11,7 +11,7 @@ import Control.Applicative import Control.Monad -import Data.List (nub)+import Data.List (nub, sort) import Data.ASN1.Types import Data.X509 import qualified Crypto.Types.PubKey.RSA as RSA@@ -93,8 +93,18 @@ instance Arbitrary ExtKeyUsageFlag where arbitrary = elements $ enumFrom KeyUsage_digitalSignature instance Arbitrary ExtKeyUsage where- arbitrary = ExtKeyUsage . nub <$> listOf1 arbitrary+ arbitrary = ExtKeyUsage . sort . nub <$> listOf1 arbitrary +instance Arbitrary ExtKeyUsagePurpose where+ arbitrary = elements [ KeyUsagePurpose_ServerAuth+ , KeyUsagePurpose_ClientAuth+ , KeyUsagePurpose_CodeSigning+ , KeyUsagePurpose_EmailProtection+ , KeyUsagePurpose_TimeStamping+ , KeyUsagePurpose_OCSPSigning ]+instance Arbitrary ExtExtendedKeyUsage where+ arbitrary = ExtExtendedKeyUsage . nub <$> listOf1 arbitrary+ instance Arbitrary Certificate where arbitrary = Certificate <$> pure 2 <*> arbitrary@@ -130,10 +140,20 @@ where got = fromASN1 oMarshalled oMarshalled = toASN1 o [] +property_extension_id :: (Show e, Eq e, Extension e) => e -> Bool+property_extension_id e = case extDecode (extEncode e) of+ Left err -> error err+ Right v | v == e -> True+ | otherwise -> error ("expected " ++ show e ++ " got: " ++ show v)+ main = defaultMain- [ testGroup "asn1 objects unmarshall.marshall=id"+ [ testGroup "marshall" [ testProperty "pubkey" (property_unmarshall_marshall_id :: PubKey -> Bool) , testProperty "signature alg" (property_unmarshall_marshall_id :: SignatureALG -> Bool)+ , testGroup "extension"+ [ testProperty "key-usage" (property_extension_id :: ExtKeyUsage -> Bool)+ , testProperty "extended-key-usage" (property_extension_id :: ExtExtendedKeyUsage -> Bool)+ ] , testProperty "extensions" (property_unmarshall_marshall_id :: Extensions -> Bool) , testProperty "certificate" (property_unmarshall_marshall_id :: Certificate -> Bool) , testProperty "crl" (property_unmarshall_marshall_id :: CRL -> Bool)
x509.cabal view
@@ -1,5 +1,5 @@ Name: x509-Version: 1.4.6+Version: 1.4.7 Description: X509 reader and writer License: BSD3 License-file: LICENSE