packages feed

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

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

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

Provides the 'KeyUsage' extension type.
-}
module Data.Rfc5280.KeyUsage
  ( KeyUsageBit (..)
  , KeyUsage
  )
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 @KeyUsage@

See <https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 RFC 5280 §4.2.1.3>.
-}
data KeyUsageBit
  = {- | Verifying digital signatures other than signatures on certificates or
    CRLs. Renders as @\"digitalSignature\"@.
    -}
    DigitalSignature
  | {- | Verifying digital signatures to provide non-repudiation of signing
    actions (also called @contentCommitment@). Renders as @\"nonRepudiation\"@.
    -}
    NonRepudiation
  | {- | Enciphering private or secret keys (key transport). Renders as
    @\"keyEncipherment\"@.
    -}
    KeyEncipherment
  | {- | Directly enciphering raw user data without an intermediate symmetric
    cipher. Renders as @\"dataEncipherment\"@.
    -}
    DataEncipherment
  | {- | Key agreement protocols (e.g. Diffie-Hellman). Renders as
    @\"keyAgreement\"@.
    -}
    KeyAgreement
  | {- | Verifying signatures on public-key certificates. Renders as
    @\"keyCertSign\"@.
    -}
    KeyCertSign
  | {- | Verifying signatures on certificate revocation lists. Renders as
    @\"cRLSign\"@.
    -}
    CRLSign
  | {- | Enciphering data only during key agreement (used with 'KeyAgreement').
    Renders as @\"encipherOnly\"@.
    -}
    EncipherOnly
  | {- | Deciphering data only during key agreement (used with 'KeyAgreement').
    Renders as @\"decipherOnly\"@.
    -}
    DecipherOnly
  deriving (Eq, Show, Ord, Enum, Bounded)


instance RenderConfig KeyUsageBit where
  renderBuilder DigitalSignature = "digitalSignature"
  renderBuilder NonRepudiation = "nonRepudiation"
  renderBuilder KeyEncipherment = "keyEncipherment"
  renderBuilder DataEncipherment = "dataEncipherment"
  renderBuilder KeyAgreement = "keyAgreement"
  renderBuilder KeyCertSign = "keyCertSign"
  renderBuilder CRLSign = "cRLSign"
  renderBuilder EncipherOnly = "encipherOnly"
  renderBuilder DecipherOnly = "decipherOnly"


{- | Represents the 'KeyUsage' extension

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


instance HasOID KeyUsage where
  extensionOID _ = 2 :| [5, 29, 15]


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