botan-low-0.0.1.0: src/Botan/Low/X509/CRL.hs
module Botan.Low.X509.CRL where
import Botan.Low.Error
import Botan.Low.Make
import Botan.Low.Prelude
import Botan.Low.X509
import Botan.Low.X509.Extensions
import Botan.Bindings.X509
import Botan.Bindings.X509.Extensions
import Botan.Bindings.X509.CRL
import Botan.Low.X509.CSR (X509IssuerDN)
--
-- CRL
--
-- TODO: Eventually move original / read-only CRL functions here too
x509CRLGetRevoked :: X509CRL -> IO [X509CRLEntry]
x509CRLGetRevoked crl = withX509CRL crl $ \ crlPtr -> do
-- TODO: Some sort of allocArrayQuerying
undefined
x509CRLGetIssuerDN :: X509CRL -> ByteString -> Int -> IO X509IssuerDN
x509CRLGetIssuerDN crl key index = withX509CRL crl $ \ crlPtr -> do
asBytes key $ \ keyPtr -> do
allocBytesQuerying $ \ outPtr outLen -> botan_x509_crl_get_issuer_dn
outPtr
outLen
crlPtr
keyPtr
(fromIntegral index)
x509CRLExtensions :: X509CRL -> IO X509Extensions
x509CRLExtensions crl = withX509CRL crl $ \ crlPtr -> mkInit
MkX509Extensions
(\ ptr -> botan_x509_crl_extensions ptr crlPtr)
botan_x509_exts_destroy
x509CRLAuthorityKeyId :: X509CRL -> IO ByteString
x509CRLAuthorityKeyId crl = withX509CRL crl $ \ crlPtr -> do
allocBytesQuerying $ \ outPtr outLen -> botan_x509_crl_authority_key_id
outPtr outLen
crlPtr
x509CRLSerialNumber :: X509CRL -> IO Word32
x509CRLSerialNumber crl = withX509CRL crl $ \ crlPtr -> do
alloca $ \ snPtr -> do
throwBotanIfNegative_ $ botan_x509_crl_serial_number snPtr crlPtr
peek snPtr
x509CRLThisUpdate :: X509CRL -> IO Word64
x509CRLThisUpdate crl = withX509CRL crl $ \ crlPtr -> do
alloca $ \ timePtr -> do
throwBotanIfNegative_ $ botan_x509_crl_this_update timePtr crlPtr
peek timePtr
x509CRLNextUpdate :: X509CRL -> IO Word64
x509CRLNextUpdate crl = withX509CRL crl $ \ crlPtr -> do
alloca $ \ timePtr -> do
throwBotanIfNegative_ $ botan_x509_crl_next_update timePtr crlPtr
peek timePtr
x509CRLIssuingDistributionPoint :: X509CRL -> IO ByteString
x509CRLIssuingDistributionPoint crl = withX509CRL crl $ \ crlPtr -> do
allocBytesQuerying $ \ outPtr outLen -> botan_x509_crl_issuing_distribution_point
outPtr outLen
crlPtr
x509CRLCreateDER :: ByteString -> IO X509CRL
x509CRLCreateDER der = do
asBytesLen der $ \ derPtr derLen -> mkInit
MkX509CRL
(\ptr -> botan_x509_crl_create_der ptr derPtr derLen)
botan_x509_crl_destroy
x509CRLCreate :: X509IssuerDN -> Word64 -> Word64 -> [X509CRLEntry] -> IO X509CRL
x509CRLCreate der this next entries = do
-- TODO: withArray, ownership transfer
-- asBytesLen der $ \ derPtr derLen -> mkInit
-- MkX509CRL
-- (\ptr -> botan_x509_crl_create ptr derPtr derLen)
-- botan_x509_crl_destroy
undefined
x509CRLAddEntry :: X509CRL -> X509CRLEntry -> IO ()
x509CRLAddEntry crl entry = undefined
x509CRLRevokeCert :: X509CRL -> X509Cert -> X509CRLCode -> IO ()
x509CRLRevokeCert crl entry reason = undefined
--
-- CRL Entry
--
newtype X509CRLEntry = MkX509CRLEntry { getX509CRLEntryForeignPtr :: ForeignPtr X509CRLEntryStruct }
withX509CRLEntryPtr :: X509CRLEntry -> (X509CRLEntryPtr -> IO a) -> IO a
withX509CRLEntryPtr = withForeignPtr . getX509CRLEntryForeignPtr
x509CRLEntryDestroy :: X509CRLEntry -> IO ()
x509CRLEntryDestroy crl = finalizeForeignPtr (getX509CRLEntryForeignPtr crl)
type X509CRLCode = Word32
-- Must match values of CRL_Code in pkix_enums.h
pattern BOTAN_X509_CRL_CODE_UNSPECIFIED = 0 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_KEY_COMPROMISE = 1 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_CA_COMPROMISE = 2 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_AFFILIATION_CHANGED = 3 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_SUPERCEDED = 4 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_CESSATION_OF_OPERATION = 5 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_CERTIFICATE_HOLD = 6 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_REMOVE_FROM_CRL = 8 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_PRIVILEGE_WITHDRAWN = 9 :: X509CRLCode
pattern BOTAN_X509_CRL_CODE_AA_COMPROMISE = 10 :: X509CRLCode
x509CRLEntryCreate :: X509Cert -> X509CRLCode -> IO X509CRLEntry
x509CRLEntryCreate cert crl_code = do
withX509Cert cert $ \ certPtr -> mkInit
MkX509CRLEntry
(\ptr -> botan_x509_crl_entry_create ptr certPtr crl_code)
botan_x509_crl_entry_destroy
-- -- TODO: CRL_Entry PEM / BER encode / decode (and for CRL too)
-- NOTE: Is bytestring serial number vs MP serial number elsewhere - need to consistentize
x509CRLEntryGetSerialNumber :: X509CRLEntry -> IO ByteString
x509CRLEntryGetSerialNumber entry = withX509CRLEntryPtr entry $ \ entryPtr -> do
allocBytesQuerying $ \ outPtr szPtr -> do
botan_x509_crl_entry_get_serial_number outPtr szPtr entryPtr
x509CRLEntryGetExpireTime :: X509CRLEntry -> IO Word64
x509CRLEntryGetExpireTime entry = withX509CRLEntryPtr entry $ \ entryPtr -> do
alloca $ \ outPtr -> do
throwBotanIfNegative_ $ botan_x509_crl_entry_get_expire_time outPtr entryPtr
peek outPtr
x509CRLEntryGetReasonCode :: X509CRLEntry -> IO X509CRLCode
x509CRLEntryGetReasonCode entry = withX509CRLEntryPtr entry $ \ entryPtr -> do
alloca $ \ outPtr -> do
throwBotanIfNegative_ $ botan_x509_crl_entry_get_reason_code outPtr entryPtr
peek outPtr
x509CRLEntryGetExtensions :: X509CRLEntry -> IO X509Extensions
x509CRLEntryGetExtensions entry = withX509CRLEntryPtr entry $ \ entryPtr -> do
mkInit
MkX509Extensions
(\ ptr -> botan_x509_crl_entry_get_extensions ptr entryPtr)
botan_x509_exts_destroy