{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Crypto.ECC
( Curve_P256R1(..)
, Curve_P384R1(..)
, Curve_P521R1(..)
, Curve_X25519(..)
, Curve_X448(..)
, Curve_Edwards25519(..)
, EllipticCurve(..)
, EllipticCurveDH(..)
, EllipticCurveArith(..)
, EllipticCurveBasepointArith(..)
, KeyPair(..)
, SharedSecret(..)
) where
import qualified Crypto.PubKey.ECC.P256 as P256
import qualified Crypto.ECC.Edwards25519 as Edwards25519
import qualified Crypto.ECC.Simple.Types as Simple
import qualified Crypto.ECC.Simple.Prim as Simple
import Crypto.Random
import Crypto.Error
import Crypto.Internal.Imports
import Crypto.Internal.ByteArray (ByteArray, ByteArrayAccess, ScrubbedBytes)
import qualified Crypto.Internal.ByteArray as B
import Crypto.Number.Basic (numBits)
import Crypto.Number.Serialize (i2ospOf_, os2ip)
import qualified Crypto.Number.Serialize.LE as LE
import qualified Crypto.PubKey.Curve25519 as X25519
import qualified Crypto.PubKey.Curve448 as X448
import Data.ByteArray (convert)
import Data.Data (Data())
import Data.Kind (Type)
import Data.Proxy
data KeyPair curve = KeyPair
{ KeyPair curve -> Point curve
keypairGetPublic :: !(Point curve)
, KeyPair curve -> Scalar curve
keypairGetPrivate :: !(Scalar curve)
}
newtype SharedSecret = SharedSecret ScrubbedBytes
deriving (SharedSecret -> SharedSecret -> Bool
(SharedSecret -> SharedSecret -> Bool)
-> (SharedSecret -> SharedSecret -> Bool) -> Eq SharedSecret
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SharedSecret -> SharedSecret -> Bool
$c/= :: SharedSecret -> SharedSecret -> Bool
== :: SharedSecret -> SharedSecret -> Bool
$c== :: SharedSecret -> SharedSecret -> Bool
Eq, SharedSecret -> Int
SharedSecret -> Ptr p -> IO ()
SharedSecret -> (Ptr p -> IO a) -> IO a
(SharedSecret -> Int)
-> (forall p a. SharedSecret -> (Ptr p -> IO a) -> IO a)
-> (forall p. SharedSecret -> Ptr p -> IO ())
-> ByteArrayAccess SharedSecret
forall p. SharedSecret -> Ptr p -> IO ()
forall ba.
(ba -> Int)
-> (forall p a. ba -> (Ptr p -> IO a) -> IO a)
-> (forall p. ba -> Ptr p -> IO ())
-> ByteArrayAccess ba
forall p a. SharedSecret -> (Ptr p -> IO a) -> IO a
copyByteArrayToPtr :: SharedSecret -> Ptr p -> IO ()
$ccopyByteArrayToPtr :: forall p. SharedSecret -> Ptr p -> IO ()
withByteArray :: SharedSecret -> (Ptr p -> IO a) -> IO a
$cwithByteArray :: forall p a. SharedSecret -> (Ptr p -> IO a) -> IO a
length :: SharedSecret -> Int
$clength :: SharedSecret -> Int
ByteArrayAccess, SharedSecret -> ()
(SharedSecret -> ()) -> NFData SharedSecret
forall a. (a -> ()) -> NFData a
rnf :: SharedSecret -> ()
$crnf :: SharedSecret -> ()
NFData)
class EllipticCurve curve where
type Point curve :: Type
type Scalar curve :: Type
curveGenerateScalar :: MonadRandom randomly => proxy curve -> randomly (Scalar curve)
curveGenerateKeyPair :: MonadRandom randomly => proxy curve -> randomly (KeyPair curve)
curveSizeBits :: proxy curve -> Int
encodePoint :: ByteArray bs => proxy curve -> Point curve -> bs
decodePoint :: ByteArray bs => proxy curve -> bs -> CryptoFailable (Point curve)
class EllipticCurve curve => EllipticCurveDH curve where
ecdhRaw :: proxy curve -> Scalar curve -> Point curve -> SharedSecret
ecdhRaw proxy curve
prx Scalar curve
s = CryptoFailable SharedSecret -> SharedSecret
forall a. CryptoFailable a -> a
throwCryptoError (CryptoFailable SharedSecret -> SharedSecret)
-> (Point curve -> CryptoFailable SharedSecret)
-> Point curve
-> SharedSecret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. proxy curve
-> Scalar curve -> Point curve -> CryptoFailable SharedSecret
forall curve (proxy :: * -> *).
EllipticCurveDH curve =>
proxy curve
-> Scalar curve -> Point curve -> CryptoFailable SharedSecret
ecdh proxy curve
prx Scalar curve
s
ecdh :: proxy curve -> Scalar curve -> Point curve -> CryptoFailable SharedSecret
class (EllipticCurve curve, Eq (Point curve)) => EllipticCurveArith curve where
pointAdd :: proxy curve -> Point curve -> Point curve -> Point curve
pointNegate :: proxy curve -> Point curve -> Point curve
pointSmul :: proxy curve -> Scalar curve -> Point curve -> Point curve
class (EllipticCurveArith curve, Eq (Scalar curve)) => EllipticCurveBasepointArith curve where
curveOrderBits :: proxy curve -> Int
pointBaseSmul :: proxy curve -> Scalar curve -> Point curve
pointsSmulVarTime :: proxy curve -> Scalar curve -> Scalar curve -> Point curve -> Point curve
pointsSmulVarTime proxy curve
prx Scalar curve
s1 Scalar curve
s2 Point curve
p = proxy curve -> Point curve -> Point curve -> Point curve
forall curve (proxy :: * -> *).
EllipticCurveArith curve =>
proxy curve -> Point curve -> Point curve -> Point curve
pointAdd proxy curve
prx (proxy curve -> Scalar curve -> Point curve
forall curve (proxy :: * -> *).
EllipticCurveBasepointArith curve =>
proxy curve -> Scalar curve -> Point curve
pointBaseSmul proxy curve
prx Scalar curve
s1) (proxy curve -> Scalar curve -> Point curve -> Point curve
forall curve (proxy :: * -> *).
EllipticCurveArith curve =>
proxy curve -> Scalar curve -> Point curve -> Point curve
pointSmul proxy curve
prx Scalar curve
s2 Point curve
p)
encodeScalar :: ByteArray bs => proxy curve -> Scalar curve -> bs
decodeScalar :: ByteArray bs => proxy curve -> bs -> CryptoFailable (Scalar curve)
scalarToInteger :: proxy curve -> Scalar curve -> Integer
scalarFromInteger :: proxy curve -> Integer -> CryptoFailable (Scalar curve)
scalarAdd :: proxy curve -> Scalar curve -> Scalar curve -> Scalar curve
scalarMul :: proxy curve -> Scalar curve -> Scalar curve -> Scalar curve
data Curve_P256R1 = Curve_P256R1
deriving (Int -> Curve_P256R1 -> ShowS
[Curve_P256R1] -> ShowS
Curve_P256R1 -> String
(Int -> Curve_P256R1 -> ShowS)
-> (Curve_P256R1 -> String)
-> ([Curve_P256R1] -> ShowS)
-> Show Curve_P256R1
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_P256R1] -> ShowS
$cshowList :: [Curve_P256R1] -> ShowS
show :: Curve_P256R1 -> String
$cshow :: Curve_P256R1 -> String
showsPrec :: Int -> Curve_P256R1 -> ShowS
$cshowsPrec :: Int -> Curve_P256R1 -> ShowS
Show,Typeable Curve_P256R1
DataType
Constr
Typeable Curve_P256R1
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P256R1 -> c Curve_P256R1)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P256R1)
-> (Curve_P256R1 -> Constr)
-> (Curve_P256R1 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P256R1))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P256R1))
-> ((forall b. Data b => b -> b) -> Curve_P256R1 -> Curve_P256R1)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r)
-> (forall u. (forall d. Data d => d -> u) -> Curve_P256R1 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_P256R1 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1)
-> Data Curve_P256R1
Curve_P256R1 -> DataType
Curve_P256R1 -> Constr
(forall b. Data b => b -> b) -> Curve_P256R1 -> Curve_P256R1
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P256R1 -> c Curve_P256R1
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P256R1
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Curve_P256R1 -> u
forall u. (forall d. Data d => d -> u) -> Curve_P256R1 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P256R1
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P256R1 -> c Curve_P256R1
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P256R1)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P256R1)
$cCurve_P256R1 :: Constr
$tCurve_P256R1 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
gmapMp :: (forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
gmapM :: (forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P256R1 -> m Curve_P256R1
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_P256R1 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Curve_P256R1 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_P256R1 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_P256R1 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P256R1 -> r
gmapT :: (forall b. Data b => b -> b) -> Curve_P256R1 -> Curve_P256R1
$cgmapT :: (forall b. Data b => b -> b) -> Curve_P256R1 -> Curve_P256R1
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P256R1)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P256R1)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_P256R1)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P256R1)
dataTypeOf :: Curve_P256R1 -> DataType
$cdataTypeOf :: Curve_P256R1 -> DataType
toConstr :: Curve_P256R1 -> Constr
$ctoConstr :: Curve_P256R1 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P256R1
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P256R1
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P256R1 -> c Curve_P256R1
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P256R1 -> c Curve_P256R1
$cp1Data :: Typeable Curve_P256R1
Data)
instance EllipticCurve Curve_P256R1 where
type Point Curve_P256R1 = P256.Point
type Scalar Curve_P256R1 = P256.Scalar
curveSizeBits :: proxy Curve_P256R1 -> Int
curveSizeBits proxy Curve_P256R1
_ = Int
256
curveGenerateScalar :: proxy Curve_P256R1 -> randomly (Scalar Curve_P256R1)
curveGenerateScalar proxy Curve_P256R1
_ = randomly (Scalar Curve_P256R1)
forall (randomly :: * -> *).
MonadRandom randomly =>
randomly Scalar
P256.scalarGenerate
curveGenerateKeyPair :: proxy Curve_P256R1 -> randomly (KeyPair Curve_P256R1)
curveGenerateKeyPair proxy Curve_P256R1
_ = Scalar -> KeyPair Curve_P256R1
forall curve.
(Point curve ~ Point, Scalar curve ~ Scalar) =>
Scalar -> KeyPair curve
toKeyPair (Scalar -> KeyPair Curve_P256R1)
-> randomly Scalar -> randomly (KeyPair Curve_P256R1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> randomly Scalar
forall (randomly :: * -> *).
MonadRandom randomly =>
randomly Scalar
P256.scalarGenerate
where toKeyPair :: Scalar -> KeyPair curve
toKeyPair Scalar
scalar = Point curve -> Scalar curve -> KeyPair curve
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (Scalar -> Point
P256.toPoint Scalar
scalar) Scalar
Scalar curve
scalar
encodePoint :: proxy Curve_P256R1 -> Point Curve_P256R1 -> bs
encodePoint proxy Curve_P256R1
_ Point Curve_P256R1
p = bs
forall bs. ByteArray bs => bs
mxy
where
mxy :: forall bs. ByteArray bs => bs
mxy :: bs
mxy = [bs] -> bs
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
[bin] -> bout
B.concat [bs
uncompressed, bs
xy]
where
uncompressed, xy :: bs
uncompressed :: bs
uncompressed = Word8 -> bs
forall a. ByteArray a => Word8 -> a
B.singleton Word8
4
xy :: bs
xy = Point -> bs
forall ba. ByteArray ba => Point -> ba
P256.pointToBinary Point
Point Curve_P256R1
p
decodePoint :: proxy Curve_P256R1 -> bs -> CryptoFailable (Point Curve_P256R1)
decodePoint proxy Curve_P256R1
_ bs
mxy = case bs -> Maybe (Word8, bs)
forall a. ByteArray a => a -> Maybe (Word8, a)
B.uncons bs
mxy of
Maybe (Word8, bs)
Nothing -> CryptoError -> CryptoFailable Point
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_PointSizeInvalid
Just (Word8
m,bs
xy)
| Word8
m Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
4 -> bs -> CryptoFailable Point
forall ba. ByteArrayAccess ba => ba -> CryptoFailable Point
P256.pointFromBinary bs
xy
| Bool
otherwise -> CryptoError -> CryptoFailable Point
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_PointFormatInvalid
instance EllipticCurveArith Curve_P256R1 where
pointAdd :: proxy Curve_P256R1
-> Point Curve_P256R1 -> Point Curve_P256R1 -> Point Curve_P256R1
pointAdd proxy Curve_P256R1
_ Point Curve_P256R1
a Point Curve_P256R1
b = Point -> Point -> Point
P256.pointAdd Point
Point Curve_P256R1
a Point
Point Curve_P256R1
b
pointNegate :: proxy Curve_P256R1 -> Point Curve_P256R1 -> Point Curve_P256R1
pointNegate proxy Curve_P256R1
_ Point Curve_P256R1
p = Point -> Point
P256.pointNegate Point
Point Curve_P256R1
p
pointSmul :: proxy Curve_P256R1
-> Scalar Curve_P256R1 -> Point Curve_P256R1 -> Point Curve_P256R1
pointSmul proxy Curve_P256R1
_ Scalar Curve_P256R1
s Point Curve_P256R1
p = Scalar -> Point -> Point
P256.pointMul Scalar
Scalar Curve_P256R1
s Point
Point Curve_P256R1
p
instance EllipticCurveDH Curve_P256R1 where
ecdhRaw :: proxy Curve_P256R1
-> Scalar Curve_P256R1 -> Point Curve_P256R1 -> SharedSecret
ecdhRaw proxy Curve_P256R1
_ Scalar Curve_P256R1
s Point Curve_P256R1
p = ScrubbedBytes -> SharedSecret
SharedSecret (ScrubbedBytes -> SharedSecret) -> ScrubbedBytes -> SharedSecret
forall a b. (a -> b) -> a -> b
$ Scalar -> Point -> ScrubbedBytes
forall binary. ByteArray binary => Scalar -> Point -> binary
P256.pointDh Scalar
Scalar Curve_P256R1
s Point
Point Curve_P256R1
p
ecdh :: proxy Curve_P256R1
-> Scalar Curve_P256R1
-> Point Curve_P256R1
-> CryptoFailable SharedSecret
ecdh proxy Curve_P256R1
prx Scalar Curve_P256R1
s Point Curve_P256R1
p = SharedSecret -> CryptoFailable SharedSecret
checkNonZeroDH (proxy Curve_P256R1
-> Scalar Curve_P256R1 -> Point Curve_P256R1 -> SharedSecret
forall curve (proxy :: * -> *).
EllipticCurveDH curve =>
proxy curve -> Scalar curve -> Point curve -> SharedSecret
ecdhRaw proxy Curve_P256R1
prx Scalar Curve_P256R1
s Point Curve_P256R1
p)
instance EllipticCurveBasepointArith Curve_P256R1 where
curveOrderBits :: proxy Curve_P256R1 -> Int
curveOrderBits proxy Curve_P256R1
_ = Int
256
pointBaseSmul :: proxy Curve_P256R1 -> Scalar Curve_P256R1 -> Point Curve_P256R1
pointBaseSmul proxy Curve_P256R1
_ = Scalar -> Point
Scalar Curve_P256R1 -> Point Curve_P256R1
P256.toPoint
pointsSmulVarTime :: proxy Curve_P256R1
-> Scalar Curve_P256R1
-> Scalar Curve_P256R1
-> Point Curve_P256R1
-> Point Curve_P256R1
pointsSmulVarTime proxy Curve_P256R1
_ = Scalar -> Scalar -> Point -> Point
Scalar Curve_P256R1
-> Scalar Curve_P256R1 -> Point Curve_P256R1 -> Point Curve_P256R1
P256.pointsMulVarTime
encodeScalar :: proxy Curve_P256R1 -> Scalar Curve_P256R1 -> bs
encodeScalar proxy Curve_P256R1
_ = Scalar Curve_P256R1 -> bs
forall ba. ByteArray ba => Scalar -> ba
P256.scalarToBinary
decodeScalar :: proxy Curve_P256R1 -> bs -> CryptoFailable (Scalar Curve_P256R1)
decodeScalar proxy Curve_P256R1
_ = bs -> CryptoFailable (Scalar Curve_P256R1)
forall ba. ByteArrayAccess ba => ba -> CryptoFailable Scalar
P256.scalarFromBinary
scalarToInteger :: proxy Curve_P256R1 -> Scalar Curve_P256R1 -> Integer
scalarToInteger proxy Curve_P256R1
_ = Scalar -> Integer
Scalar Curve_P256R1 -> Integer
P256.scalarToInteger
scalarFromInteger :: proxy Curve_P256R1
-> Integer -> CryptoFailable (Scalar Curve_P256R1)
scalarFromInteger proxy Curve_P256R1
_ = Integer -> CryptoFailable Scalar
Integer -> CryptoFailable (Scalar Curve_P256R1)
P256.scalarFromInteger
scalarAdd :: proxy Curve_P256R1
-> Scalar Curve_P256R1
-> Scalar Curve_P256R1
-> Scalar Curve_P256R1
scalarAdd proxy Curve_P256R1
_ = Scalar -> Scalar -> Scalar
Scalar Curve_P256R1 -> Scalar Curve_P256R1 -> Scalar Curve_P256R1
P256.scalarAdd
scalarMul :: proxy Curve_P256R1
-> Scalar Curve_P256R1
-> Scalar Curve_P256R1
-> Scalar Curve_P256R1
scalarMul proxy Curve_P256R1
_ = Scalar -> Scalar -> Scalar
Scalar Curve_P256R1 -> Scalar Curve_P256R1 -> Scalar Curve_P256R1
P256.scalarMul
data Curve_P384R1 = Curve_P384R1
deriving (Int -> Curve_P384R1 -> ShowS
[Curve_P384R1] -> ShowS
Curve_P384R1 -> String
(Int -> Curve_P384R1 -> ShowS)
-> (Curve_P384R1 -> String)
-> ([Curve_P384R1] -> ShowS)
-> Show Curve_P384R1
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_P384R1] -> ShowS
$cshowList :: [Curve_P384R1] -> ShowS
show :: Curve_P384R1 -> String
$cshow :: Curve_P384R1 -> String
showsPrec :: Int -> Curve_P384R1 -> ShowS
$cshowsPrec :: Int -> Curve_P384R1 -> ShowS
Show,Typeable Curve_P384R1
DataType
Constr
Typeable Curve_P384R1
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P384R1 -> c Curve_P384R1)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P384R1)
-> (Curve_P384R1 -> Constr)
-> (Curve_P384R1 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P384R1))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P384R1))
-> ((forall b. Data b => b -> b) -> Curve_P384R1 -> Curve_P384R1)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r)
-> (forall u. (forall d. Data d => d -> u) -> Curve_P384R1 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_P384R1 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1)
-> Data Curve_P384R1
Curve_P384R1 -> DataType
Curve_P384R1 -> Constr
(forall b. Data b => b -> b) -> Curve_P384R1 -> Curve_P384R1
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P384R1 -> c Curve_P384R1
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P384R1
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Curve_P384R1 -> u
forall u. (forall d. Data d => d -> u) -> Curve_P384R1 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P384R1
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P384R1 -> c Curve_P384R1
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P384R1)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P384R1)
$cCurve_P384R1 :: Constr
$tCurve_P384R1 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
gmapMp :: (forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
gmapM :: (forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P384R1 -> m Curve_P384R1
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_P384R1 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Curve_P384R1 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_P384R1 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_P384R1 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P384R1 -> r
gmapT :: (forall b. Data b => b -> b) -> Curve_P384R1 -> Curve_P384R1
$cgmapT :: (forall b. Data b => b -> b) -> Curve_P384R1 -> Curve_P384R1
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P384R1)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P384R1)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_P384R1)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P384R1)
dataTypeOf :: Curve_P384R1 -> DataType
$cdataTypeOf :: Curve_P384R1 -> DataType
toConstr :: Curve_P384R1 -> Constr
$ctoConstr :: Curve_P384R1 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P384R1
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P384R1
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P384R1 -> c Curve_P384R1
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P384R1 -> c Curve_P384R1
$cp1Data :: Typeable Curve_P384R1
Data)
instance EllipticCurve Curve_P384R1 where
type Point Curve_P384R1 = Simple.Point Simple.SEC_p384r1
type Scalar Curve_P384R1 = Simple.Scalar Simple.SEC_p384r1
curveSizeBits :: proxy Curve_P384R1 -> Int
curveSizeBits proxy Curve_P384R1
_ = Int
384
curveGenerateScalar :: proxy Curve_P384R1 -> randomly (Scalar Curve_P384R1)
curveGenerateScalar proxy Curve_P384R1
_ = randomly (Scalar Curve_P384R1)
forall (randomly :: * -> *) curve.
(MonadRandom randomly, Curve curve) =>
randomly (Scalar curve)
Simple.scalarGenerate
curveGenerateKeyPair :: proxy Curve_P384R1 -> randomly (KeyPair Curve_P384R1)
curveGenerateKeyPair proxy Curve_P384R1
_ = Scalar SEC_p384r1 -> KeyPair Curve_P384R1
forall curve curve.
(Curve curve, Point curve ~ Point curve,
Scalar curve ~ Scalar curve) =>
Scalar curve -> KeyPair curve
toKeyPair (Scalar SEC_p384r1 -> KeyPair Curve_P384R1)
-> randomly (Scalar SEC_p384r1) -> randomly (KeyPair Curve_P384R1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> randomly (Scalar SEC_p384r1)
forall (randomly :: * -> *) curve.
(MonadRandom randomly, Curve curve) =>
randomly (Scalar curve)
Simple.scalarGenerate
where toKeyPair :: Scalar curve -> KeyPair curve
toKeyPair Scalar curve
scalar = Point curve -> Scalar curve -> KeyPair curve
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (Scalar curve -> Point curve
forall curve. Curve curve => Scalar curve -> Point curve
Simple.pointBaseMul Scalar curve
scalar) Scalar curve
Scalar curve
scalar
encodePoint :: proxy Curve_P384R1 -> Point Curve_P384R1 -> bs
encodePoint proxy Curve_P384R1
_ Point Curve_P384R1
point = Point SEC_p384r1 -> bs
forall curve bs. (Curve curve, ByteArray bs) => Point curve -> bs
encodeECPoint Point SEC_p384r1
Point Curve_P384R1
point
decodePoint :: proxy Curve_P384R1 -> bs -> CryptoFailable (Point Curve_P384R1)
decodePoint proxy Curve_P384R1
_ bs
bs = bs -> CryptoFailable (Point SEC_p384r1)
forall curve bs.
(Curve curve, ByteArray bs) =>
bs -> CryptoFailable (Point curve)
decodeECPoint bs
bs
instance EllipticCurveArith Curve_P384R1 where
pointAdd :: proxy Curve_P384R1
-> Point Curve_P384R1 -> Point Curve_P384R1 -> Point Curve_P384R1
pointAdd proxy Curve_P384R1
_ Point Curve_P384R1
a Point Curve_P384R1
b = Point SEC_p384r1 -> Point SEC_p384r1 -> Point SEC_p384r1
forall curve.
Curve curve =>
Point curve -> Point curve -> Point curve
Simple.pointAdd Point SEC_p384r1
Point Curve_P384R1
a Point SEC_p384r1
Point Curve_P384R1
b
pointNegate :: proxy Curve_P384R1 -> Point Curve_P384R1 -> Point Curve_P384R1
pointNegate proxy Curve_P384R1
_ Point Curve_P384R1
p = Point SEC_p384r1 -> Point SEC_p384r1
forall curve. Curve curve => Point curve -> Point curve
Simple.pointNegate Point SEC_p384r1
Point Curve_P384R1
p
pointSmul :: proxy Curve_P384R1
-> Scalar Curve_P384R1 -> Point Curve_P384R1 -> Point Curve_P384R1
pointSmul proxy Curve_P384R1
_ Scalar Curve_P384R1
s Point Curve_P384R1
p = Scalar SEC_p384r1 -> Point SEC_p384r1 -> Point SEC_p384r1
forall curve.
Curve curve =>
Scalar curve -> Point curve -> Point curve
Simple.pointMul Scalar SEC_p384r1
Scalar Curve_P384R1
s Point SEC_p384r1
Point Curve_P384R1
p
instance EllipticCurveDH Curve_P384R1 where
ecdh :: proxy Curve_P384R1
-> Scalar Curve_P384R1
-> Point Curve_P384R1
-> CryptoFailable SharedSecret
ecdh proxy Curve_P384R1
_ Scalar Curve_P384R1
s Point Curve_P384R1
p = Proxy SEC_p384r1 -> Point SEC_p384r1 -> CryptoFailable SharedSecret
forall curve.
Curve curve =>
Proxy curve -> Point curve -> CryptoFailable SharedSecret
encodeECShared Proxy SEC_p384r1
prx (Scalar SEC_p384r1 -> Point SEC_p384r1 -> Point SEC_p384r1
forall curve.
Curve curve =>
Scalar curve -> Point curve -> Point curve
Simple.pointMul Scalar SEC_p384r1
Scalar Curve_P384R1
s Point SEC_p384r1
Point Curve_P384R1
p)
where
prx :: Proxy SEC_p384r1
prx = Proxy SEC_p384r1
forall k (t :: k). Proxy t
Proxy :: Proxy Simple.SEC_p384r1
instance EllipticCurveBasepointArith Curve_P384R1 where
curveOrderBits :: proxy Curve_P384R1 -> Int
curveOrderBits proxy Curve_P384R1
_ = Int
384
pointBaseSmul :: proxy Curve_P384R1 -> Scalar Curve_P384R1 -> Point Curve_P384R1
pointBaseSmul proxy Curve_P384R1
_ = Scalar Curve_P384R1 -> Point Curve_P384R1
forall curve. Curve curve => Scalar curve -> Point curve
Simple.pointBaseMul
pointsSmulVarTime :: proxy Curve_P384R1
-> Scalar Curve_P384R1
-> Scalar Curve_P384R1
-> Point Curve_P384R1
-> Point Curve_P384R1
pointsSmulVarTime proxy Curve_P384R1
_ = Scalar Curve_P384R1
-> Scalar Curve_P384R1 -> Point Curve_P384R1 -> Point Curve_P384R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Point curve -> Point curve
ecPointsMulVarTime
encodeScalar :: proxy Curve_P384R1 -> Scalar Curve_P384R1 -> bs
encodeScalar proxy Curve_P384R1
_ = Scalar Curve_P384R1 -> bs
forall curve bs. (Curve curve, ByteArray bs) => Scalar curve -> bs
ecScalarToBinary
decodeScalar :: proxy Curve_P384R1 -> bs -> CryptoFailable (Scalar Curve_P384R1)
decodeScalar proxy Curve_P384R1
_ = bs -> CryptoFailable (Scalar Curve_P384R1)
forall curve bs.
(Curve curve, ByteArrayAccess bs) =>
bs -> CryptoFailable (Scalar curve)
ecScalarFromBinary
scalarToInteger :: proxy Curve_P384R1 -> Scalar Curve_P384R1 -> Integer
scalarToInteger proxy Curve_P384R1
_ = Scalar Curve_P384R1 -> Integer
forall curve. Scalar curve -> Integer
ecScalarToInteger
scalarFromInteger :: proxy Curve_P384R1
-> Integer -> CryptoFailable (Scalar Curve_P384R1)
scalarFromInteger proxy Curve_P384R1
_ = Integer -> CryptoFailable (Scalar Curve_P384R1)
forall curve.
Curve curve =>
Integer -> CryptoFailable (Scalar curve)
ecScalarFromInteger
scalarAdd :: proxy Curve_P384R1
-> Scalar Curve_P384R1
-> Scalar Curve_P384R1
-> Scalar Curve_P384R1
scalarAdd proxy Curve_P384R1
_ = Scalar Curve_P384R1 -> Scalar Curve_P384R1 -> Scalar Curve_P384R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Scalar curve
ecScalarAdd
scalarMul :: proxy Curve_P384R1
-> Scalar Curve_P384R1
-> Scalar Curve_P384R1
-> Scalar Curve_P384R1
scalarMul proxy Curve_P384R1
_ = Scalar Curve_P384R1 -> Scalar Curve_P384R1 -> Scalar Curve_P384R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Scalar curve
ecScalarMul
data Curve_P521R1 = Curve_P521R1
deriving (Int -> Curve_P521R1 -> ShowS
[Curve_P521R1] -> ShowS
Curve_P521R1 -> String
(Int -> Curve_P521R1 -> ShowS)
-> (Curve_P521R1 -> String)
-> ([Curve_P521R1] -> ShowS)
-> Show Curve_P521R1
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_P521R1] -> ShowS
$cshowList :: [Curve_P521R1] -> ShowS
show :: Curve_P521R1 -> String
$cshow :: Curve_P521R1 -> String
showsPrec :: Int -> Curve_P521R1 -> ShowS
$cshowsPrec :: Int -> Curve_P521R1 -> ShowS
Show,Typeable Curve_P521R1
DataType
Constr
Typeable Curve_P521R1
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P521R1 -> c Curve_P521R1)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P521R1)
-> (Curve_P521R1 -> Constr)
-> (Curve_P521R1 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P521R1))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P521R1))
-> ((forall b. Data b => b -> b) -> Curve_P521R1 -> Curve_P521R1)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r)
-> (forall u. (forall d. Data d => d -> u) -> Curve_P521R1 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_P521R1 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1)
-> Data Curve_P521R1
Curve_P521R1 -> DataType
Curve_P521R1 -> Constr
(forall b. Data b => b -> b) -> Curve_P521R1 -> Curve_P521R1
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P521R1 -> c Curve_P521R1
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P521R1
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Curve_P521R1 -> u
forall u. (forall d. Data d => d -> u) -> Curve_P521R1 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P521R1
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P521R1 -> c Curve_P521R1
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P521R1)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P521R1)
$cCurve_P521R1 :: Constr
$tCurve_P521R1 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
gmapMp :: (forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
gmapM :: (forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_P521R1 -> m Curve_P521R1
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_P521R1 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Curve_P521R1 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_P521R1 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_P521R1 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_P521R1 -> r
gmapT :: (forall b. Data b => b -> b) -> Curve_P521R1 -> Curve_P521R1
$cgmapT :: (forall b. Data b => b -> b) -> Curve_P521R1 -> Curve_P521R1
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P521R1)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_P521R1)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_P521R1)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_P521R1)
dataTypeOf :: Curve_P521R1 -> DataType
$cdataTypeOf :: Curve_P521R1 -> DataType
toConstr :: Curve_P521R1 -> Constr
$ctoConstr :: Curve_P521R1 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P521R1
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_P521R1
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P521R1 -> c Curve_P521R1
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_P521R1 -> c Curve_P521R1
$cp1Data :: Typeable Curve_P521R1
Data)
instance EllipticCurve Curve_P521R1 where
type Point Curve_P521R1 = Simple.Point Simple.SEC_p521r1
type Scalar Curve_P521R1 = Simple.Scalar Simple.SEC_p521r1
curveSizeBits :: proxy Curve_P521R1 -> Int
curveSizeBits proxy Curve_P521R1
_ = Int
521
curveGenerateScalar :: proxy Curve_P521R1 -> randomly (Scalar Curve_P521R1)
curveGenerateScalar proxy Curve_P521R1
_ = randomly (Scalar Curve_P521R1)
forall (randomly :: * -> *) curve.
(MonadRandom randomly, Curve curve) =>
randomly (Scalar curve)
Simple.scalarGenerate
curveGenerateKeyPair :: proxy Curve_P521R1 -> randomly (KeyPair Curve_P521R1)
curveGenerateKeyPair proxy Curve_P521R1
_ = Scalar SEC_p521r1 -> KeyPair Curve_P521R1
forall curve curve.
(Curve curve, Point curve ~ Point curve,
Scalar curve ~ Scalar curve) =>
Scalar curve -> KeyPair curve
toKeyPair (Scalar SEC_p521r1 -> KeyPair Curve_P521R1)
-> randomly (Scalar SEC_p521r1) -> randomly (KeyPair Curve_P521R1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> randomly (Scalar SEC_p521r1)
forall (randomly :: * -> *) curve.
(MonadRandom randomly, Curve curve) =>
randomly (Scalar curve)
Simple.scalarGenerate
where toKeyPair :: Scalar curve -> KeyPair curve
toKeyPair Scalar curve
scalar = Point curve -> Scalar curve -> KeyPair curve
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (Scalar curve -> Point curve
forall curve. Curve curve => Scalar curve -> Point curve
Simple.pointBaseMul Scalar curve
scalar) Scalar curve
Scalar curve
scalar
encodePoint :: proxy Curve_P521R1 -> Point Curve_P521R1 -> bs
encodePoint proxy Curve_P521R1
_ Point Curve_P521R1
point = Point SEC_p521r1 -> bs
forall curve bs. (Curve curve, ByteArray bs) => Point curve -> bs
encodeECPoint Point SEC_p521r1
Point Curve_P521R1
point
decodePoint :: proxy Curve_P521R1 -> bs -> CryptoFailable (Point Curve_P521R1)
decodePoint proxy Curve_P521R1
_ bs
bs = bs -> CryptoFailable (Point SEC_p521r1)
forall curve bs.
(Curve curve, ByteArray bs) =>
bs -> CryptoFailable (Point curve)
decodeECPoint bs
bs
instance EllipticCurveArith Curve_P521R1 where
pointAdd :: proxy Curve_P521R1
-> Point Curve_P521R1 -> Point Curve_P521R1 -> Point Curve_P521R1
pointAdd proxy Curve_P521R1
_ Point Curve_P521R1
a Point Curve_P521R1
b = Point SEC_p521r1 -> Point SEC_p521r1 -> Point SEC_p521r1
forall curve.
Curve curve =>
Point curve -> Point curve -> Point curve
Simple.pointAdd Point SEC_p521r1
Point Curve_P521R1
a Point SEC_p521r1
Point Curve_P521R1
b
pointNegate :: proxy Curve_P521R1 -> Point Curve_P521R1 -> Point Curve_P521R1
pointNegate proxy Curve_P521R1
_ Point Curve_P521R1
p = Point SEC_p521r1 -> Point SEC_p521r1
forall curve. Curve curve => Point curve -> Point curve
Simple.pointNegate Point SEC_p521r1
Point Curve_P521R1
p
pointSmul :: proxy Curve_P521R1
-> Scalar Curve_P521R1 -> Point Curve_P521R1 -> Point Curve_P521R1
pointSmul proxy Curve_P521R1
_ Scalar Curve_P521R1
s Point Curve_P521R1
p = Scalar SEC_p521r1 -> Point SEC_p521r1 -> Point SEC_p521r1
forall curve.
Curve curve =>
Scalar curve -> Point curve -> Point curve
Simple.pointMul Scalar SEC_p521r1
Scalar Curve_P521R1
s Point SEC_p521r1
Point Curve_P521R1
p
instance EllipticCurveDH Curve_P521R1 where
ecdh :: proxy Curve_P521R1
-> Scalar Curve_P521R1
-> Point Curve_P521R1
-> CryptoFailable SharedSecret
ecdh proxy Curve_P521R1
_ Scalar Curve_P521R1
s Point Curve_P521R1
p = Proxy SEC_p521r1 -> Point SEC_p521r1 -> CryptoFailable SharedSecret
forall curve.
Curve curve =>
Proxy curve -> Point curve -> CryptoFailable SharedSecret
encodeECShared Proxy SEC_p521r1
prx (Scalar SEC_p521r1 -> Point SEC_p521r1 -> Point SEC_p521r1
forall curve.
Curve curve =>
Scalar curve -> Point curve -> Point curve
Simple.pointMul Scalar SEC_p521r1
Scalar Curve_P521R1
s Point SEC_p521r1
Point Curve_P521R1
p)
where
prx :: Proxy SEC_p521r1
prx = Proxy SEC_p521r1
forall k (t :: k). Proxy t
Proxy :: Proxy Simple.SEC_p521r1
instance EllipticCurveBasepointArith Curve_P521R1 where
curveOrderBits :: proxy Curve_P521R1 -> Int
curveOrderBits proxy Curve_P521R1
_ = Int
521
pointBaseSmul :: proxy Curve_P521R1 -> Scalar Curve_P521R1 -> Point Curve_P521R1
pointBaseSmul proxy Curve_P521R1
_ = Scalar Curve_P521R1 -> Point Curve_P521R1
forall curve. Curve curve => Scalar curve -> Point curve
Simple.pointBaseMul
pointsSmulVarTime :: proxy Curve_P521R1
-> Scalar Curve_P521R1
-> Scalar Curve_P521R1
-> Point Curve_P521R1
-> Point Curve_P521R1
pointsSmulVarTime proxy Curve_P521R1
_ = Scalar Curve_P521R1
-> Scalar Curve_P521R1 -> Point Curve_P521R1 -> Point Curve_P521R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Point curve -> Point curve
ecPointsMulVarTime
encodeScalar :: proxy Curve_P521R1 -> Scalar Curve_P521R1 -> bs
encodeScalar proxy Curve_P521R1
_ = Scalar Curve_P521R1 -> bs
forall curve bs. (Curve curve, ByteArray bs) => Scalar curve -> bs
ecScalarToBinary
decodeScalar :: proxy Curve_P521R1 -> bs -> CryptoFailable (Scalar Curve_P521R1)
decodeScalar proxy Curve_P521R1
_ = bs -> CryptoFailable (Scalar Curve_P521R1)
forall curve bs.
(Curve curve, ByteArrayAccess bs) =>
bs -> CryptoFailable (Scalar curve)
ecScalarFromBinary
scalarToInteger :: proxy Curve_P521R1 -> Scalar Curve_P521R1 -> Integer
scalarToInteger proxy Curve_P521R1
_ = Scalar Curve_P521R1 -> Integer
forall curve. Scalar curve -> Integer
ecScalarToInteger
scalarFromInteger :: proxy Curve_P521R1
-> Integer -> CryptoFailable (Scalar Curve_P521R1)
scalarFromInteger proxy Curve_P521R1
_ = Integer -> CryptoFailable (Scalar Curve_P521R1)
forall curve.
Curve curve =>
Integer -> CryptoFailable (Scalar curve)
ecScalarFromInteger
scalarAdd :: proxy Curve_P521R1
-> Scalar Curve_P521R1
-> Scalar Curve_P521R1
-> Scalar Curve_P521R1
scalarAdd proxy Curve_P521R1
_ = Scalar Curve_P521R1 -> Scalar Curve_P521R1 -> Scalar Curve_P521R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Scalar curve
ecScalarAdd
scalarMul :: proxy Curve_P521R1
-> Scalar Curve_P521R1
-> Scalar Curve_P521R1
-> Scalar Curve_P521R1
scalarMul proxy Curve_P521R1
_ = Scalar Curve_P521R1 -> Scalar Curve_P521R1 -> Scalar Curve_P521R1
forall curve.
Curve curve =>
Scalar curve -> Scalar curve -> Scalar curve
ecScalarMul
data Curve_X25519 = Curve_X25519
deriving (Int -> Curve_X25519 -> ShowS
[Curve_X25519] -> ShowS
Curve_X25519 -> String
(Int -> Curve_X25519 -> ShowS)
-> (Curve_X25519 -> String)
-> ([Curve_X25519] -> ShowS)
-> Show Curve_X25519
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_X25519] -> ShowS
$cshowList :: [Curve_X25519] -> ShowS
show :: Curve_X25519 -> String
$cshow :: Curve_X25519 -> String
showsPrec :: Int -> Curve_X25519 -> ShowS
$cshowsPrec :: Int -> Curve_X25519 -> ShowS
Show,Typeable Curve_X25519
DataType
Constr
Typeable Curve_X25519
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X25519 -> c Curve_X25519)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X25519)
-> (Curve_X25519 -> Constr)
-> (Curve_X25519 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X25519))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_X25519))
-> ((forall b. Data b => b -> b) -> Curve_X25519 -> Curve_X25519)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r)
-> (forall u. (forall d. Data d => d -> u) -> Curve_X25519 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_X25519 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519)
-> Data Curve_X25519
Curve_X25519 -> DataType
Curve_X25519 -> Constr
(forall b. Data b => b -> b) -> Curve_X25519 -> Curve_X25519
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X25519 -> c Curve_X25519
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X25519
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Curve_X25519 -> u
forall u. (forall d. Data d => d -> u) -> Curve_X25519 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X25519
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X25519 -> c Curve_X25519
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X25519)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_X25519)
$cCurve_X25519 :: Constr
$tCurve_X25519 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
gmapMp :: (forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
gmapM :: (forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X25519 -> m Curve_X25519
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_X25519 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Curve_X25519 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_X25519 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_X25519 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X25519 -> r
gmapT :: (forall b. Data b => b -> b) -> Curve_X25519 -> Curve_X25519
$cgmapT :: (forall b. Data b => b -> b) -> Curve_X25519 -> Curve_X25519
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_X25519)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_X25519)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_X25519)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X25519)
dataTypeOf :: Curve_X25519 -> DataType
$cdataTypeOf :: Curve_X25519 -> DataType
toConstr :: Curve_X25519 -> Constr
$ctoConstr :: Curve_X25519 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X25519
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X25519
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X25519 -> c Curve_X25519
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X25519 -> c Curve_X25519
$cp1Data :: Typeable Curve_X25519
Data)
instance EllipticCurve Curve_X25519 where
type Point Curve_X25519 = X25519.PublicKey
type Scalar Curve_X25519 = X25519.SecretKey
curveSizeBits :: proxy Curve_X25519 -> Int
curveSizeBits proxy Curve_X25519
_ = Int
255
curveGenerateScalar :: proxy Curve_X25519 -> randomly (Scalar Curve_X25519)
curveGenerateScalar proxy Curve_X25519
_ = randomly (Scalar Curve_X25519)
forall (m :: * -> *). MonadRandom m => m SecretKey
X25519.generateSecretKey
curveGenerateKeyPair :: proxy Curve_X25519 -> randomly (KeyPair Curve_X25519)
curveGenerateKeyPair proxy Curve_X25519
_ = do
SecretKey
s <- randomly SecretKey
forall (m :: * -> *). MonadRandom m => m SecretKey
X25519.generateSecretKey
KeyPair Curve_X25519 -> randomly (KeyPair Curve_X25519)
forall (m :: * -> *) a. Monad m => a -> m a
return (KeyPair Curve_X25519 -> randomly (KeyPair Curve_X25519))
-> KeyPair Curve_X25519 -> randomly (KeyPair Curve_X25519)
forall a b. (a -> b) -> a -> b
$ Point Curve_X25519 -> Scalar Curve_X25519 -> KeyPair Curve_X25519
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (SecretKey -> PublicKey
X25519.toPublic SecretKey
s) SecretKey
Scalar Curve_X25519
s
encodePoint :: proxy Curve_X25519 -> Point Curve_X25519 -> bs
encodePoint proxy Curve_X25519
_ Point Curve_X25519
p = PublicKey -> bs
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
B.convert PublicKey
Point Curve_X25519
p
decodePoint :: proxy Curve_X25519 -> bs -> CryptoFailable (Point Curve_X25519)
decodePoint proxy Curve_X25519
_ bs
bs = bs -> CryptoFailable PublicKey
forall bs. ByteArrayAccess bs => bs -> CryptoFailable PublicKey
X25519.publicKey bs
bs
instance EllipticCurveDH Curve_X25519 where
ecdhRaw :: proxy Curve_X25519
-> Scalar Curve_X25519 -> Point Curve_X25519 -> SharedSecret
ecdhRaw proxy Curve_X25519
_ Scalar Curve_X25519
s Point Curve_X25519
p = ScrubbedBytes -> SharedSecret
SharedSecret (ScrubbedBytes -> SharedSecret) -> ScrubbedBytes -> SharedSecret
forall a b. (a -> b) -> a -> b
$ DhSecret -> ScrubbedBytes
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
convert DhSecret
secret
where secret :: DhSecret
secret = PublicKey -> SecretKey -> DhSecret
X25519.dh PublicKey
Point Curve_X25519
p SecretKey
Scalar Curve_X25519
s
ecdh :: proxy Curve_X25519
-> Scalar Curve_X25519
-> Point Curve_X25519
-> CryptoFailable SharedSecret
ecdh proxy Curve_X25519
prx Scalar Curve_X25519
s Point Curve_X25519
p = SharedSecret -> CryptoFailable SharedSecret
checkNonZeroDH (proxy Curve_X25519
-> Scalar Curve_X25519 -> Point Curve_X25519 -> SharedSecret
forall curve (proxy :: * -> *).
EllipticCurveDH curve =>
proxy curve -> Scalar curve -> Point curve -> SharedSecret
ecdhRaw proxy Curve_X25519
prx Scalar Curve_X25519
s Point Curve_X25519
p)
data Curve_X448 = Curve_X448
deriving (Int -> Curve_X448 -> ShowS
[Curve_X448] -> ShowS
Curve_X448 -> String
(Int -> Curve_X448 -> ShowS)
-> (Curve_X448 -> String)
-> ([Curve_X448] -> ShowS)
-> Show Curve_X448
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_X448] -> ShowS
$cshowList :: [Curve_X448] -> ShowS
show :: Curve_X448 -> String
$cshow :: Curve_X448 -> String
showsPrec :: Int -> Curve_X448 -> ShowS
$cshowsPrec :: Int -> Curve_X448 -> ShowS
Show,Typeable Curve_X448
DataType
Constr
Typeable Curve_X448
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X448 -> c Curve_X448)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X448)
-> (Curve_X448 -> Constr)
-> (Curve_X448 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X448))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_X448))
-> ((forall b. Data b => b -> b) -> Curve_X448 -> Curve_X448)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r)
-> (forall u. (forall d. Data d => d -> u) -> Curve_X448 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_X448 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448)
-> Data Curve_X448
Curve_X448 -> DataType
Curve_X448 -> Constr
(forall b. Data b => b -> b) -> Curve_X448 -> Curve_X448
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X448 -> c Curve_X448
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X448
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Curve_X448 -> u
forall u. (forall d. Data d => d -> u) -> Curve_X448 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X448
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X448 -> c Curve_X448
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X448)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Curve_X448)
$cCurve_X448 :: Constr
$tCurve_X448 :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
gmapMp :: (forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
gmapM :: (forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Curve_X448 -> m Curve_X448
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_X448 -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Curve_X448 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_X448 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_X448 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_X448 -> r
gmapT :: (forall b. Data b => b -> b) -> Curve_X448 -> Curve_X448
$cgmapT :: (forall b. Data b => b -> b) -> Curve_X448 -> Curve_X448
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Curve_X448)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Curve_X448)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_X448)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_X448)
dataTypeOf :: Curve_X448 -> DataType
$cdataTypeOf :: Curve_X448 -> DataType
toConstr :: Curve_X448 -> Constr
$ctoConstr :: Curve_X448 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X448
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_X448
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X448 -> c Curve_X448
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Curve_X448 -> c Curve_X448
$cp1Data :: Typeable Curve_X448
Data)
instance EllipticCurve Curve_X448 where
type Point Curve_X448 = X448.PublicKey
type Scalar Curve_X448 = X448.SecretKey
curveSizeBits :: proxy Curve_X448 -> Int
curveSizeBits proxy Curve_X448
_ = Int
448
curveGenerateScalar :: proxy Curve_X448 -> randomly (Scalar Curve_X448)
curveGenerateScalar proxy Curve_X448
_ = randomly (Scalar Curve_X448)
forall (m :: * -> *). MonadRandom m => m SecretKey
X448.generateSecretKey
curveGenerateKeyPair :: proxy Curve_X448 -> randomly (KeyPair Curve_X448)
curveGenerateKeyPair proxy Curve_X448
_ = do
SecretKey
s <- randomly SecretKey
forall (m :: * -> *). MonadRandom m => m SecretKey
X448.generateSecretKey
KeyPair Curve_X448 -> randomly (KeyPair Curve_X448)
forall (m :: * -> *) a. Monad m => a -> m a
return (KeyPair Curve_X448 -> randomly (KeyPair Curve_X448))
-> KeyPair Curve_X448 -> randomly (KeyPair Curve_X448)
forall a b. (a -> b) -> a -> b
$ Point Curve_X448 -> Scalar Curve_X448 -> KeyPair Curve_X448
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (SecretKey -> PublicKey
X448.toPublic SecretKey
s) SecretKey
Scalar Curve_X448
s
encodePoint :: proxy Curve_X448 -> Point Curve_X448 -> bs
encodePoint proxy Curve_X448
_ Point Curve_X448
p = PublicKey -> bs
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
B.convert PublicKey
Point Curve_X448
p
decodePoint :: proxy Curve_X448 -> bs -> CryptoFailable (Point Curve_X448)
decodePoint proxy Curve_X448
_ bs
bs = bs -> CryptoFailable PublicKey
forall bs. ByteArrayAccess bs => bs -> CryptoFailable PublicKey
X448.publicKey bs
bs
instance EllipticCurveDH Curve_X448 where
ecdhRaw :: proxy Curve_X448
-> Scalar Curve_X448 -> Point Curve_X448 -> SharedSecret
ecdhRaw proxy Curve_X448
_ Scalar Curve_X448
s Point Curve_X448
p = ScrubbedBytes -> SharedSecret
SharedSecret (ScrubbedBytes -> SharedSecret) -> ScrubbedBytes -> SharedSecret
forall a b. (a -> b) -> a -> b
$ DhSecret -> ScrubbedBytes
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
convert DhSecret
secret
where secret :: DhSecret
secret = PublicKey -> SecretKey -> DhSecret
X448.dh PublicKey
Point Curve_X448
p SecretKey
Scalar Curve_X448
s
ecdh :: proxy Curve_X448
-> Scalar Curve_X448
-> Point Curve_X448
-> CryptoFailable SharedSecret
ecdh proxy Curve_X448
prx Scalar Curve_X448
s Point Curve_X448
p = SharedSecret -> CryptoFailable SharedSecret
checkNonZeroDH (proxy Curve_X448
-> Scalar Curve_X448 -> Point Curve_X448 -> SharedSecret
forall curve (proxy :: * -> *).
EllipticCurveDH curve =>
proxy curve -> Scalar curve -> Point curve -> SharedSecret
ecdhRaw proxy Curve_X448
prx Scalar Curve_X448
s Point Curve_X448
p)
data Curve_Edwards25519 = Curve_Edwards25519
deriving (Int -> Curve_Edwards25519 -> ShowS
[Curve_Edwards25519] -> ShowS
Curve_Edwards25519 -> String
(Int -> Curve_Edwards25519 -> ShowS)
-> (Curve_Edwards25519 -> String)
-> ([Curve_Edwards25519] -> ShowS)
-> Show Curve_Edwards25519
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Curve_Edwards25519] -> ShowS
$cshowList :: [Curve_Edwards25519] -> ShowS
show :: Curve_Edwards25519 -> String
$cshow :: Curve_Edwards25519 -> String
showsPrec :: Int -> Curve_Edwards25519 -> ShowS
$cshowsPrec :: Int -> Curve_Edwards25519 -> ShowS
Show,Typeable Curve_Edwards25519
DataType
Constr
Typeable Curve_Edwards25519
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Curve_Edwards25519
-> c Curve_Edwards25519)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_Edwards25519)
-> (Curve_Edwards25519 -> Constr)
-> (Curve_Edwards25519 -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_Edwards25519))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_Edwards25519))
-> ((forall b. Data b => b -> b)
-> Curve_Edwards25519 -> Curve_Edwards25519)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r)
-> (forall u.
(forall d. Data d => d -> u) -> Curve_Edwards25519 -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> Curve_Edwards25519 -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519)
-> Data Curve_Edwards25519
Curve_Edwards25519 -> DataType
Curve_Edwards25519 -> Constr
(forall b. Data b => b -> b)
-> Curve_Edwards25519 -> Curve_Edwards25519
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Curve_Edwards25519
-> c Curve_Edwards25519
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_Edwards25519
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> Curve_Edwards25519 -> u
forall u. (forall d. Data d => d -> u) -> Curve_Edwards25519 -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_Edwards25519
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Curve_Edwards25519
-> c Curve_Edwards25519
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_Edwards25519)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_Edwards25519)
$cCurve_Edwards25519 :: Constr
$tCurve_Edwards25519 :: DataType
gmapMo :: (forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
gmapMp :: (forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
gmapM :: (forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> Curve_Edwards25519 -> m Curve_Edwards25519
gmapQi :: Int -> (forall d. Data d => d -> u) -> Curve_Edwards25519 -> u
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> Curve_Edwards25519 -> u
gmapQ :: (forall d. Data d => d -> u) -> Curve_Edwards25519 -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Curve_Edwards25519 -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Curve_Edwards25519 -> r
gmapT :: (forall b. Data b => b -> b)
-> Curve_Edwards25519 -> Curve_Edwards25519
$cgmapT :: (forall b. Data b => b -> b)
-> Curve_Edwards25519 -> Curve_Edwards25519
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_Edwards25519)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c Curve_Edwards25519)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Curve_Edwards25519)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Curve_Edwards25519)
dataTypeOf :: Curve_Edwards25519 -> DataType
$cdataTypeOf :: Curve_Edwards25519 -> DataType
toConstr :: Curve_Edwards25519 -> Constr
$ctoConstr :: Curve_Edwards25519 -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_Edwards25519
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Curve_Edwards25519
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Curve_Edwards25519
-> c Curve_Edwards25519
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Curve_Edwards25519
-> c Curve_Edwards25519
$cp1Data :: Typeable Curve_Edwards25519
Data)
instance EllipticCurve Curve_Edwards25519 where
type Point Curve_Edwards25519 = Edwards25519.Point
type Scalar Curve_Edwards25519 = Edwards25519.Scalar
curveSizeBits :: proxy Curve_Edwards25519 -> Int
curveSizeBits proxy Curve_Edwards25519
_ = Int
255
curveGenerateScalar :: proxy Curve_Edwards25519 -> randomly (Scalar Curve_Edwards25519)
curveGenerateScalar proxy Curve_Edwards25519
_ = randomly (Scalar Curve_Edwards25519)
forall (randomly :: * -> *).
MonadRandom randomly =>
randomly Scalar
Edwards25519.scalarGenerate
curveGenerateKeyPair :: proxy Curve_Edwards25519 -> randomly (KeyPair Curve_Edwards25519)
curveGenerateKeyPair proxy Curve_Edwards25519
_ = Scalar -> KeyPair Curve_Edwards25519
forall curve.
(Point curve ~ Point, Scalar curve ~ Scalar) =>
Scalar -> KeyPair curve
toKeyPair (Scalar -> KeyPair Curve_Edwards25519)
-> randomly Scalar -> randomly (KeyPair Curve_Edwards25519)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> randomly Scalar
forall (randomly :: * -> *).
MonadRandom randomly =>
randomly Scalar
Edwards25519.scalarGenerate
where toKeyPair :: Scalar -> KeyPair curve
toKeyPair Scalar
scalar = Point curve -> Scalar curve -> KeyPair curve
forall curve. Point curve -> Scalar curve -> KeyPair curve
KeyPair (Scalar -> Point
Edwards25519.toPoint Scalar
scalar) Scalar
Scalar curve
scalar
encodePoint :: proxy Curve_Edwards25519 -> Point Curve_Edwards25519 -> bs
encodePoint proxy Curve_Edwards25519
_ Point Curve_Edwards25519
point = Point -> bs
forall bs. ByteArray bs => Point -> bs
Edwards25519.pointEncode Point
Point Curve_Edwards25519
point
decodePoint :: proxy Curve_Edwards25519
-> bs -> CryptoFailable (Point Curve_Edwards25519)
decodePoint proxy Curve_Edwards25519
_ bs
bs = bs -> CryptoFailable Point
forall bs. ByteArrayAccess bs => bs -> CryptoFailable Point
Edwards25519.pointDecode bs
bs
instance EllipticCurveArith Curve_Edwards25519 where
pointAdd :: proxy Curve_Edwards25519
-> Point Curve_Edwards25519
-> Point Curve_Edwards25519
-> Point Curve_Edwards25519
pointAdd proxy Curve_Edwards25519
_ Point Curve_Edwards25519
a Point Curve_Edwards25519
b = Point -> Point -> Point
Edwards25519.pointAdd Point
Point Curve_Edwards25519
a Point
Point Curve_Edwards25519
b
pointNegate :: proxy Curve_Edwards25519
-> Point Curve_Edwards25519 -> Point Curve_Edwards25519
pointNegate proxy Curve_Edwards25519
_ Point Curve_Edwards25519
p = Point -> Point
Edwards25519.pointNegate Point
Point Curve_Edwards25519
p
pointSmul :: proxy Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Point Curve_Edwards25519
-> Point Curve_Edwards25519
pointSmul proxy Curve_Edwards25519
_ Scalar Curve_Edwards25519
s Point Curve_Edwards25519
p = Scalar -> Point -> Point
Edwards25519.pointMul Scalar
Scalar Curve_Edwards25519
s Point
Point Curve_Edwards25519
p
instance EllipticCurveBasepointArith Curve_Edwards25519 where
curveOrderBits :: proxy Curve_Edwards25519 -> Int
curveOrderBits proxy Curve_Edwards25519
_ = Int
253
pointBaseSmul :: proxy Curve_Edwards25519
-> Scalar Curve_Edwards25519 -> Point Curve_Edwards25519
pointBaseSmul proxy Curve_Edwards25519
_ = Scalar -> Point
Scalar Curve_Edwards25519 -> Point Curve_Edwards25519
Edwards25519.toPoint
pointsSmulVarTime :: proxy Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Point Curve_Edwards25519
-> Point Curve_Edwards25519
pointsSmulVarTime proxy Curve_Edwards25519
_ = Scalar -> Scalar -> Point -> Point
Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Point Curve_Edwards25519
-> Point Curve_Edwards25519
Edwards25519.pointsMulVarTime
encodeScalar :: proxy Curve_Edwards25519 -> Scalar Curve_Edwards25519 -> bs
encodeScalar proxy Curve_Edwards25519
_ = bs -> bs
forall bs. ByteArray bs => bs -> bs
B.reverse (bs -> bs) -> (Scalar -> bs) -> Scalar -> bs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scalar -> bs
forall bs. ByteArray bs => Scalar -> bs
Edwards25519.scalarEncode
decodeScalar :: proxy Curve_Edwards25519
-> bs -> CryptoFailable (Scalar Curve_Edwards25519)
decodeScalar proxy Curve_Edwards25519
_ bs
bs
| bs -> Int
forall ba. ByteArrayAccess ba => ba -> Int
B.length bs
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
32 = bs -> CryptoFailable Scalar
forall bs. ByteArrayAccess bs => bs -> CryptoFailable Scalar
Edwards25519.scalarDecodeLong (bs -> bs
forall bs. ByteArray bs => bs -> bs
B.reverse bs
bs)
| Bool
otherwise = CryptoError -> CryptoFailable Scalar
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_SecretKeySizeInvalid
scalarToInteger :: proxy Curve_Edwards25519 -> Scalar Curve_Edwards25519 -> Integer
scalarToInteger proxy Curve_Edwards25519
_ Scalar Curve_Edwards25519
s = Bytes -> Integer
forall ba. ByteArrayAccess ba => ba -> Integer
LE.os2ip (Scalar -> Bytes
forall bs. ByteArray bs => Scalar -> bs
Edwards25519.scalarEncode Scalar
Scalar Curve_Edwards25519
s :: B.Bytes)
scalarFromInteger :: proxy Curve_Edwards25519
-> Integer -> CryptoFailable (Scalar Curve_Edwards25519)
scalarFromInteger proxy Curve_Edwards25519
_ Integer
i =
case Int -> Integer -> Maybe Bytes
forall ba. ByteArray ba => Int -> Integer -> Maybe ba
LE.i2ospOf Int
32 Integer
i of
Maybe Bytes
Nothing -> CryptoError -> CryptoFailable Scalar
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_SecretKeySizeInvalid
Just Bytes
bs -> Bytes -> CryptoFailable Scalar
forall bs. ByteArrayAccess bs => bs -> CryptoFailable Scalar
Edwards25519.scalarDecodeLong (Bytes
bs :: B.Bytes)
scalarAdd :: proxy Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
scalarAdd proxy Curve_Edwards25519
_ = Scalar -> Scalar -> Scalar
Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519 -> Scalar Curve_Edwards25519
Edwards25519.scalarAdd
scalarMul :: proxy Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519
scalarMul proxy Curve_Edwards25519
_ = Scalar -> Scalar -> Scalar
Scalar Curve_Edwards25519
-> Scalar Curve_Edwards25519 -> Scalar Curve_Edwards25519
Edwards25519.scalarMul
checkNonZeroDH :: SharedSecret -> CryptoFailable SharedSecret
checkNonZeroDH :: SharedSecret -> CryptoFailable SharedSecret
checkNonZeroDH s :: SharedSecret
s@(SharedSecret ScrubbedBytes
b)
| ScrubbedBytes -> Bool
forall ba. ByteArrayAccess ba => ba -> Bool
B.constAllZero ScrubbedBytes
b = CryptoError -> CryptoFailable SharedSecret
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_ScalarMultiplicationInvalid
| Bool
otherwise = SharedSecret -> CryptoFailable SharedSecret
forall a. a -> CryptoFailable a
CryptoPassed SharedSecret
s
encodeECShared :: Simple.Curve curve => Proxy curve -> Simple.Point curve -> CryptoFailable SharedSecret
encodeECShared :: Proxy curve -> Point curve -> CryptoFailable SharedSecret
encodeECShared Proxy curve
_ Point curve
Simple.PointO = CryptoError -> CryptoFailable SharedSecret
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_ScalarMultiplicationInvalid
encodeECShared Proxy curve
prx (Simple.Point Integer
x Integer
_) = SharedSecret -> CryptoFailable SharedSecret
forall a. a -> CryptoFailable a
CryptoPassed (SharedSecret -> CryptoFailable SharedSecret)
-> (ScrubbedBytes -> SharedSecret)
-> ScrubbedBytes
-> CryptoFailable SharedSecret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScrubbedBytes -> SharedSecret
SharedSecret (ScrubbedBytes -> CryptoFailable SharedSecret)
-> ScrubbedBytes -> CryptoFailable SharedSecret
forall a b. (a -> b) -> a -> b
$ Int -> Integer -> ScrubbedBytes
forall ba. ByteArray ba => Int -> Integer -> ba
i2ospOf_ (Proxy curve -> Int
forall curve (proxy :: * -> *). Curve curve => proxy curve -> Int
Simple.curveSizeBytes Proxy curve
prx) Integer
x
encodeECPoint :: forall curve bs . (Simple.Curve curve, ByteArray bs) => Simple.Point curve -> bs
encodeECPoint :: Point curve -> bs
encodeECPoint Point curve
Simple.PointO = String -> bs
forall a. HasCallStack => String -> a
error String
"encodeECPoint: cannot serialize point at infinity"
encodeECPoint (Simple.Point Integer
x Integer
y) = [bs] -> bs
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
[bin] -> bout
B.concat [bs
uncompressed,bs
xb,bs
yb]
where
size :: Int
size = Proxy curve -> Int
forall curve (proxy :: * -> *). Curve curve => proxy curve -> Int
Simple.curveSizeBytes (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
uncompressed, xb, yb :: bs
uncompressed :: bs
uncompressed = Word8 -> bs
forall a. ByteArray a => Word8 -> a
B.singleton Word8
4
xb :: bs
xb = Int -> Integer -> bs
forall ba. ByteArray ba => Int -> Integer -> ba
i2ospOf_ Int
size Integer
x
yb :: bs
yb = Int -> Integer -> bs
forall ba. ByteArray ba => Int -> Integer -> ba
i2ospOf_ Int
size Integer
y
decodeECPoint :: (Simple.Curve curve, ByteArray bs) => bs -> CryptoFailable (Simple.Point curve)
decodeECPoint :: bs -> CryptoFailable (Point curve)
decodeECPoint bs
mxy = case bs -> Maybe (Word8, bs)
forall a. ByteArray a => a -> Maybe (Word8, a)
B.uncons bs
mxy of
Maybe (Word8, bs)
Nothing -> CryptoError -> CryptoFailable (Point curve)
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_PointSizeInvalid
Just (Word8
m,bs
xy)
| Word8
m Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
4 ->
let siz :: Int
siz = bs -> Int
forall ba. ByteArrayAccess ba => ba -> Int
B.length bs
xy Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2
(bs
xb,bs
yb) = Int -> bs -> (bs, bs)
forall bs. ByteArray bs => Int -> bs -> (bs, bs)
B.splitAt Int
siz bs
xy
x :: Integer
x = bs -> Integer
forall ba. ByteArrayAccess ba => ba -> Integer
os2ip bs
xb
y :: Integer
y = bs -> Integer
forall ba. ByteArrayAccess ba => ba -> Integer
os2ip bs
yb
in (Integer, Integer) -> CryptoFailable (Point curve)
forall curve.
Curve curve =>
(Integer, Integer) -> CryptoFailable (Point curve)
Simple.pointFromIntegers (Integer
x,Integer
y)
| Bool
otherwise -> CryptoError -> CryptoFailable (Point curve)
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_PointFormatInvalid
ecPointsMulVarTime :: forall curve . Simple.Curve curve
=> Simple.Scalar curve
-> Simple.Scalar curve -> Simple.Point curve
-> Simple.Point curve
ecPointsMulVarTime :: Scalar curve -> Scalar curve -> Point curve -> Point curve
ecPointsMulVarTime Scalar curve
n1 = Scalar curve
-> Point curve -> Scalar curve -> Point curve -> Point curve
forall curve.
Curve curve =>
Scalar curve
-> Point curve -> Scalar curve -> Point curve -> Point curve
Simple.pointAddTwoMuls Scalar curve
n1 Point curve
g
where g :: Point curve
g = CurveParameters curve -> Point curve
forall curve. CurveParameters curve -> Point curve
Simple.curveEccG (CurveParameters curve -> Point curve)
-> CurveParameters curve -> Point curve
forall a b. (a -> b) -> a -> b
$ Proxy curve -> CurveParameters curve
forall curve (proxy :: * -> *).
Curve curve =>
proxy curve -> CurveParameters curve
Simple.curveParameters (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
ecScalarFromBinary :: forall curve bs . (Simple.Curve curve, ByteArrayAccess bs)
=> bs -> CryptoFailable (Simple.Scalar curve)
ecScalarFromBinary :: bs -> CryptoFailable (Scalar curve)
ecScalarFromBinary bs
ba
| bs -> Int
forall ba. ByteArrayAccess ba => ba -> Int
B.length bs
ba Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
size = CryptoError -> CryptoFailable (Scalar curve)
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_SecretKeySizeInvalid
| Bool
otherwise = Scalar curve -> CryptoFailable (Scalar curve)
forall a. a -> CryptoFailable a
CryptoPassed (Integer -> Scalar curve
forall curve. Integer -> Scalar curve
Simple.Scalar (Integer -> Scalar curve) -> Integer -> Scalar curve
forall a b. (a -> b) -> a -> b
$ bs -> Integer
forall ba. ByteArrayAccess ba => ba -> Integer
os2ip bs
ba)
where size :: Int
size = Proxy curve -> Int
forall curve (proxy :: * -> *). Curve curve => proxy curve -> Int
ecCurveOrderBytes (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
ecScalarToBinary :: forall curve bs . (Simple.Curve curve, ByteArray bs)
=> Simple.Scalar curve -> bs
ecScalarToBinary :: Scalar curve -> bs
ecScalarToBinary (Simple.Scalar Integer
s) = Int -> Integer -> bs
forall ba. ByteArray ba => Int -> Integer -> ba
i2ospOf_ Int
size Integer
s
where size :: Int
size = Proxy curve -> Int
forall curve (proxy :: * -> *). Curve curve => proxy curve -> Int
ecCurveOrderBytes (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
ecScalarFromInteger :: forall curve . Simple.Curve curve
=> Integer -> CryptoFailable (Simple.Scalar curve)
ecScalarFromInteger :: Integer -> CryptoFailable (Scalar curve)
ecScalarFromInteger Integer
s
| Integer -> Int
numBits Integer
s Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
nb = CryptoError -> CryptoFailable (Scalar curve)
forall a. CryptoError -> CryptoFailable a
CryptoFailed CryptoError
CryptoError_SecretKeySizeInvalid
| Bool
otherwise = Scalar curve -> CryptoFailable (Scalar curve)
forall a. a -> CryptoFailable a
CryptoPassed (Integer -> Scalar curve
forall curve. Integer -> Scalar curve
Simple.Scalar Integer
s)
where nb :: Int
nb = Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Proxy curve -> Int
forall curve (proxy :: * -> *). Curve curve => proxy curve -> Int
ecCurveOrderBytes (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
ecScalarToInteger :: Simple.Scalar curve -> Integer
ecScalarToInteger :: Scalar curve -> Integer
ecScalarToInteger (Simple.Scalar Integer
s) = Integer
s
ecCurveOrderBytes :: Simple.Curve c => proxy c -> Int
ecCurveOrderBytes :: proxy c -> Int
ecCurveOrderBytes proxy c
prx = (Integer -> Int
numBits Integer
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
8
where n :: Integer
n = CurveParameters c -> Integer
forall curve. CurveParameters curve -> Integer
Simple.curveEccN (CurveParameters c -> Integer) -> CurveParameters c -> Integer
forall a b. (a -> b) -> a -> b
$ proxy c -> CurveParameters c
forall curve (proxy :: * -> *).
Curve curve =>
proxy curve -> CurveParameters curve
Simple.curveParameters proxy c
prx
ecScalarAdd :: forall curve . Simple.Curve curve
=> Simple.Scalar curve -> Simple.Scalar curve -> Simple.Scalar curve
ecScalarAdd :: Scalar curve -> Scalar curve -> Scalar curve
ecScalarAdd (Simple.Scalar Integer
a) (Simple.Scalar Integer
b) = Integer -> Scalar curve
forall curve. Integer -> Scalar curve
Simple.Scalar ((Integer
a Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
b) Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Integer
n)
where n :: Integer
n = CurveParameters curve -> Integer
forall curve. CurveParameters curve -> Integer
Simple.curveEccN (CurveParameters curve -> Integer)
-> CurveParameters curve -> Integer
forall a b. (a -> b) -> a -> b
$ Proxy curve -> CurveParameters curve
forall curve (proxy :: * -> *).
Curve curve =>
proxy curve -> CurveParameters curve
Simple.curveParameters (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)
ecScalarMul :: forall curve . Simple.Curve curve
=> Simple.Scalar curve -> Simple.Scalar curve -> Simple.Scalar curve
ecScalarMul :: Scalar curve -> Scalar curve -> Scalar curve
ecScalarMul (Simple.Scalar Integer
a) (Simple.Scalar Integer
b) = Integer -> Scalar curve
forall curve. Integer -> Scalar curve
Simple.Scalar ((Integer
a Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
b) Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Integer
n)
where n :: Integer
n = CurveParameters curve -> Integer
forall curve. CurveParameters curve -> Integer
Simple.curveEccN (CurveParameters curve -> Integer)
-> CurveParameters curve -> Integer
forall a b. (a -> b) -> a -> b
$ Proxy curve -> CurveParameters curve
forall curve (proxy :: * -> *).
Curve curve =>
proxy curve -> CurveParameters curve
Simple.curveParameters (Proxy curve
forall k (t :: k). Proxy t
Proxy :: Proxy curve)