packages feed

ppad-fixed 0.1.1 → 0.1.2

raw patch · 10 files changed

+81/−73 lines, 10 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.Choice: MaybeWide# :: (# (# Word#, Word# #), Choice #) -> MaybeWide#
- Data.Choice: MaybeWord# :: (# Word#, Choice #) -> MaybeWord#
- Data.Choice: and# :: Choice -> Choice -> Choice
- Data.Choice: eq# :: Choice -> Choice -> Choice
- Data.Choice: expect_wide# :: MaybeWide# -> String -> (# Word#, Word# #)
- Data.Choice: expect_wide_or# :: MaybeWide# -> (# Word#, Word# #) -> (# Word#, Word# #)
- Data.Choice: just_wide# :: (# Word#, Word# #) -> Choice -> MaybeWide#
- Data.Choice: ne# :: Choice -> Choice -> Choice
- Data.Choice: newtype MaybeWide# :: TYPE 'TupleRep '[ 'TupleRep '[ 'WordRep, 'WordRep], 'WordRep]
- Data.Choice: newtype MaybeWord# :: TYPE 'TupleRep '[ 'WordRep, 'WordRep]
- Data.Choice: none_wide# :: (# Word#, Word# #) -> MaybeWide#
- Data.Choice: none_word# :: Word# -> MaybeWord#
- Data.Choice: not# :: Choice -> Choice
- Data.Choice: or# :: Choice -> Choice -> Choice
- Data.Choice: some_wide# :: (# Word#, Word# #) -> MaybeWide#
- Data.Choice: some_word# :: Word# -> MaybeWord#
- Data.Choice: xor# :: Choice -> Choice -> Choice
- Data.Word.Limb: eq_vartime# :: Limb -> Limb -> Bool
- Data.Word.Limb: ne_vartime# :: Limb -> Limb -> Bool
- Data.Word.Wide: and :: Wide -> Wide -> Wide
- Data.Word.Wide: and# :: Word# -> Word# -> Word#
- Data.Word.Wide: neg :: Wide -> Wide
- Data.Word.Wide: neg# :: (# Limb, Limb #) -> (# Limb, Limb #)
- Data.Word.Wide: not :: Wide -> Wide
- Data.Word.Wide: not# :: Word# -> Word#
- Data.Word.Wide: or :: Wide -> Wide -> Wide
- Data.Word.Wide: or# :: Word# -> Word# -> Word#
- Data.Word.Wide: xor :: Wide -> Wide -> Wide
- Data.Word.Wide: xor# :: Word# -> Word# -> Word#
- Data.Word.Wider: add_mod# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: add_o# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- Data.Word.Wider: add_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: and_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: cmp# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Int#
- Data.Word.Wider: eq# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- Data.Word.Wider: gt# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- Data.Word.Wider: lt# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- Data.Word.Wider: mul_c# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #)
- Data.Word.Wider: not# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: odd# :: (# Limb, Limb, Limb, Limb #) -> Choice
- Data.Word.Wider: or_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: select# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice -> (# Limb, Limb, Limb, Limb #)
- Data.Word.Wider: shl1_c# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Choice #)
- Data.Word.Wider: shl_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- Data.Word.Wider: shr1_c# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Choice #)
- Data.Word.Wider: shr_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- Data.Word.Wider: sqr# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #)
- Data.Word.Wider: sub_b# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- Data.Word.Wider: sub_mod# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- Numeric.Montgomery.Secp256k1.Curve: from_vartime :: Montgomery -> Wider
- Numeric.Montgomery.Secp256k1.Curve: to_vartime :: Wider -> Montgomery
- Numeric.Montgomery.Secp256k1.Scalar: from_vartime :: Montgomery -> Wider
- Numeric.Montgomery.Secp256k1.Scalar: to_vartime :: Wider -> Montgomery
+ Data.Choice: and :: Choice -> Choice -> Choice
+ Data.Choice: eq :: Choice -> Choice -> Choice
+ Data.Choice: ne :: Choice -> Choice -> Choice
+ Data.Choice: not :: Choice -> Choice
+ Data.Choice: or :: Choice -> Choice -> Choice
+ Data.Choice: xor :: Choice -> Choice -> Choice
+ Numeric.Montgomery.Secp256k1.Curve: from :: Montgomery -> Wider
+ Numeric.Montgomery.Secp256k1.Curve: to :: Wider -> Montgomery
+ Numeric.Montgomery.Secp256k1.Scalar: from :: Montgomery -> Wider
+ Numeric.Montgomery.Secp256k1.Scalar: to :: Wider -> Montgomery

Files

