add support For Ed448 in Crypto.ECC. fix #121
This commit is contained in:
parent
88e614b675
commit
4b34abe310
@ -15,6 +15,7 @@ module Crypto.ECC
|
|||||||
, Curve_P384R1(..)
|
, Curve_P384R1(..)
|
||||||
, Curve_P521R1(..)
|
, Curve_P521R1(..)
|
||||||
, Curve_X25519(..)
|
, Curve_X25519(..)
|
||||||
|
, Curve_X448(..)
|
||||||
, EllipticCurve(..)
|
, EllipticCurve(..)
|
||||||
, EllipticCurveDH(..)
|
, EllipticCurveDH(..)
|
||||||
, EllipticCurveArith(..)
|
, EllipticCurveArith(..)
|
||||||
@ -33,6 +34,7 @@ import Crypto.Internal.ByteArray (ByteArray, ByteArrayAccess, Scrubbed
|
|||||||
import qualified Crypto.Internal.ByteArray as B
|
import qualified Crypto.Internal.ByteArray as B
|
||||||
import Crypto.Number.Serialize (i2ospOf_, os2ip)
|
import Crypto.Number.Serialize (i2ospOf_, os2ip)
|
||||||
import qualified Crypto.PubKey.Curve25519 as X25519
|
import qualified Crypto.PubKey.Curve25519 as X25519
|
||||||
|
import qualified Crypto.PubKey.Ed448 as X448
|
||||||
import Data.Function (on)
|
import Data.Function (on)
|
||||||
import Data.ByteArray (convert)
|
import Data.ByteArray (convert)
|
||||||
|
|
||||||
@ -183,6 +185,23 @@ instance EllipticCurveDH Curve_X25519 where
|
|||||||
ecdh _ s p = SharedSecret $ convert secret
|
ecdh _ s p = SharedSecret $ convert secret
|
||||||
where secret = X25519.dh p s
|
where secret = X25519.dh p s
|
||||||
|
|
||||||
|
data Curve_X448 = Curve_X448
|
||||||
|
|
||||||
|
instance EllipticCurve Curve_X448 where
|
||||||
|
type Point Curve_X448 = X448.PublicKey
|
||||||
|
type Scalar Curve_X448 = X448.SecretKey
|
||||||
|
curveSizeBits _ = 448
|
||||||
|
curveGenerateScalar _ = X448.generateSecretKey
|
||||||
|
curveGenerateKeyPair _ = do
|
||||||
|
s <- X448.generateSecretKey
|
||||||
|
return $ KeyPair (X448.toPublic s) s
|
||||||
|
encodePoint _ p = B.convert p
|
||||||
|
decodePoint _ bs = X448.publicKey bs
|
||||||
|
|
||||||
|
instance EllipticCurveDH Curve_X448 where
|
||||||
|
ecdh _ s p = SharedSecret $ convert secret
|
||||||
|
where secret = X448.dh p s
|
||||||
|
|
||||||
encodeECPoint :: forall curve bs . (Simple.Curve curve, ByteArray bs) => Simple.Point curve -> bs
|
encodeECPoint :: forall curve bs . (Simple.Curve curve, ByteArray bs) => Simple.Point curve -> bs
|
||||||
encodeECPoint Simple.PointO = error "encodeECPoint: cannot serialize point at infinity"
|
encodeECPoint Simple.PointO = error "encodeECPoint: cannot serialize point at infinity"
|
||||||
encodeECPoint (Simple.Point x y) = B.concat [uncompressed,xb,yb]
|
encodeECPoint (Simple.Point x y) = B.concat [uncompressed,xb,yb]
|
||||||
|
|||||||
@ -20,6 +20,7 @@ module Crypto.PubKey.Ed448
|
|||||||
-- * methods
|
-- * methods
|
||||||
, dh
|
, dh
|
||||||
, toPublic
|
, toPublic
|
||||||
|
, generateSecretKey
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Word
|
import Data.Word
|
||||||
@ -27,6 +28,7 @@ import Foreign.Ptr
|
|||||||
import GHC.Ptr
|
import GHC.Ptr
|
||||||
|
|
||||||
import Crypto.Error
|
import Crypto.Error
|
||||||
|
import Crypto.Random
|
||||||
import Crypto.Internal.Compat
|
import Crypto.Internal.Compat
|
||||||
import Crypto.Internal.Imports
|
import Crypto.Internal.Imports
|
||||||
import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes, Bytes, withByteArray)
|
import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes, Bytes, withByteArray)
|
||||||
@ -92,6 +94,10 @@ toPublic (SecretKey sec) = PublicKey <$>
|
|||||||
basePoint = Ptr "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
|
basePoint = Ptr "\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
|
||||||
{-# NOINLINE toPublic #-}
|
{-# NOINLINE toPublic #-}
|
||||||
|
|
||||||
|
-- | Generate a secret key.
|
||||||
|
generateSecretKey :: MonadRandom m => m SecretKey
|
||||||
|
generateSecretKey = SecretKey <$> getRandomBytes x448_bytes
|
||||||
|
|
||||||
x448_bytes :: Int
|
x448_bytes :: Int
|
||||||
x448_bytes = 448 `quot` 8
|
x448_bytes = 448 `quot` 8
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user