diff --git a/Crypto/ECC.hs b/Crypto/ECC.hs index e2897da..40092a0 100644 --- a/Crypto/ECC.hs +++ b/Crypto/ECC.hs @@ -100,8 +100,20 @@ instance EllipticCurve Curve_P256R1 where curveGenerateScalar _ = P256.scalarGenerate curveGenerateKeyPair _ = toKeyPair <$> P256.scalarGenerate where toKeyPair scalar = KeyPair (P256.toPoint scalar) scalar - encodePoint _ p = P256.pointToBinary p - decodePoint _ bs = P256.pointFromBinary bs + encodePoint _ p = mxy + where + mxy :: forall bs. ByteArray bs => bs + mxy = B.concat [uncompressed, xy] + where + uncompressed, xy :: bs + uncompressed = B.singleton 4 + xy = P256.pointToBinary p + decodePoint _ mxy = case B.uncons mxy of + Nothing -> CryptoFailed $ CryptoError_PointSizeInvalid + Just (m,xy) + -- uncompressed + | m == 4 -> P256.pointFromBinary xy + | otherwise -> CryptoFailed $ CryptoError_PointFormatInvalid instance EllipticCurveArith Curve_P256R1 where pointAdd _ a b = P256.pointAdd a b diff --git a/Crypto/PubKey/ECC/P256.hs b/Crypto/PubKey/ECC/P256.hs index 99ecbcc..e5a6e1d 100644 --- a/Crypto/PubKey/ECC/P256.hs +++ b/Crypto/PubKey/ECC/P256.hs @@ -49,7 +49,7 @@ import Crypto.Internal.Compat import Crypto.Internal.Imports import Crypto.Internal.ByteArray import qualified Crypto.Internal.ByteArray as B -import Data.Memory.PtrMethods (memSet, memCopy) +import Data.Memory.PtrMethods (memSet) import Crypto.Error import Crypto.Random import Crypto.Number.Serialize.Internal (os2ip, i2ospOf) @@ -119,7 +119,7 @@ pointDh scalar p = B.unsafeCreate scalarSize $ \dst -> withTempPoint $ \dx dy -> do withScalar scalar $ \n -> withPoint p $ \px py -> withScalarZero $ \nzero -> ccryptonite_p256_points_mul_vartime nzero n px py dx dy - memCopy dst (castPtr dx) scalarSize + ccryptonite_p256_to_bin (castPtr dx) dst -- | multiply the point @p with @n2 and add a lifted to curve value @n1 --