certificate 1.2.2 → 1.2.3
raw patch · 3 files changed
+38/−20 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Certificate.KeyRSA: decodePublic :: ByteString -> Either String PublicKey
+ Data.Certificate.KeyRSA: parse_RSA :: ByteString -> Either String PublicKey
Files
- Data/Certificate/KeyRSA.hs +33/−1
- Data/Certificate/X509/Cert.hs +3/−17
- certificate.cabal +2/−2
Data/Certificate/KeyRSA.hs view
@@ -9,15 +9,32 @@ -- module Data.Certificate.KeyRSA- ( decodePrivate+ ( decodePublic+ , decodePrivate , encodePrivate+ , parse_RSA ) where import Data.ASN1.DER (encodeASN1Stream, ASN1(..), ASN1ConstructionType(..)) import Data.ASN1.BER (decodeASN1Stream)+import Data.ASN1.BitArray import qualified Data.ByteString.Lazy as L import qualified Crypto.Types.PubKey.RSA as RSA +parsePublic :: [ASN1] -> Either String RSA.PublicKey+parsePublic+ [ Start Sequence+ , Start Sequence+ , OID [1,2,840,113549,1,1,1] -- PubKeyALG_RSA+ , Null+ , End Sequence+ , BitString (BitArray _ as1n)+ , End Sequence ] = parse_RSA as1n+parsePublic _ = Left "unexpected format"++decodePublic :: L.ByteString -> Either String RSA.PublicKey+decodePublic dat = either (Left . show) parsePublic $ decodeASN1Stream dat+ parsePrivate :: [ASN1] -> Either String (RSA.PublicKey, RSA.PrivateKey) parsePrivate [ Start Sequence@@ -70,3 +87,18 @@ , IntVal $ fromIntegral $ RSA.private_qinv privkey , End Sequence ]++{- | parse a RSA pubkeys from ASN1 encoded bits.+ - return RSA.PublicKey (len-modulus, modulus, e) if successful -}+parse_RSA :: L.ByteString -> Either String RSA.PublicKey+parse_RSA bits =+ case decodeASN1Stream $ bits of+ Right [Start Sequence, IntVal modulus, IntVal pubexp, End Sequence] ->+ Right $ RSA.PublicKey+ { RSA.public_size = calculate_modulus modulus 1+ , RSA.public_n = modulus+ , RSA.public_e = pubexp+ }+ _ -> Left "bad RSA format"+ where+ calculate_modulus n i = if (2 ^ (i * 8)) > n then i else calculate_modulus n (i+1)
Data/Certificate/X509/Cert.hs view
@@ -44,6 +44,8 @@ import qualified Crypto.Types.PubKey.RSA as RSA import qualified Crypto.Types.PubKey.DSA as DSA +import Data.Certificate.KeyRSA (parse_RSA)+ data HashALG = HashMD2 | HashMD5@@ -110,22 +112,6 @@ oidOrganization = [2,5,4,10] oidOrganizationUnit = [2,5,4,11] -{- | parse a RSA pubkeys from ASN1 encoded bits.- - return PubKeyRSA (len-modulus, modulus, e) if successful -}-parse_RSA :: ByteString -> ParseASN1 PubKey-parse_RSA bits =- case decodeASN1Stream $ bits of- Right [Start Sequence, IntVal modulus, IntVal pubexp, End Sequence] ->- return $ PubKeyRSA $ RSA.PublicKey- { RSA.public_size = calculate_modulus modulus 1- , RSA.public_n = modulus- , RSA.public_e = pubexp- }- _ ->- throwError ("bad RSA format")- where- calculate_modulus n i = if (2 ^ (i * 8)) > n then i else calculate_modulus n (i+1)- parse_ECDSA :: ByteString -> ParseASN1 PubKey parse_ECDSA bits = case decodeASN1Stream bits of@@ -249,7 +235,7 @@ [OID pkalg,Null] -> do let sig = oidPubKey pkalg case sig of- PubKeyALG_RSA -> parse_RSA bits+ PubKeyALG_RSA -> either (throwError) (return . PubKeyRSA) (parse_RSA bits) _ -> return $ PubKeyUnknown pkalg $ L.unpack bits [OID pkalg,OID _] -> do let sig = oidPubKey pkalg
certificate.cabal view
@@ -1,5 +1,5 @@ Name: certificate-Version: 1.2.2+Version: 1.2.3 Description: Certificates and Key reader/writer .@@ -31,7 +31,7 @@ , mtl , pem >= 0.1 && < 0.2 , asn1-data >= 0.6.1.3 && < 0.7- , crypto-pubkey-types+ , crypto-pubkey-types >= 0.1 && < 0.2 , directory , process , time