packages feed

x509 1.6.1 → 1.6.2

raw patch · 9 files changed

+94/−30 lines, 9 filesdep ~asn1-parsedep ~asn1-typesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: asn1-parse, asn1-types

API changes (from Hackage documentation)

- Data.X509: PubKeyALG_ECDSA :: PubKeyALG
- Data.X509: PubKeyECDSA :: CurveName -> ByteString -> PubKey
- Data.X509: certExtensions :: Certificate -> Extensions
- Data.X509: certIssuerDN :: Certificate -> DistinguishedName
- Data.X509: certPubKey :: Certificate -> PubKey
- Data.X509: certSerial :: Certificate -> Integer
- Data.X509: certSignatureAlg :: Certificate -> SignatureALG
- Data.X509: certSubjectDN :: Certificate -> DistinguishedName
- Data.X509: certValidity :: Certificate -> (DateTime, DateTime)
- Data.X509: certVersion :: Certificate -> Int
- Data.X509: characterEncoding :: ASN1CharacterString -> ASN1StringEncoding
- Data.X509: crlExtensions :: CRL -> Extensions
- Data.X509: crlIssuer :: CRL -> DistinguishedName
- Data.X509: crlNextUpdate :: CRL -> Maybe DateTime
- Data.X509: crlRevokedCertificates :: CRL -> [RevokedCertificate]
- Data.X509: crlSignatureAlg :: CRL -> SignatureALG
- Data.X509: crlThisUpdate :: CRL -> DateTime
- Data.X509: crlVersion :: CRL -> Integer
- Data.X509: extRawASN1 :: ExtensionRaw -> [ASN1]
- Data.X509: extRawCritical :: ExtensionRaw -> Bool
- Data.X509: extRawOID :: ExtensionRaw -> OID
- Data.X509: getCharacterStringRawData :: ASN1CharacterString -> ByteString
- Data.X509: getDistinguishedElements :: DistinguishedName -> [(OID, ASN1CharacterString)]
- Data.X509: revokedDate :: RevokedCertificate -> DateTime
- Data.X509: revokedExtensions :: RevokedCertificate -> Extensions
- Data.X509: revokedSerialNumber :: RevokedCertificate -> Integer
- Data.X509: signedAlg :: Signed a -> SignatureALG
- Data.X509: signedObject :: Signed a -> a
- Data.X509: signedSignature :: Signed a -> ByteString
+ Data.X509: PubKeyALG_EC :: PubKeyALG
+ Data.X509: PubKeyEC :: PubKeyEC -> PubKey
+ Data.X509: PubKeyEC_Named :: CurveName -> SerializedPoint -> PubKeyEC
+ Data.X509: PubKeyEC_Prime :: SerializedPoint -> Integer -> Integer -> Integer -> SerializedPoint -> Integer -> Integer -> Integer -> PubKeyEC
+ Data.X509: SerializedPoint :: ByteString -> SerializedPoint
+ Data.X509: [certExtensions] :: Certificate -> Extensions
+ Data.X509: [certIssuerDN] :: Certificate -> DistinguishedName
+ Data.X509: [certPubKey] :: Certificate -> PubKey
+ Data.X509: [certSerial] :: Certificate -> Integer
+ Data.X509: [certSignatureAlg] :: Certificate -> SignatureALG
+ Data.X509: [certSubjectDN] :: Certificate -> DistinguishedName
+ Data.X509: [certValidity] :: Certificate -> (DateTime, DateTime)
+ Data.X509: [certVersion] :: Certificate -> Int
+ Data.X509: [characterEncoding] :: ASN1CharacterString -> ASN1StringEncoding
+ Data.X509: [crlExtensions] :: CRL -> Extensions
+ Data.X509: [crlIssuer] :: CRL -> DistinguishedName
+ Data.X509: [crlNextUpdate] :: CRL -> Maybe DateTime
+ Data.X509: [crlRevokedCertificates] :: CRL -> [RevokedCertificate]
+ Data.X509: [crlSignatureAlg] :: CRL -> SignatureALG
+ Data.X509: [crlThisUpdate] :: CRL -> DateTime
+ Data.X509: [crlVersion] :: CRL -> Integer
+ Data.X509: [extRawASN1] :: ExtensionRaw -> [ASN1]
+ Data.X509: [extRawCritical] :: ExtensionRaw -> Bool
+ Data.X509: [extRawOID] :: ExtensionRaw -> OID
+ Data.X509: [getCharacterStringRawData] :: ASN1CharacterString -> ByteString
+ Data.X509: [getDistinguishedElements] :: DistinguishedName -> [(OID, ASN1CharacterString)]
+ Data.X509: [pubkeyEC_a] :: PubKeyEC -> Integer
+ Data.X509: [pubkeyEC_b] :: PubKeyEC -> Integer
+ Data.X509: [pubkeyEC_cofactor] :: PubKeyEC -> Integer
+ Data.X509: [pubkeyEC_generator] :: PubKeyEC -> SerializedPoint
+ Data.X509: [pubkeyEC_name] :: PubKeyEC -> CurveName
+ Data.X509: [pubkeyEC_order] :: PubKeyEC -> Integer
+ Data.X509: [pubkeyEC_prime] :: PubKeyEC -> Integer
+ Data.X509: [pubkeyEC_pub] :: PubKeyEC -> SerializedPoint
+ Data.X509: [pubkeyEC_seed] :: PubKeyEC -> Integer
+ Data.X509: [revokedDate] :: RevokedCertificate -> DateTime
+ Data.X509: [revokedExtensions] :: RevokedCertificate -> Extensions
+ Data.X509: [revokedSerialNumber] :: RevokedCertificate -> Integer
+ Data.X509: [signedAlg] :: Signed a -> SignatureALG
+ Data.X509: [signedObject] :: Signed a -> a
+ Data.X509: [signedSignature] :: Signed a -> ByteString
+ Data.X509: data PubKeyEC
+ Data.X509: newtype SerializedPoint

