certificate 1.2.7 → 1.2.8
raw patch · 2 files changed
+27/−32 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Certificate.X509.Cert: ECDSA_Hash_SHA384 :: ECDSA_Hash
+ Data.Certificate.X509.Cert: data ECDSA_Hash
+ Data.Certificate.X509.Cert: instance Eq ECDSA_Hash
+ Data.Certificate.X509.Cert: instance Show ECDSA_Hash
- Data.Certificate.X509: PubKeyECDSA :: [ASN1] -> PubKey
+ Data.Certificate.X509: PubKeyECDSA :: ECDSA_Hash -> ByteString -> PubKey
- Data.Certificate.X509.Cert: PubKeyECDSA :: [ASN1] -> PubKey
+ Data.Certificate.X509.Cert: PubKeyECDSA :: ECDSA_Hash -> ByteString -> PubKey
Files
- Data/Certificate/X509/Cert.hs +26/−31
- certificate.cabal +1/−1
Data/Certificate/X509/Cert.hs view
@@ -5,6 +5,7 @@ , HashALG(..) , PubKeyALG(..) , PubKey(..)+ , ECDSA_Hash(..) , ASN1StringType(..) , ASN1String , Certificate(..)@@ -42,7 +43,6 @@ import Data.Maybe import Data.Time.Calendar import Data.Time.Clock (DiffTime, secondsToDiffTime)-import Data.ByteString.Lazy (ByteString) import qualified Data.ByteString.Lazy as L import Control.Applicative ((<$>)) import Control.Monad.State@@ -77,12 +77,15 @@ | SignatureALG_Unknown OID deriving (Show,Eq) +data ECDSA_Hash = ECDSA_Hash_SHA384+ deriving (Show,Eq)+ 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 [ASN1] -- ^ ECDSA format not done yet FIXME+ | PubKeyECDSA ECDSA_Hash L.ByteString -- ^ ECDSA format not done yet FIXME | PubKeyUnknown OID [Word8] -- ^ unrecognized format deriving (Show,Eq) @@ -122,12 +125,6 @@ oidOrganization = [2,5,4,10] oidOrganizationUnit = [2,5,4,11] -parse_ECDSA :: ByteString -> ParseASN1 PubKey-parse_ECDSA bits =- case decodeASN1 BER bits of- Right l -> return $ PubKeyECDSA l- Left _ -> return $ PubKeyUnknown (pubkeyalgOID PubKeyALG_ECDSA) (L.unpack bits)- parseCertHeaderVersion :: ParseASN1 Int parseCertHeaderVersion = do v <- onNextContainerMaybe (Container Context 0) $ do@@ -184,7 +181,7 @@ pubkeyToAlg (PubKeyRSA _) = PubKeyALG_RSA pubkeyToAlg (PubKeyDSA _) = PubKeyALG_DSA pubkeyToAlg (PubKeyDH _) = PubKeyALG_DH-pubkeyToAlg (PubKeyECDSA _) = PubKeyALG_ECDSA+pubkeyToAlg (PubKeyECDSA _ _) = PubKeyALG_ECDSA pubkeyToAlg (PubKeyUnknown oid _) = PubKeyALG_Unknown oid parseCertHeaderAlgorithmID :: ParseASN1 SignatureALG@@ -243,29 +240,27 @@ parseCertHeaderSubjectPK :: ParseASN1 PubKey parseCertHeaderSubjectPK = onNextContainer Sequence $ do- l <- getNextContainer Sequence- bits <- getNextBitString- case l of- [OID pkalg,Null] -> do- let sig = oidPubKey pkalg- case sig of- PubKeyALG_RSA -> either (throwError) (return . PubKeyRSA) (parse_RSA bits)- _ -> return $ PubKeyUnknown pkalg $ L.unpack bits- [OID pkalg,OID _] -> do- let sig = oidPubKey pkalg- case sig of- PubKeyALG_ECDSA -> parse_ECDSA bits- _ -> return $ PubKeyUnknown pkalg $ L.unpack bits- [OID pkalg,Start Sequence,IntVal p,IntVal q,IntVal g,End Sequence] -> do- let sig = oidPubKey pkalg- case decodeASN1 BER bits of- Right [IntVal dsapub] -> return $ PubKeyDSA $ DSA.PublicKey- { DSA.public_params = (p, q, g), DSA.public_y = dsapub }- _ -> return $ PubKeyUnknown pkalg $ L.unpack bits- n ->- throwError ("subject public key bad format : " ++ show n)+ l <- getNextContainer Sequence+ bits <- getNextBitString+ case l of+ (OID pkalg):xs -> toKey (oidPubKey pkalg) xs bits+ _ -> throwError ("subject public unknown key format : " ++ show l)+ where toKey PubKeyALG_RSA _ bits = do+ either (throwError) (return . PubKeyRSA) (parse_RSA bits)+ toKey PubKeyALG_ECDSA xs bits = do+ case xs of+ [(OID [1,3,132,0,34])] -> return $ PubKeyECDSA ECDSA_Hash_SHA384 bits+ _ -> return $ PubKeyUnknown (pubkeyalgOID PubKeyALG_ECDSA) $ L.unpack bits+ toKey PubKeyALG_DSA [Start Sequence,IntVal p,IntVal q,IntVal g,End Sequence] bits = do+ case decodeASN1 BER bits of+ Right [IntVal dsapub] -> return $ PubKeyDSA $ DSA.PublicKey+ { DSA.public_params = (p, q, g)+ , DSA.public_y = dsapub }+ _ -> return $ PubKeyUnknown (pubkeyalgOID PubKeyALG_DSA) $ L.unpack bits+ toKey (PubKeyALG_Unknown oid) _ bits = return $ PubKeyUnknown oid $ L.unpack bits+ toKey other _ bits = return $ PubKeyUnknown (pubkeyalgOID other) $ L.unpack bits - where getNextBitString = getNext >>= \bs -> case bs of+ getNextBitString = getNext >>= \bs -> case bs of BitString bits -> return $ bitArrayGetData bits _ -> throwError "expecting bitstring"
certificate.cabal view
@@ -1,5 +1,5 @@ Name: certificate-Version: 1.2.7+Version: 1.2.8 Description: Certificates and Key reader/writer .