packages feed

tls-extra-0.1.0: Network/TLS/Extra/Certificate.hs

module Network.TLS.Extra.Certificate
	(
	) where
{-

import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as LC
import qualified Data.ByteString as B
--import qualified Data.Text.Lazy as T
--import Data.Text.Lazy.Encoding (decodeUtf8)

import Data.Certificate.PEM
import Data.Certificate.X509
import System.Certificate.X509 as SysCert

import Control.Monad
import Control.Applicative ((<$>))

-- for signing/verifying certificate
import qualified Crypto.Hash.SHA1 as SHA1
import qualified Crypto.Hash.MD2 as MD2
import qualified Crypto.Hash.MD5 as MD5
import qualified Crypto.Cipher.RSA as RSA
import qualified Crypto.Cipher.DSA as DSA

verifyCert x509@(X509.X509 cert _ sigalg sig) = do
	sysx509 <- SysCert.findCertificate (matchsysX509 cert)
	case sysx509 of
		Nothing                        -> putStrLn "couldn't find signing certificate"
		Just (X509.X509 syscert _ _ _) -> do
			verifyAlg (B.concat $ L.toChunks $ X509.getSigningData x509)
			          (B.pack sig)
			          sigalg
			          (X509.certPubKey syscert)

rsaVerify h hdesc pk a b = either (Left . show) (Right) $ RSA.verify h hdesc pk a b

verifyF X509.SignatureALG_md2WithRSAEncryption (X509.PubKeyRSA rsakey) =
	rsaVerify MD2.hash (B.pack [0x30,0x20,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x04,0x10]) (mkRSA rsakey)

verifyF X509.SignatureALG_md5WithRSAEncryption (X509.PubKeyRSA rsakey) =
	rsaVerify MD5.hash (B.pack [0x30,0x20,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x04,0x10]) (mkRSA rsakey)

verifyF X509.SignatureALG_sha1WithRSAEncryption (X509.PubKeyRSA rsakey) =
	rsaVerify SHA1.hash (B.pack [0x30,0x20,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x04,0x10]) (mkRSA rsakey)

verifyF X509.SignatureALG_dsaWithSHA1 (X509.PubKeyDSA (pub,p,q,g)) =
	(\_ _ -> Left "unimplemented DSA checking")

verifyF _ _ =
	(\_ _ -> Left "unexpected/wrong signature")

mkRSA (lenmodulus, modulus, e) =
	RSA.PublicKey { RSA.public_sz = lenmodulus, RSA.public_n = modulus, RSA.public_e = e }

verifyAlg toSign expectedSig sigalg pk =
	let f = verifyF sigalg pk in
	case f toSign expectedSig of
		Left err    -> putStrLn ("certificate couldn't be verified: something happened: " ++ show err)
		Right True  -> putStrLn "certificate verified"
		Right False -> putStrLn "certificate not verified"

matchsysX509 cert (X509.X509 syscert _ _ _) = do
	let x = X509.certSubjectDN syscert
	let y = X509.certIssuerDN cert
	x == y
-}