Test points with a torsion component
This commit is contained in:
parent
251f164f47
commit
9cd77ed3e2
@ -3,14 +3,33 @@ module ECC.Edwards25519 ( tests ) where
|
|||||||
|
|
||||||
import Crypto.Error
|
import Crypto.Error
|
||||||
import Crypto.ECC.Edwards25519
|
import Crypto.ECC.Edwards25519
|
||||||
|
import qualified Data.ByteString as B
|
||||||
|
import Data.Word (Word8)
|
||||||
import Imports
|
import Imports
|
||||||
|
|
||||||
instance Arbitrary Scalar where
|
instance Arbitrary Scalar where
|
||||||
arbitrary = fmap (throwCryptoError . scalarDecodeLong)
|
arbitrary = fmap (throwCryptoError . scalarDecodeLong)
|
||||||
(arbitraryBS 64)
|
(arbitraryBS 64)
|
||||||
|
|
||||||
|
smallScalar :: Word8 -> Scalar
|
||||||
|
smallScalar = throwCryptoError . scalarDecodeLong . B.singleton
|
||||||
|
|
||||||
|
newtype PrimeOrder = PrimeOrder Point
|
||||||
|
deriving Show
|
||||||
|
|
||||||
|
-- points in the prime-order subgroup
|
||||||
|
instance Arbitrary PrimeOrder where
|
||||||
|
arbitrary = (PrimeOrder . toPoint) `fmap` arbitrary
|
||||||
|
|
||||||
|
-- arbitrary curve point, including points with a torsion component
|
||||||
instance Arbitrary Point where
|
instance Arbitrary Point where
|
||||||
arbitrary = toPoint `fmap` arbitrary
|
arbitrary = do a <- arbitrary
|
||||||
|
b <- elements $ map smallScalar [0 .. 7]
|
||||||
|
return (pointsMulVarTime a b torsion8)
|
||||||
|
|
||||||
|
-- an 8-torsion point
|
||||||
|
torsion8 :: Point
|
||||||
|
torsion8 = throwCryptoError $ pointDecode ("\199\ETBjp=M\216O\186<\vv\r\DLEg\SI* S\250,9\204\198N\199\253w\146\172\ETXz" :: ByteString)
|
||||||
|
|
||||||
tests = testGroup "ECC.Edwards25519"
|
tests = testGroup "ECC.Edwards25519"
|
||||||
[ testGroup "vectors"
|
[ testGroup "vectors"
|
||||||
@ -74,17 +93,20 @@ tests = testGroup "ECC.Edwards25519"
|
|||||||
p0 `propertyEq` pointAdd p (pointNegate p)
|
p0 `propertyEq` pointAdd p (pointNegate p)
|
||||||
, testProperty "doubling" $ \p ->
|
, testProperty "doubling" $ \p ->
|
||||||
pointAdd p p `propertyEq` pointDouble p
|
pointAdd p p `propertyEq` pointDouble p
|
||||||
|
, testCase "8-torsion point" $ do
|
||||||
|
assertBool "mul by 4" $ p0 /= pointMul s4 torsion8
|
||||||
|
assertBool "mul by 8" $ p0 == pointMul s8 torsion8
|
||||||
, testProperty "scalarmult with zero" $ \p ->
|
, testProperty "scalarmult with zero" $ \p ->
|
||||||
p0 `propertyEq` pointMul s0 p
|
p0 `propertyEq` pointMul s0 p
|
||||||
, testProperty "scalarmult with one" $ \p ->
|
, testProperty "scalarmult with one" $ \p ->
|
||||||
p `propertyEq` pointMul s1 p
|
p `propertyEq` pointMul s1 p
|
||||||
, testProperty "scalarmult with two" $ \p ->
|
, testProperty "scalarmult with two" $ \p ->
|
||||||
pointDouble p `propertyEq` pointMul s2 p
|
pointDouble p `propertyEq` pointMul s2 p
|
||||||
, testProperty "scalarmult with curve order - 1" $ \p ->
|
, testProperty "scalarmult with curve order - 1" $ \(PrimeOrder p) ->
|
||||||
pointNegate p `propertyEq` pointMul sI p
|
pointNegate p `propertyEq` pointMul sI p
|
||||||
, testProperty "scalarmult commutative" $ \a b ->
|
, testProperty "scalarmult commutative" $ \a b ->
|
||||||
pointMul a (toPoint b) === pointMul b (toPoint a)
|
pointMul a (toPoint b) === pointMul b (toPoint a)
|
||||||
, testProperty "scalarmult distributive" $ \x y p ->
|
, testProperty "scalarmult distributive" $ \x y (PrimeOrder p) ->
|
||||||
let pR = pointMul x p `pointAdd` pointMul y p
|
let pR = pointMul x p `pointAdd` pointMul y p
|
||||||
in pR `propertyEq` pointMul (x `scalarAdd` y) p
|
in pR `propertyEq` pointMul (x `scalarAdd` y) p
|
||||||
, testProperty "double scalarmult" $ \n1 n2 p ->
|
, testProperty "double scalarmult" $ \n1 n2 p ->
|
||||||
@ -94,9 +116,11 @@ tests = testGroup "ECC.Edwards25519"
|
|||||||
]
|
]
|
||||||
where
|
where
|
||||||
p0 = toPoint s0
|
p0 = toPoint s0
|
||||||
s0 = throwCryptoError $ scalarDecodeLong ("" :: ByteString)
|
s0 = smallScalar 0
|
||||||
s1 = throwCryptoError $ scalarDecodeLong ("\x01" :: ByteString)
|
s1 = smallScalar 1
|
||||||
s2 = throwCryptoError $ scalarDecodeLong ("\x02" :: ByteString)
|
s2 = smallScalar 2
|
||||||
|
s4 = smallScalar 4
|
||||||
|
s8 = smallScalar 8
|
||||||
sI = throwCryptoError $ scalarDecodeLong ("\236\211\245\\\SUBc\DC2X\214\156\247\162\222\249\222\DC4\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\DLE" :: ByteString)
|
sI = throwCryptoError $ scalarDecodeLong ("\236\211\245\\\SUBc\DC2X\214\156\247\162\222\249\222\DC4\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\DLE" :: ByteString)
|
||||||
sN = throwCryptoError $ scalarDecodeLong ("\237\211\245\\\SUBc\DC2X\214\156\247\162\222\249\222\DC4\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\DLE" :: ByteString)
|
sN = throwCryptoError $ scalarDecodeLong ("\237\211\245\\\SUBc\DC2X\214\156\247\162\222\249\222\DC4\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\DLE" :: ByteString)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user