-- | Hybrid Public Key Encryption (RFC9180).
module Crypto.HPKE (
    -- * IDs
    KEM_ID (..),
    KDF_ID (..),
    AEAD_ID (..),

    -- * Setup

    -- ** For mode_base and mode_auth
    setupBaseS,
    setupBaseR,

    -- ** For mode_psk and mode_auth_psk
    setupPSKS,
    setupPSKR,

    -- * Encryption and Decyption
    seal,
    open,

    -- * Secret export
    exportS,
    exportR,

    -- * Types
    ContextS,
    ContextR,
    EncodedSecretKey (..),
    EncodedPublicKey (..),
    SharedSecret (..),
    Info,
    PSK,
    PSK_ID,
    AAD,
    PlainText,
    CipherText,
    Key,

    -- * Error
    HPKEError (..),

    -- * Misc
    nEnc,
    nTag,
) where

import Crypto.HPKE.Context
import Crypto.HPKE.ID
import Crypto.HPKE.Setup
import Crypto.HPKE.Types

-- | Length of "enc", aka sender's public key.
{- FOURMOLU_DISABLE -}
nEnc :: KEM_ID -> Int
nEnc :: KEM_ID -> Int
nEnc KEM_ID
DHKEM_P256_HKDF_SHA256   =  Int
65
nEnc KEM_ID
DHKEM_P384_HKDF_SHA384   =  Int
97
nEnc KEM_ID
DHKEM_P521_HKDF_SHA512   = Int
133
nEnc KEM_ID
DHKEM_X25519_HKDF_SHA256 =  Int
32
nEnc KEM_ID
DHKEM_X448_HKDF_SHA512   =  Int
56
nEnc KEM_ID
_                        =  Int
0
{- FOURMOLU_ENABLE -}

-- | Length of AEAD tag.
{- FOURMOLU_DISABLE -}
nTag :: AEAD_ID -> Int
nTag :: AEAD_ID -> Int
nTag AEAD_ID
AES_128_GCM      = Int
16
nTag AEAD_ID
AES_256_GCM      = Int
16
nTag AEAD_ID
ChaCha20Poly1305 = Int
16
nTag AEAD_ID
_                =  Int
0
{- FOURMOLU_ENABLE -}