packages feed

certificate-0.3.2: Certificate.hs

import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString as B
import Data.Certificate.X509
import Data.Certificate.Key
import Data.Certificate.PEM
import System
import Control.Monad
import Data.Maybe

import Data.ASN1.DER

readcert :: FilePath -> IO (Either String Certificate)
readcert file = B.readFile file >>= return . maybe (Left "no valid certificate found") (decodeCertificate . L.fromChunks . (:[])) . parsePEMCert

readprivate :: FilePath -> IO (Either String PrivateKey)
readprivate file = B.readFile file >>= return . maybe (Left "no valid private RSA key found") (decodePrivateKey . L.fromChunks . (:[])) . parsePEMKeyRSA

showCert :: Certificate -> String
showCert cert =
	let ver = certVersion cert in
	let ser = certSerial cert in
	let sigalg = certSignatureAlg cert in
	let idn = certIssuerDN cert in
	let sdn = certSubjectDN cert in
	let valid = certValidity cert in
	let pk = certPubKey cert in
	let exts = certExtensions cert in
	let sig = certSignature cert in
	let other = certOthers cert in

	unlines [
		"version: " ++ show ver,
		"serial:  " ++ show ser,
		"sigalg:  " ++ show sigalg,
		"issuer:  " ++ show idn,
		"subject: " ++ show sdn,
		"valid:   " ++ show valid,
		"pk:      " ++ show pk,
		"exts:    " ++ show exts,
		"sig:     " ++ show sig,
		"other:   " ++ show other ]

showKey :: PrivateKey -> String
showKey key =
	unlines [
		"version:          " ++ (show $ privKey_version key),
		"len-modulus:      " ++ (show $ privKey_lenmodulus key),
		"modulus:          " ++ (show $ privKey_modulus key),
		"public exponant:  " ++ (show $ privKey_public_exponant key),
		"private exponant: " ++ (show $ privKey_private_exponant key),
		"p1:               " ++ (show $ privKey_p1 key),
		"p2:               " ++ (show $ privKey_p2 key),
		"exp1:             " ++ (show $ privKey_exp1 key),
		"exp2:             " ++ (show $ privKey_exp2 key),
		"coefficient:      " ++ (show $ privKey_coef key)
		]

main = do
	args <- getArgs
	case args !! 0 of
		"private" -> do
			c <- readprivate (args !! 1)
			case c of
				Left err   -> error err
				Right cert -> putStrLn $ showKey cert
		"cert" -> do
			c <- readcert (args !! 1)
			case c of
				Left err   -> error err
				Right cert -> putStrLn $ showCert cert