-----------------------------------------------------------------------------
-- |
-- Module      :  Crypto.ECC.Weierstrass.ECDH
-- Copyright   :  (c) Marcel Fourné 20[09..]
-- License     :  BSD3
-- Maintainer  :  Marcel Fourné (haskell@marcelfourne.de)
-- Stability   :  experimental
-- Portability :  Good
--
-- basic ECDH, for testing only
--
-----------------------------------------------------------------------------

{-# OPTIONS_GHC -O2 -feager-blackholing #-}
{-# LANGUAGE Safe #-}

module Crypto.ECC.Weierstrass.ECDH ( basicecdh
                                   , EC
                                   , ECPF
                                   )
    where

import safe Crypto.ECC.Weierstrass.Internal

-- private key dA of this side and public key qB of the communication partner, returning the simple x coordinate as result
-- to be executed on both sides with fitting parameters...
-- d = pickOne [1..N-1]
-- q = pmul G d
-- | basic ecdh for testing
basicecdh :: EC Integer -> ECPF Integer -> Integer -> Integer
basicecdh :: EC Integer -> ECPF Integer -> Integer -> Integer
basicecdh EC Integer
c ECPF Integer
qB Integer
dA = if forall a. EC a -> ECPF a -> Bool
ison EC Integer
c ECPF Integer
qB then forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. EC a -> ECPF a -> (Integer, Integer)
affine EC Integer
c forall a b. (a -> b) -> a -> b
$ forall a. EC a -> ECPF a -> Integer -> ECPF a
pmul EC Integer
c ECPF Integer
qB Integer
dA
                    else forall a. HasCallStack => [Char] -> a
error [Char]
"point not on curve"