packages feed

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