Files

Data/X509.hs view
@@ -16,6 +16,8 @@     , SignedCRL     , Certificate(..)     , PubKey(..)+    , PubKeyEC(..)+    , SerializedPoint(..)     , PrivKey(..)     , pubkeyToAlg     , privkeyToAlg
Data/X509/AlgorithmIdentifier.hs view
@@ -29,7 +29,7 @@ data PubKeyALG =       PubKeyALG_RSA         -- ^ RSA Public Key algorithm     | PubKeyALG_DSA         -- ^ DSA Public Key algorithm-    | PubKeyALG_ECDSA       -- ^ ECDSA Public Key algorithm+    | PubKeyALG_EC          -- ^ ECDSA & ECDH Public Key algorithm     | PubKeyALG_DH          -- ^ Diffie Hellman Public Key algorithm     | PubKeyALG_Unknown OID -- ^ Unknown Public Key algorithm     deriving (Show,Eq)@@ -44,7 +44,7 @@ instance OIDable PubKeyALG where     getObjectID PubKeyALG_RSA   = [1,2,840,113549,1,1,1]     getObjectID PubKeyALG_DSA   = [1,2,840,10040,4,1]-    getObjectID PubKeyALG_ECDSA = [1,2,840,10045,2,1]+    getObjectID PubKeyALG_EC    = [1,2,840,10045,2,1]     getObjectID PubKeyALG_DH    = [1,2,840,10046,2,1]     getObjectID (PubKeyALG_Unknown oid) = oid @@ -58,10 +58,11 @@         , ([1,2,840,113549,1,1,13], SignatureALG HashSHA512 PubKeyALG_RSA)         , ([1,2,840,113549,1,1,14], SignatureALG HashSHA224 PubKeyALG_RSA)         , ([1,2,840,10040,4,3],    SignatureALG HashSHA1 PubKeyALG_DSA)-        , ([1,2,840,10045,4,3,1],  SignatureALG HashSHA224 PubKeyALG_ECDSA)-        , ([1,2,840,10045,4,3,2],  SignatureALG HashSHA256 PubKeyALG_ECDSA)-        , ([1,2,840,10045,4,3,3],  SignatureALG HashSHA384 PubKeyALG_ECDSA)-        , ([1,2,840,10045,4,3,4],  SignatureALG HashSHA512 PubKeyALG_ECDSA)+        , ([1,2,840,10045,4,1],    SignatureALG HashSHA1 PubKeyALG_EC)+        , ([1,2,840,10045,4,3,1],  SignatureALG HashSHA224 PubKeyALG_EC)+        , ([1,2,840,10045,4,3,2],  SignatureALG HashSHA256 PubKeyALG_EC)+        , ([1,2,840,10045,4,3,3],  SignatureALG HashSHA384 PubKeyALG_EC)+        , ([1,2,840,10045,4,3,4],  SignatureALG HashSHA512 PubKeyALG_EC)         ]  oidSig :: OID -> SignatureALG
Data/X509/CRL.hs view
@@ -66,10 +66,10 @@         <*> getRevokedCertificates         <*> getObject   where getVersion (IntVal v) = return $ fromIntegral v-        getVersion _          = throwError "unexpected type for version"+        getVersion _          = throwParseError "unexpected type for version"          getThisUpdate (ASN1Time _ t1 _) = return t1-        getThisUpdate _                 = throwError "bad this update format, expecting time"+        getThisUpdate _                 = throwParseError "bad this update format, expecting time"          getNextUpdate = getNextMaybe timeOrNothing 
Data/X509/Cert.hs view
@@ -55,19 +55,19 @@ parseCertHeaderVersion =     maybe 1 id <$> onNextContainerMaybe (Container Context 0) (getNext >>= getVer)   where getVer (IntVal v) = return $ fromIntegral v-        getVer _          = throwError "unexpected type for version"+        getVer _          = throwParseError "unexpected type for version"  parseCertHeaderSerial :: ParseASN1 Integer parseCertHeaderSerial = do     n <- getNext     case n of         IntVal v -> return v-        _        -> throwError ("missing serial" ++ show n)+        _        -> throwParseError ("missing serial" ++ show n)  parseCertHeaderValidity :: ParseASN1 (DateTime, DateTime) parseCertHeaderValidity = getNextContainer Sequence >>= toTimeBound   where toTimeBound [ ASN1Time _ t1 _, ASN1Time _ t2 _ ] = return (t1,t2)-        toTimeBound _                                    = throwError "bad validity format"+        toTimeBound _                                    = throwParseError "bad validity format"  {- | parse header structure of a x509 certificate. the structure is the following:         Version
Data/X509/DistinguishedName.hs view
@@ -74,7 +74,7 @@     s <- getNextContainer Sequence     case s of         [OID oid, ASN1String cs] -> return (oid, cs)-        _                        -> throwError ("expecting [OID,String] got " ++ show s)+        _                        -> throwParseError ("expecting [OID,String] got " ++ show s)  encodeDNinner :: DistinguishedName -> [ASN1] encodeDNinner (DistinguishedName dn) = concatMap dnSet dn
Data/X509/Ext.hs view
@@ -265,19 +265,19 @@                     case c of                         Just [ASN1String cs] ->                             case asn1CharacterToString cs of-                                Nothing -> throwError ("GeneralNames: invalid string for XMPP Addr")+                                Nothing -> throwParseError ("GeneralNames: invalid string for XMPP Addr")                                 Just s  -> return $ AltNameXMPP s-                        _ -> throwError ("GeneralNames: expecting string for XMPP Addr got: " ++ show c)+                        _ -> throwParseError ("GeneralNames: expecting string for XMPP Addr got: " ++ show c)                 OID [1,3,6,1,5,5,7,8,7] -> do -- DNSSRV addr                     c <- getNextContainerMaybe (Container Context 0)                     case c of                         Just [ASN1String cs] ->                             case asn1CharacterToString cs of-                                Nothing -> throwError ("GeneralNames: invalid string for DNSSrv Addr")+                                Nothing -> throwParseError ("GeneralNames: invalid string for DNSSrv Addr")                                 Just s  -> return $ AltNameDNSSRV s-                        _ -> throwError ("GeneralNames: expecting string for DNSSRV Addr got: " ++ show c)-                OID unknown -> throwError ("GeneralNames: unknown OID " ++ show unknown)-                _           -> throwError ("GeneralNames: expecting OID but got " ++ show n)+                        _ -> throwParseError ("GeneralNames: expecting string for DNSSRV Addr got: " ++ show c)+                OID unknown -> throwParseError ("GeneralNames: unknown OID " ++ show unknown)+                _           -> throwParseError ("GeneralNames: expecting OID but got " ++ show n)          getSimpleAddr = do             n <- getNext@@ -286,7 +286,7 @@                 (Other Context 2 b) -> return $ AltNameDNS $ BC.unpack b                 (Other Context 6 b) -> return $ AltNameURI $ BC.unpack b                 (Other Context 7 b) -> return $ AltNameIP  b-                _                   -> throwError ("GeneralNames: not coping with unknown stream " ++ show n)+                _                   -> throwParseError ("GeneralNames: not coping with unknown stream " ++ show n)  encodeGeneralNames :: [AltName] -> [ASN1] encodeGeneralNames names =
Data/X509/Internal.hs view
@@ -13,7 +13,6 @@     -- * error handling     , ErrT     , runErrT-    , throwError     ) where  import Data.ASN1.Types
Data/X509/PublicKey.hs view
@@ -9,6 +9,8 @@ -- module Data.X509.PublicKey     ( PubKey(..)+    , PubKeyEC(..)+    , SerializedPoint(..)     , pubkeyToAlg     ) where @@ -18,6 +20,7 @@ import Data.ASN1.BitArray  import Data.Bits+import Data.ByteString (ByteString)  import Data.X509.Internal import Data.X509.OID@@ -26,17 +29,42 @@ import qualified Crypto.PubKey.RSA.Types as RSA import qualified Crypto.PubKey.DSA       as DSA import qualified Crypto.PubKey.ECC.Types as ECC+import           Crypto.Number.Serialize (os2ip) import Data.Word  import qualified Data.ByteString as B +-- | Serialized Elliptic Curve Point+newtype SerializedPoint = SerializedPoint ByteString+    deriving (Show,Eq)++-- | Elliptic Curve Public Key+--+-- TODO: missing support for binary curve.+data PubKeyEC =+      PubKeyEC_Prime+        { pubkeyEC_pub       :: SerializedPoint+        , pubkeyEC_a         :: Integer+        , pubkeyEC_b         :: Integer+        , pubkeyEC_prime     :: Integer+        , pubkeyEC_generator :: SerializedPoint+        , pubkeyEC_order     :: Integer+        , pubkeyEC_cofactor  :: Integer+        , pubkeyEC_seed      :: Integer+        }+    | PubKeyEC_Named+        { pubkeyEC_name      :: ECC.CurveName+        , pubkeyEC_pub       :: SerializedPoint+        }+    deriving (Show,Eq)+ -- | Public key types known and used in X.509 data PubKey =       PubKeyRSA RSA.PublicKey -- ^ RSA public key     | PubKeyDSA DSA.PublicKey -- ^ DSA public key     | PubKeyDH (Integer,Integer,Integer,Maybe Integer,([Word8], Integer))                                 -- ^ DH format with (p,g,q,j,(seed,pgenCounter))-    | PubKeyECDSA ECC.CurveName B.ByteString+    | PubKeyEC PubKeyEC       -- ^ EC public key     | PubKeyUnknown OID B.ByteString -- ^ unrecognized format     deriving (Show,Eq) @@ -67,13 +95,43 @@                         _ -> Left "fromASN1: X509.PubKey: unknown DSA format"                         )                 _ -> Left "fromASN1: X509.PubKey: unknown DSA format"-        | pkalg == getObjectID PubKeyALG_ECDSA =+        | pkalg == getObjectID PubKeyALG_EC =             case xs of                 OID curveOid:End Sequence:BitString bits:End Sequence:xs2 ->                     case lookupByOID curvesOIDTable curveOid of-                        Just curveName -> Right (PubKeyECDSA curveName (bitArrayGetData bits), xs2)-                        Nothing        -> Left ("fromASN1: X509.Pubkey: ECDSA unknown curve " ++ show curveOid)-                _ -> Left "fromASN1: X509.PubKey: unknown ECDSA format"+                        Just curveName -> Right (PubKeyEC $ PubKeyEC_Named curveName (bitArrayToPoint bits), xs2)+                        Nothing        -> Left ("fromASN1: X509.Pubkey: EC unknown curve " ++ show curveOid)+                Start Sequence+                    :IntVal 1+                    :Start Sequence+                    :OID [1,2,840,10045,1,1]+                    :IntVal prime+                    :End Sequence+                    :Start Sequence+                    :OctetString a+                    :OctetString b+                    :BitString seed+                    :End Sequence+                    :OctetString generator+                    :IntVal order+                    :IntVal cofactor+                    :End Sequence+                    :End Sequence+                    :BitString pub+                    :End Sequence+                    :xs2 ->+                    Right (PubKeyEC $ PubKeyEC_Prime+                        { pubkeyEC_pub       = bitArrayToPoint pub+                        , pubkeyEC_a         = os2ip a+                        , pubkeyEC_b         = os2ip b+                        , pubkeyEC_prime     = prime+                        , pubkeyEC_generator = SerializedPoint generator+                        , pubkeyEC_order     = order+                        , pubkeyEC_cofactor  = cofactor+                        , pubkeyEC_seed      = os2ip $ bitArrayGetData seed+                        }, xs2)+                _ ->+                    Left $ "fromASN1: X509.PubKey: unknown EC format: " ++ show xs         | otherwise = error ("unknown public key OID: " ++ show pkalg)       where decodeASN1Err format bits xs2 f =                 case decodeASN1' BER (bitArrayGetData bits) of@@ -83,6 +141,8 @@                                     Right (r, xsinner) -> Right (r, xsinner ++ xs2)             toPubKeyRSA = either Left (\(rsaKey, r) -> Right (PubKeyRSA rsaKey, r)) +            bitArrayToPoint = SerializedPoint . bitArrayGetData+             removeNull (Null:r) = r             removeNull l        = l @@ -94,7 +154,7 @@ pubkeyToAlg (PubKeyRSA _)         = PubKeyALG_RSA pubkeyToAlg (PubKeyDSA _)         = PubKeyALG_DSA pubkeyToAlg (PubKeyDH _)          = PubKeyALG_DH-pubkeyToAlg (PubKeyECDSA _ _)     = PubKeyALG_ECDSA+pubkeyToAlg (PubKeyEC _)          = PubKeyALG_EC pubkeyToAlg (PubKeyUnknown oid _) = PubKeyALG_Unknown oid  encodePK :: PubKey -> [ASN1]@@ -112,12 +172,14 @@                                         ,IntVal (DSA.params_g params)]         params = DSA.public_params pubkey         bits   = encodeASN1' DER [IntVal $ DSA.public_y pubkey]-    encodeInner (PubKeyECDSA curveName bits) =+    encodeInner (PubKeyEC (PubKeyEC_Named curveName (SerializedPoint bits))) =         asn1Container Sequence [pkalg,OID eOid] ++ [BitString $ toBitArray bits 0]       where         eOid = case curveName of                     ECC.SEC_p384r1 -> [1,3,132,0,34]                     _              -> error ("undefined curve OID: " ++ show curveName)+    encodeInner (PubKeyEC (PubKeyEC_Prime {})) =+        error "encodeInner: unimplemented public key EC_Prime"     encodeInner (PubKeyDH _) = error "encodeInner: unimplemented public key DH"     encodeInner (PubKeyUnknown _ l) =         asn1Container Sequence [pkalg,Null] ++ [BitString $ toBitArray l 0]
x509.cabal view
@@ -1,5 +1,5 @@ Name:                x509-Version:             1.6.1+Version:             1.6.2 Description:         X509 reader and writer License:             BSD3 License-file:        LICENSE@@ -21,9 +21,9 @@                    , containers                    , hourglass                    , pem >= 0.1 && < 0.3-                   , asn1-types >= 0.3.0 && < 0.4+                   , asn1-types >= 0.3.1 && < 0.4                    , asn1-encoding >= 0.9 && < 0.10-                   , asn1-parse >= 0.9 && < 0.10+                   , asn1-parse >= 0.9.3 && < 0.10                    , cryptonite   Exposed-modules:   Data.X509   Other-modules:     Data.X509.Internal