implementing ecdh fpr P256 and P521.
This commit is contained in:
parent
c29fa82417
commit
9a0ec9166a
@ -25,6 +25,7 @@ import qualified Crypto.PubKey.ECC.Prim as H
|
|||||||
import Crypto.Random
|
import Crypto.Random
|
||||||
import Crypto.Internal.Imports
|
import Crypto.Internal.Imports
|
||||||
import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes)
|
import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes)
|
||||||
|
import Crypto.Number.Serialize (i2ospOf_)
|
||||||
import Data.Function (on)
|
import Data.Function (on)
|
||||||
|
|
||||||
-- | An elliptic curve key pair composed of the private part (a scalar), and
|
-- | An elliptic curve key pair composed of the private part (a scalar), and
|
||||||
@ -97,11 +98,17 @@ instance EllipticCurve Curve_P256R1 where
|
|||||||
curveGenerateScalar = P256Scalar <$> P256.scalarGenerate
|
curveGenerateScalar = P256Scalar <$> P256.scalarGenerate
|
||||||
curveGenerateKeyPair = toKeyPair <$> P256.scalarGenerate
|
curveGenerateKeyPair = toKeyPair <$> P256.scalarGenerate
|
||||||
where toKeyPair scalar = KeyPair (P256Point $ P256.toPoint scalar) (P256Scalar scalar)
|
where toKeyPair scalar = KeyPair (P256Point $ P256.toPoint scalar) (P256Scalar scalar)
|
||||||
|
|
||||||
instance EllipticCurveArith Curve_P256R1 where
|
instance EllipticCurveArith Curve_P256R1 where
|
||||||
pointAdd a b = P256Point $ (P256.pointAdd `on` unP256Point) a b
|
pointAdd a b = P256Point $ (P256.pointAdd `on` unP256Point) a b
|
||||||
pointSmul s p = P256Point $ P256.pointMul (unP256Scalar s) (unP256Point p)
|
pointSmul s p = P256Point $ P256.pointMul (unP256Scalar s) (unP256Point p)
|
||||||
|
|
||||||
instance EllipticCurveDH Curve_P256R1 where
|
instance EllipticCurveDH Curve_P256R1 where
|
||||||
ecdh s p = undefined
|
ecdh s p = shared
|
||||||
|
where
|
||||||
|
(x, _) = P256.pointToIntegers $ unP256Point $ pointSmul s p
|
||||||
|
len = (256 + 7) `div` 8
|
||||||
|
shared = SharedSecret $ i2ospOf_ len x
|
||||||
|
|
||||||
data Curve_P521R1 = Curve_P521R1
|
data Curve_P521R1 = Curve_P521R1
|
||||||
|
|
||||||
@ -115,7 +122,14 @@ instance EllipticCurve Curve_P521R1 where
|
|||||||
curveGenerateScalar = P521Scalar <$> H.scalarGenerate (H.getCurveByName H.SEC_p521r1)
|
curveGenerateScalar = P521Scalar <$> H.scalarGenerate (H.getCurveByName H.SEC_p521r1)
|
||||||
curveGenerateKeyPair = toKeyPair <$> H.scalarGenerate (H.getCurveByName H.SEC_p521r1)
|
curveGenerateKeyPair = toKeyPair <$> H.scalarGenerate (H.getCurveByName H.SEC_p521r1)
|
||||||
where toKeyPair scalar = KeyPair (P521Point $ H.pointBaseMul (H.getCurveByName H.SEC_p521r1) scalar) (P521Scalar scalar)
|
where toKeyPair scalar = KeyPair (P521Point $ H.pointBaseMul (H.getCurveByName H.SEC_p521r1) scalar) (P521Scalar scalar)
|
||||||
|
|
||||||
instance EllipticCurveArith Curve_P521R1 where
|
instance EllipticCurveArith Curve_P521R1 where
|
||||||
pointAdd a b = P521Point $ (H.pointAdd (H.getCurveByName H.SEC_p521r1) `on` unP521Point) a b
|
pointAdd a b = P521Point $ (H.pointAdd (H.getCurveByName H.SEC_p521r1) `on` unP521Point) a b
|
||||||
pointSmul s p = P521Point (H.pointMul (H.getCurveByName H.SEC_p521r1) (unP521Scalar s) (unP521Point p))
|
pointSmul s p = P521Point (H.pointMul (H.getCurveByName H.SEC_p521r1) (unP521Scalar s) (unP521Point p))
|
||||||
|
|
||||||
|
instance EllipticCurveDH Curve_P521R1 where
|
||||||
|
ecdh s p = shared
|
||||||
|
where
|
||||||
|
H.Point x _ = unP521Point $ pointSmul s p
|
||||||
|
len = (521 + 7) `div` 8
|
||||||
|
shared = SharedSecret $ i2ospOf_ len x
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user