packages feed

data-rfc5280-0.1.0.0: src/Data/Rfc5280/ExtKeyUsage.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}

{- |
Module      : Data.Rfc5280.ExtKeyUsage
Copyright   : (c) 2026 Tim Emiola
Maintainer  : Tim Emiola <adetokunbo@emio.la>
SPDX-License-Identifier: BSD3

Provides the 'ExtKeyUsage' extension type.
-}
module Data.Rfc5280.ExtKeyUsage
  ( ExtKeyUsagePurpose (..)
  , ExtKeyUsage
  )
where

import Data.List.NonEmpty (NonEmpty (..))
import Data.Rfc5280.HasOID (HasOID (..))
import Data.Rfc5280.Internal (RenderConfig (..), intersperseCommas)
import qualified Data.Set.NonEmpty as NES


{- | Represents the bits that can set for @ExtKeyUsage@

See <https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.12 RFC 5280 §4.2.1.12>.
-}
data ExtKeyUsagePurpose
  = -- | TLS WWW server authentication. Renders as @\"serverAuth\"@.
    ServerAuth
  | -- | TLS WWW client authentication. Renders as @\"clientAuth\"@.
    ClientAuth
  | -- | Signing of downloadable executable code. Renders as @\"codeSigning\"@.
    CodeSigning
  | -- | Email protection (S\/MIME). Renders as @\"emailProtection\"@.
    EmailProtection
  | {- | Binding an object hash to a trusted time source. Renders as
    @\"timeStamping\"@.
    -}
    TimeStamping
  | -- | Signing OCSP responses. Renders as @\"OCSPSigning\"@ (capital OCSP).
    OCSPSigning
  | {- | Permits any extended key usage purpose. Renders as
    @\"anyExtendedKeyUsage\"@ (lowercase @any@).
    -}
    AnyExtendedKeyUsage
  deriving (Eq, Show, Ord, Enum, Bounded)


instance RenderConfig ExtKeyUsagePurpose where
  renderBuilder ServerAuth = "serverAuth"
  renderBuilder ClientAuth = "clientAuth"
  renderBuilder CodeSigning = "codeSigning"
  renderBuilder EmailProtection = "emailProtection"
  renderBuilder TimeStamping = "timeStamping"
  renderBuilder OCSPSigning = "OCSPSigning"
  renderBuilder AnyExtendedKeyUsage = "anyExtendedKeyUsage"


{- | Represents the @ExtKeyUsage@ extension

See <https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.12 RFC 5280 §4.2.1.12>.
-}
type ExtKeyUsage = NES.NESet ExtKeyUsagePurpose


instance HasOID ExtKeyUsage where
  extensionOID _ = 2 :| [5, 29, 37]


instance RenderConfig ExtKeyUsage where
  renderBuilder = intersperseCommas . fmap renderBuilder . NES.toList