packages feed

botan-low-0.0.1.0: src/Botan/Low/X509/Options.hs

module Botan.Low.X509.Options where

import Data.Bool

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.Options

-- /*
-- * X.509 certificate options
-- **************************/

newtype X509CertOptions = MkX509CertOptions { getX509CertOptionsForeignPtr :: ForeignPtr X509CertOptionsStruct }

withX509CertOptionsPtr :: X509CertOptions -> (X509CertOptionsPtr -> IO a) -> IO a
withX509CertOptionsPtr = withForeignPtr . getX509CertOptionsForeignPtr

x509CertOptionsDestroy :: X509CertOptions -> IO ()
x509CertOptionsDestroy opts = finalizeForeignPtr (getX509CertOptionsForeignPtr opts)

x509CertOptionsCreate :: IO X509CertOptions
x509CertOptionsCreate = mkInit MkX509CertOptions botan_x509_cert_options_create botan_x509_cert_options_destroy

x509CertOptionsCreateCommon
    :: ByteString
    -> ByteString
    -> ByteString
    -> ByteString
    -> Word32
    -> IO X509CertOptions
x509CertOptionsCreateCommon common_name country org org_unit expiration_time = do
    alloca $ \ outPtr -> do
        asCString common_name $ \ cnPtr -> do
            asCString country $ \ countryPtr -> do
                asCString org $ \ orgPtr -> do
                    asCString org_unit $ \ orgUnitPtr -> do
                        throwBotanIfNegative_ $ botan_x509_cert_options_create_common outPtr
                            cnPtr
                            countryPtr
                            orgPtr
                            orgUnitPtr
                            expiration_time
        out <- peek outPtr
        foreignPtr <- newForeignPtr botan_x509_cert_options_destroy out
        return $ MkX509CertOptions foreignPtr

x509CertOptionsSetCommonName :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetCommonName = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_common_name

x509CertOptionsSetCountry :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetCountry = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_country

x509CertOptionsSetOrg :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetOrg = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_organization

x509CertOptionsSetOrgUnit :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetOrgUnit = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_org_unit

x509CertOptionsSetMoreOrgUnits :: X509CertOptions -> [ByteString] -> IO ()
x509CertOptionsSetMoreOrgUnits opts more_org_units = withX509CertOptionsPtr opts $ \ optsPtr -> do
    withPtrs asCString more_org_units $ \ morePtrs -> do
        allocaArray moreLen $ \ (morePtrArrayPtr :: Ptr (Ptr CChar)) -> do
            pokeArray morePtrArrayPtr morePtrs
            throwBotanIfNegative_ $ botan_x509_cert_options_set_more_org_units
                optsPtr
                morePtrArrayPtr
                (fromIntegral moreLen)
    where
        moreLen = length more_org_units

x509CertOptionsSetLocality :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetLocality = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_locality

x509CertOptionsSetState :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetState = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_state

x509CertOptionsSetSerialNumber :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetSerialNumber = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_serial_number

x509CertOptionsSetEmail :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetEmail = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_email

x509CertOptionsSetURI :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetURI = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_uri

x509CertOptionsSetIP :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetIP = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_ip

x509CertOptionsSetDNS :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetDNS = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_dns

x509CertOptionsSetMoreDNS :: X509CertOptions -> [ByteString] -> IO ()
x509CertOptionsSetMoreDNS opts more_dns = withX509CertOptionsPtr opts $ \ optsPtr -> do
    withPtrs asCString more_dns $ \ morePtrs -> do
        allocaArray moreLen $ \ (morePtrArrayPtr :: Ptr (Ptr CChar)) -> do
            pokeArray morePtrArrayPtr morePtrs
            throwBotanIfNegative_ $ botan_x509_cert_options_set_more_dns
                optsPtr
                morePtrArrayPtr
                (fromIntegral moreLen)
    where
        moreLen = length more_dns

x509CertOptionsSetXMPP :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetXMPP = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_xmpp

x509CertOptionsSetChallenge :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetChallenge = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_challenge

x509CertOptionsSetStart :: X509CertOptions -> Word64 -> IO ()
x509CertOptionsSetStart = mkSet withX509CertOptionsPtr botan_x509_cert_options_set_start

x509CertOptionsSetEnd :: X509CertOptions -> Word64 -> IO ()
x509CertOptionsSetEnd = mkSet withX509CertOptionsPtr botan_x509_cert_options_set_end

-- // TODO: Convenience functions for set_start_duration, set_expires

x509CertOptionsSetIsCA :: X509CertOptions -> Bool -> IO ()
x509CertOptionsSetIsCA = mkSetOn withX509CertOptionsPtr (CBool . bool 0 1) botan_x509_cert_options_set_is_ca

x509CertOptionsSetPathLimit :: X509CertOptions -> Int -> IO ()
x509CertOptionsSetPathLimit = mkSetCSize withX509CertOptionsPtr botan_x509_cert_options_set_path_limit

x509CertOptionsSetPaddingScheme :: X509CertOptions -> ByteString -> IO ()
x509CertOptionsSetPaddingScheme = mkSetCString withX509CertOptionsPtr botan_x509_cert_options_set_padding_scheme

-- NOTE: Should probably be Word rather than Int
x509CertOptionsSetKeyConstraints :: X509CertOptions -> Int -> IO ()
x509CertOptionsSetKeyConstraints = mkSetOn withX509CertOptionsPtr fromIntegral botan_x509_cert_options_set_key_constraints

x509CertOptionsSetExConstraints :: X509CertOptions -> [ByteString] -> IO ()
x509CertOptionsSetExConstraints opts exConstraints = withX509CertOptionsPtr opts $ \ optsPtr -> do
    withPtrs asCString exConstraints $ \ exPtrs -> do
        allocaArray exLen $ \ (exPtrArrayPtr :: Ptr (Ptr CChar)) -> do
            pokeArray exPtrArrayPtr exPtrs
            throwBotanIfNegative_ $ botan_x509_cert_options_set_ex_constraints
                optsPtr
                exPtrArrayPtr
                (fromIntegral exLen)
    where
        exLen = length exConstraints

x509CertOptionsSetExtensions :: X509CertOptions -> X509Extensions -> IO ()
x509CertOptionsSetExtensions opts extensions = withX509CertOptionsPtr opts $ \ optsPtr -> do
    withX509ExtensionsPtr extensions $ \ extensionPtr -> do
        throwBotanIfNegative_ $ botan_x509_cert_options_set_extensions
            optsPtr
            extensionPtr

-- TODO: botan_x509_cert_options getters

-- TODO: botan_x509_cert_options functions (above is just members)
-- There's only a few though so its easy