{-|
Module      : Botan.Bindings.PubKey.ElGamal
Description : Algorithm specific key operations: ElGamal
Copyright   : (c) Leo D, 2023
License     : BSD-3-Clause
Maintainer  : leo@apotheca.io
Stability   : experimental
Portability : POSIX
-}

{-# LANGUAGE CApiFFI #-}

module Botan.Bindings.PubKey.ElGamal where

import Botan.Bindings.MPI
import Botan.Bindings.Prelude
import Botan.Bindings.PubKey
import Botan.Bindings.RNG

{- |
Generates ElGamal key pair. Caller has a control over key length
and order of a subgroup 'q'. Function is able to use two types of
primes:

   * if pbits-1 == qbits then safe primes are used for key generation

   * otherwise generation uses group of prime order
-}
foreign import capi safe "botan/ffi.h botan_privkey_create_elgamal"
    botan_privkey_create_elgamal
        :: Ptr BotanPrivKey    -- ^ __key__: handler to the resulting key
        -> BotanRNG            -- ^ __rng__: initialized PRNG
        -> CSize               -- ^ __pbits__: length of the key in bits. Must be at least 1024
        -> CSize               -- ^ __qbits__: order of the subgroup. Must be at least 160
        -> IO CInt             -- ^ - BOTAN_FFI_SUCCESS Success, `key' initialized with DSA key
                               --   - BOTAN_FFI_ERROR_NULL_POINTER  either `key' or `rng' is NULL
                               --   - BOTAN_FFI_ERROR_BAD_PARAMETER unexpected value for either `pbits' or `qbits'
                               --   - BOTAN_FFI_ERROR_NOT_IMPLEMENTED functionality not implemented

-- | Loads ElGamal private key
foreign import capi safe "botan/ffi.h botan_pubkey_load_elgamal"
    botan_pubkey_load_elgamal
        :: Ptr BotanPubKey    -- ^ __key__: variable populated with key material
        -> BotanMP            -- ^ __p__: prime order of a Z_p group
        -> BotanMP            -- ^ __g__: group generator
        -> BotanMP            -- ^ __y__: private key
        -> IO CInt            -- ^ 0 on success, a negative value on failure

-- | Loads ElGamal public key
foreign import capi safe "botan/ffi.h botan_privkey_load_elgamal"
    botan_privkey_load_elgamal
        :: Ptr BotanPrivKey    -- ^ __key__: variable populated with key material
        -> BotanMP             -- ^ __p__: prime order of a Z_p group
        -> BotanMP             -- ^ __g__: group generator
        -> BotanMP             -- ^ __x__: public key
        -> IO CInt             -- ^ 0 on success, a negative value on failure