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

{-# LANGUAGE CApiFFI #-}

module Botan.Bindings.PubKey.DSA where

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

{- |
Generates DSA key pair. Gives to a caller control over key length
and order of a subgroup 'q'.
-}
foreign import capi safe "botan/ffi.h botan_privkey_create_dsa"
    botan_privkey_create_dsa
        :: Ptr BotanPrivKey    -- ^ __key__: handler to the resulting key
        -> BotanRNG            -- ^ __rng__: initialized PRNG
        -> CSize               -- ^ __pbits__: length of the key in bits. Must be between in range (1024, 3072)
                               --   and multiple of 64. Bit size of the prime 'p'
        -> CSize               -- ^ __qbits__: qbits order of the subgroup. Must be in range (160, 256) and multiple
                               --   of 8
        -> 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

foreign import capi safe "botan/ffi.h botan_privkey_load_dsa"
    botan_privkey_load_dsa
        :: Ptr BotanPrivKey    -- ^ __key__
        -> BotanMP             -- ^ __p__
        -> BotanMP             -- ^ __q__
        -> BotanMP             -- ^ __g__
        -> BotanMP             -- ^ __x__
        -> IO CInt

foreign import capi safe "botan/ffi.h botan_pubkey_load_dsa"
    botan_pubkey_load_dsa
        :: Ptr BotanPubKey    -- ^ __key__
        -> BotanMP            -- ^ __p__
        -> BotanMP            -- ^ __q__
        -> BotanMP            -- ^ __g__
        -> BotanMP            -- ^ __y__
        -> IO CInt