module Crypto.PubKey.DH
( Params(..)
, PublicNumber
, PrivateNumber
, SharedKey
, generateParams
, generatePrivate
, generatePublic
, getShared
) where
import Crypto.Number.ModArithmetic (exponantiation)
import Crypto.Number.Prime (generateSafePrime)
import Crypto.Number.Generate (generateOfSize)
import Crypto.Types.PubKey.DH
import Crypto.Random.API
import Control.Arrow (first)
generateParams :: CPRG g => g -> Int -> Integer -> (Params, g)
generateParams rng bits generator =
first (\p -> Params p generator) $ generateSafePrime rng bits
generatePrivate :: CPRG g => g -> Int -> (PrivateNumber, g)
generatePrivate rng bits = first PrivateNumber $ generateOfSize rng bits
generatePublic :: Params -> PrivateNumber -> PublicNumber
generatePublic (Params p g) (PrivateNumber x) = PublicNumber $ exponantiation g x p
getShared :: Params -> PrivateNumber -> PublicNumber -> SharedKey
getShared (Params p _) (PrivateNumber x) (PublicNumber y) = SharedKey $ exponantiation y x p