CHANGELOG view
@@ -1,5 +1,8 @@ # Changelog +- 0.1.2 (2025-12-27)+  * Fixes an API mistake made in the v0.1.1 release.+ - 0.1.1 (2025-12-27)   * Contains miscellaneous hardening and API refinements to v0.1.1. 
lib/Data/Choice.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE UnliftedNewtypes #-}@@ -46,12 +47,12 @@   , from_wide_le#    -- * Manipulation-  , or#-  , and#-  , xor#-  , not#-  , ne#-  , eq#+  , or+  , and+  , xor+  , not+  , ne+  , eq    -- * Constant-time Selection   , select_word#@@ -67,6 +68,7 @@ import qualified Data.Bits as B import GHC.Exts (Word#, Int(..), Word(..)) import qualified GHC.Exts as Exts+import Prelude hiding (and, not, or)  -- utilities ------------------------------------------------------------------ @@ -346,34 +348,34 @@ -- manipulation ---------------------------------------------------------------  -- | Logically negate a 'Choice'.-not# :: Choice -> Choice-not# (Choice w) = Choice (Exts.not# w)-{-# INLINE not# #-}+not :: Choice -> Choice+not (Choice w) = Choice (Exts.not# w)+{-# INLINE not #-}  -- | Logical disjunction on 'Choice' values.-or# :: Choice -> Choice -> Choice-or# (Choice w0) (Choice w1) = Choice (Exts.or# w0 w1)-{-# INLINE or# #-}+or :: Choice -> Choice -> Choice+or (Choice w0) (Choice w1) = Choice (Exts.or# w0 w1)+{-# INLINE or #-}  -- | Logical conjunction on 'Choice' values.-and# :: Choice -> Choice -> Choice-and# (Choice w0) (Choice w1) = Choice (Exts.and# w0 w1)-{-# INLINE and# #-}+and :: Choice -> Choice -> Choice+and (Choice w0) (Choice w1) = Choice (Exts.and# w0 w1)+{-# INLINE and #-}  -- | Logical inequality on 'Choice' values.-xor# :: Choice -> Choice -> Choice-xor# (Choice w0) (Choice w1) = Choice (Exts.xor# w0 w1)-{-# INLINE xor# #-}+xor :: Choice -> Choice -> Choice+xor (Choice w0) (Choice w1) = Choice (Exts.xor# w0 w1)+{-# INLINE xor #-}  -- | Logical inequality on 'Choice' values.-ne# :: Choice -> Choice -> Choice-ne# c0 c1 = xor# c0 c1-{-# INLINE ne# #-}+ne :: Choice -> Choice -> Choice+ne c0 c1 = xor c0 c1+{-# INLINE ne #-}  -- | Logical equality on 'Choice' values.-eq# :: Choice -> Choice -> Choice-eq# c0 c1 = not# (ne# c0 c1)-{-# INLINE eq# #-}+eq :: Choice -> Choice -> Choice+eq c0 c1 = not (ne c0 c1)+{-# INLINE eq #-}  -- constant-time selection ---------------------------------------------------- 
lib/Data/Word/Limb.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE NumericUnderscores #-}@@ -98,7 +99,7 @@   :: Limb   -> Limb   -> C.Choice-ne# a b = C.not# (eq# a b)+ne# a b = C.not (eq# a b) {-# INLINE ne# #-}  ne_vartime#
lib/Data/Word/Wide.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE NumericUnderscores #-}
lib/Data/Word/Wider.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_HADDOCK prune #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE NumericUnderscores #-}
lib/Numeric/Montgomery/Secp256k1/Curve.hs view
@@ -19,8 +19,8 @@   -- * Montgomery form, secp256k1 field prime modulus     Montgomery(..)   , render-  , to_vartime-  , from_vartime+  , to+  , from   , zero   , one @@ -93,7 +93,7 @@   <> show (W# c) <> ", " <> show (W# d) <> ")"  instance Show Montgomery where-  show = show . from_vartime+  show = show . from  -- | Note that 'fromInteger' necessarily runs in variable time due --   to conversion from the variable-size, potentially heap-allocated@@ -104,7 +104,7 @@   a * b = mul a b   negate a = neg a   abs = id-  fromInteger = to_vartime . WW.to_vartime+  fromInteger = to . WW.to_vartime   signum (Montgomery (# l0, l1, l2, l3 #)) =     let !(Limb l) = l0 `L.or#` l1 `L.or#` l2 `L.or#` l3         !n = C.from_word_nonzero# l@@ -369,14 +369,14 @@ {-# INLINE to# #-}  -- | Convert a 'Wider' word to the Montgomery domain.-to_vartime :: Wider -> Montgomery-to_vartime (Wider x) = Montgomery (to# x)+to :: Wider -> Montgomery+to (Wider x) = Montgomery (to# x)  -- | Retrieve a 'Montgomery' word from the Montgomery domain. -- --   This function is a synonym for 'retr'.-from_vartime :: Montgomery -> Wider-from_vartime = retr+from :: Montgomery -> Wider+from = retr  add#   :: (# Limb, Limb, Limb, Limb #) -- ^ augend
lib/Numeric/Montgomery/Secp256k1/Scalar.hs view
@@ -19,8 +19,8 @@   -- * Montgomery form, secp256k1 scalar group order modulus     Montgomery(..)   , render-  , to_vartime-  , from_vartime+  , to+  , from   , zero   , one @@ -81,7 +81,7 @@ data Montgomery = Montgomery !(# Limb, Limb, Limb, Limb #)  instance Show Montgomery where-  show = show . from_vartime+  show = show . from  -- | Render a 'Montgomery' value as a 'String', showing its individual --   'Limb's.@@ -102,7 +102,7 @@   a * b = mul a b   negate a = neg a   abs = id-  fromInteger = to_vartime . WW.to_vartime+  fromInteger = to . WW.to_vartime   signum (Montgomery (# l0, l1, l2, l3 #)) =     let !(Limb l) = l0 `L.or#` l1 `L.or#` l2 `L.or#` l3         !n = C.from_word_nonzero# l@@ -367,14 +367,14 @@ {-# INLINE to# #-}  -- | Convert a 'Wider' word to the Montgomery domain.-to_vartime :: Wider -> Montgomery-to_vartime (Wider x) = Montgomery (to# x)+to :: Wider -> Montgomery+to (Wider x) = Montgomery (to# x)  -- | Retrieve a 'Montgomery' word from the Montgomery domain. -- --   This function is a synonym for 'retr'.-from_vartime :: Montgomery -> Wider-from_vartime = retr+from :: Montgomery -> Wider+from = retr  add#   :: (# Limb, Limb, Limb, Limb #) -- ^ augend
ppad-fixed.cabal view
@@ -1,6 +1,6 @@ cabal-version:      3.0 name:               ppad-fixed-version:            0.1.1+version:            0.1.2 synopsis:           Large fixed-width words and constant-time arithmetic. license:            MIT license-file:       LICENSE
test/Montgomery/Curve.hs view
@@ -41,7 +41,7 @@ mm = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F  repr :: H.Assertion-repr = H.assertBool mempty (W.eq_vartime 0 (C.from_vartime mm))+repr = H.assertBool mempty (W.eq_vartime 0 (C.from mm))  add_case :: String -> W.Wider -> W.Wider -> W.Wider -> H.Assertion add_case t a b s = do@@ -49,7 +49,7 @@     ((W.from_vartime a + W.from_vartime b) `mod` W.from_vartime m)     (W.from_vartime s)   H.assertBool t-    (W.eq_vartime s (C.from_vartime (C.to_vartime a + C.to_vartime b)))+    (W.eq_vartime s (C.from (C.to a + C.to b)))  add :: H.Assertion add = do@@ -73,7 +73,7 @@     ((W.from_vartime b - W.from_vartime a) `mod` W.from_vartime m)     (W.from_vartime d)   H.assertBool t-    (W.eq_vartime d (C.from_vartime (C.to_vartime b - C.to_vartime a)))+    (W.eq_vartime d (C.from (C.to b - C.to a)))  sub :: H.Assertion sub = do@@ -96,7 +96,7 @@     ((W.from_vartime a * W.from_vartime b) `mod` W.from_vartime m)     (W.from_vartime p)   H.assertBool t-    (W.eq_vartime p (C.from_vartime (C.to_vartime a * C.to_vartime b)))+    (W.eq_vartime p (C.from (C.to a * C.to b)))  mul :: H.Assertion mul = do@@ -122,54 +122,54 @@   arbitrary = fmap W.to_vartime Q.arbitrary  instance Q.Arbitrary C.Montgomery where-  arbitrary = fmap C.to_vartime Q.arbitrary+  arbitrary = fmap C.to Q.arbitrary  add_matches :: W.Wider -> W.Wider -> Bool add_matches a b =-  let ma = C.to_vartime a-      mb = C.to_vartime b+  let ma = C.to a+      mb = C.to b       ia = W.from_vartime a       ib = W.from_vartime b       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia + ib) `mod` im))-        (C.from_vartime (ma + mb))+        (C.from (ma + mb))  mul_matches :: W.Wider -> W.Wider -> Bool mul_matches a b =-  let ma = C.to_vartime a-      mb = C.to_vartime b+  let ma = C.to a+      mb = C.to b       ia = W.from_vartime a       ib = W.from_vartime b       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia * ib) `mod` im))-        (C.from_vartime (ma * mb))+        (C.from (ma * mb))  sqr_matches :: W.Wider -> Bool sqr_matches a =-  let ma = C.to_vartime a+  let ma = C.to a       ia = W.from_vartime a       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia * ia) `mod` im))-        (C.from_vartime (C.sqr ma))+        (C.from (C.sqr ma))  exp_matches :: C.Montgomery -> W.Wider -> Bool exp_matches a b =-  let ia = W.from_vartime (C.from_vartime a)+  let ia = W.from_vartime (C.from a)       nb = fromIntegral (W.from_vartime b)       nm = fromIntegral (W.from_vartime m)   in  W.eq_vartime         (W.to_vartime (modexp ia nb nm))-        (C.from_vartime (C.exp a b))+        (C.from (C.exp a b))  inv_valid :: Q.NonZero C.Montgomery -> Bool inv_valid (Q.NonZero s) = C.eq_vartime (C.inv s * s) 1  odd_correct :: C.Montgomery -> Bool odd_correct w =-  C.odd_vartime w == I.integerTestBit (W.from_vartime (C.from_vartime w)) 0+  C.odd_vartime w == I.integerTestBit (W.from_vartime (C.from w)) 0  tests :: TestTree tests = testGroup "montgomery tests (curve)" [
test/Montgomery/Scalar.hs view
@@ -41,7 +41,7 @@ mm = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141  repr :: H.Assertion-repr = H.assertBool mempty (W.eq_vartime 0 (S.from_vartime mm))+repr = H.assertBool mempty (W.eq_vartime 0 (S.from mm))  add_case :: String -> W.Wider -> W.Wider -> W.Wider -> H.Assertion add_case t a b s = do@@ -49,7 +49,7 @@     ((W.from_vartime a + W.from_vartime b) `mod` W.from_vartime m)     (W.from_vartime s)   H.assertBool t-    (W.eq_vartime s (S.from_vartime (S.to_vartime a + S.to_vartime b)))+    (W.eq_vartime s (S.from (S.to a + S.to b)))  add :: H.Assertion add = do@@ -73,7 +73,7 @@     ((W.from_vartime b - W.from_vartime a) `mod` W.from_vartime m)     (W.from_vartime d)   H.assertBool t-    (W.eq_vartime d (S.from_vartime (S.to_vartime b - S.to_vartime a)))+    (W.eq_vartime d (S.from (S.to b - S.to a)))  sub :: H.Assertion sub = do@@ -96,7 +96,7 @@     ((W.from_vartime a * W.from_vartime b) `mod` W.from_vartime m)     (W.from_vartime p)   H.assertBool t-    (W.eq_vartime p (S.from_vartime (S.to_vartime a * S.to_vartime b)))+    (W.eq_vartime p (S.from (S.to a * S.to b)))  mul :: H.Assertion mul = do@@ -122,47 +122,47 @@   arbitrary = fmap W.to_vartime Q.arbitrary  instance Q.Arbitrary S.Montgomery where-  arbitrary = fmap S.to_vartime Q.arbitrary+  arbitrary = fmap S.to Q.arbitrary  add_matches :: W.Wider -> W.Wider -> Bool add_matches a b =-  let ma = S.to_vartime a-      mb = S.to_vartime b+  let ma = S.to a+      mb = S.to b       ia = W.from_vartime a       ib = W.from_vartime b       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia + ib) `mod` im))-        (S.from_vartime (ma + mb))+        (S.from (ma + mb))  mul_matches :: W.Wider -> W.Wider -> Bool mul_matches a b =-  let ma = S.to_vartime a-      mb = S.to_vartime b+  let ma = S.to a+      mb = S.to b       ia = W.from_vartime a       ib = W.from_vartime b       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia * ib) `mod` im))-        (S.from_vartime (ma * mb))+        (S.from (ma * mb))  sqr_matches :: W.Wider -> Bool sqr_matches a =-  let ma = S.to_vartime a+  let ma = S.to a       ia = W.from_vartime a       im = W.from_vartime m   in  W.eq_vartime         (W.to_vartime ((ia * ia) `mod` im))-        (S.from_vartime (S.sqr ma))+        (S.from (S.sqr ma))  exp_matches :: S.Montgomery -> W.Wider -> Bool exp_matches a b =-  let ia = W.from_vartime (S.from_vartime a)+  let ia = W.from_vartime (S.from a)       nb = fromIntegral (W.from_vartime b)       nm = fromIntegral (W.from_vartime m)   in  W.eq_vartime         (W.to_vartime (modexp ia nb nm))-        (S.from_vartime (S.exp a b))+        (S.from (S.exp a b))  inv_valid :: Q.NonZero S.Montgomery -> Bool inv_valid (Q.NonZero s) = S.eq_vartime (S.inv s * s) 1