commit 488d2204a44b4bbc181c3a6e3ae3381e83c20aa5
parent 691765b1d70272bc4fc2edac4a5137a1ae6f8255
Author: Jared Tobin <jared@jtobin.io>
Date: Sat, 22 Nov 2025 07:37:22 +0400
lib: add missing strictness, eq for mont
Diffstat:
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/lib/Data/Word/Wide.hs b/lib/Data/Word/Wide.hs
@@ -59,7 +59,7 @@ fi = fromIntegral
-- wide words -----------------------------------------------------------------
-- | Little-endian wide words.
-data Wide = Wide (# Word#, Word# #)
+data Wide = Wide !(# Word#, Word# #)
get_lo# :: (# Word#, Word# #) -> Word#
get_lo# (# l, _ #) = l
diff --git a/lib/Data/Word/Wider.hs b/lib/Data/Word/Wider.hs
@@ -29,7 +29,7 @@ wrapping_neg# w = plusWord# (not# w) 1##
-- wider words ----------------------------------------------------------------
-- | Little-endian wider words.
-data Wider = Wider (# Word#, Word#, Word#, Word# #)
+data Wider = Wider !(# Word#, Word#, Word#, Word# #)
instance Show Wider where
show (Wider (# a, b, c, d #)) =
diff --git a/lib/Numeric/Montgomery/Secp256k1/Curve.hs b/lib/Numeric/Montgomery/Secp256k1/Curve.hs
@@ -9,6 +9,7 @@
module Numeric.Montgomery.Secp256k1.Curve where
import Control.DeepSeq
+import qualified Data.Choice as C
import qualified Data.Word.Limb as L
import qualified Data.Word.Wide as W
import Data.Word.Wider (Wider(..))
@@ -19,11 +20,14 @@ import Prelude hiding (div, mod, or, and, not, quot, rem, recip)
-- montgomery arithmetic, specialized to the secp256k1 field prime modulus
-- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
-data Montgomery = Montgomery (# Word#, Word#, Word#, Word# #)
+data Montgomery = Montgomery !(# Word#, Word#, Word#, Word# #)
instance NFData Montgomery where
rnf (Montgomery a) = case a of (# _, _, _, _ #) -> ()
+instance Eq Montgomery where
+ Montgomery a == Montgomery b = C.decide (C.ct_eq_wider# a b)
+
-- XX define constants here, current approach is fragile
-- utilities ------------------------------------------------------------------
diff --git a/lib/Numeric/Montgomery/Secp256k1/Scalar.hs b/lib/Numeric/Montgomery/Secp256k1/Scalar.hs
@@ -9,6 +9,7 @@
module Numeric.Montgomery.Secp256k1.Scalar where
import Control.DeepSeq
+import qualified Data.Choice as C
import qualified Data.Word.Limb as L
import qualified Data.Word.Wide as W
import Data.Word.Wider (Wider(..))
@@ -19,11 +20,14 @@ import Prelude hiding (div, mod, or, and, not, quot, rem, recip)
-- montgomery arithmetic, specialized to the secp256k1 scalar group order
-- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
-data Montgomery = Montgomery (# Word#, Word#, Word#, Word# #)
+data Montgomery = Montgomery !(# Word#, Word#, Word#, Word# #)
instance NFData Montgomery where
rnf (Montgomery a) = case a of (# _, _, _, _ #) -> ()
+instance Eq Montgomery where
+ Montgomery a == Montgomery b = C.decide (C.ct_eq_wider# a b)
+
-- XX define constants here, current approach is fragile
-- utilities ------------------------------------------------------------------