From 1ba4871032a2317648f25c591feb179e8b82dace Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Mon, 5 Dec 2016 13:34:33 +0900 Subject: [PATCH 1/2] fixing P256 binary format. --- Crypto/ECC.hs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 From 9845734b2b2e2747c7687d5e4585ba228b200c7d Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Mon, 5 Dec 2016 13:34:54 +0900 Subject: [PATCH 2/2] fixing P256 endian. --- Crypto/PubKey/ECC/P256.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 --