| Copyright | (c) 2025 Jared Tobin |
|---|---|
| License | MIT |
| Maintainer | Jared Tobin <jared@ppad.tech> |
| Safe Haskell | None |
| Language | Haskell2010 |
Numeric.Montgomery.Secp256k1.Scalar
Description
Montgomery form Wider words, as well as arithmetic operations, with
domain derived from the secp256k1 elliptic curve scalar group order.
Synopsis
- data Montgomery = Montgomery !(# Limb, Limb, Limb, Limb #)
- render :: Montgomery -> String
- to :: Wider -> Montgomery
- from :: Montgomery -> Wider
- zero :: Montgomery
- one :: Montgomery
- eq :: Montgomery -> Montgomery -> Choice
- eq_vartime :: Montgomery -> Montgomery -> Bool
- redc :: Montgomery -> Montgomery -> Montgomery
- retr :: Montgomery -> Wider
- redc# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- retr# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- select# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice -> (# Limb, Limb, Limb, Limb #)
- select :: Montgomery -> Montgomery -> Choice -> Montgomery
- add :: Montgomery -> Montgomery -> Montgomery
- add# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- sub :: Montgomery -> Montgomery -> Montgomery
- sub# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- mul :: Montgomery -> Montgomery -> Montgomery
- mul# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- sqr :: Montgomery -> Montgomery
- sqr# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- neg :: Montgomery -> Montgomery
- neg# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- inv :: Montgomery -> Montgomery
- inv# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- exp :: Montgomery -> Wider -> Montgomery
- odd# :: (# Limb, Limb, Limb, Limb #) -> Choice
- odd :: Montgomery -> Bool
Montgomery form, secp256k1 scalar group order modulus
data Montgomery Source #
Montgomery-form Wider words, on the Montgomery domain defined by
the secp256k1 scalar group order.
>>>let one = 1 :: Montgomery>>>one1>>>putStrLn (render one)(4624529908474429119, 4994812053365940164, 1, 0)
Constructors
| Montgomery !(# Limb, Limb, Limb, Limb #) |
Instances
| Num Montgomery Source # | |
Defined in Numeric.Montgomery.Secp256k1.Scalar Methods (+) :: Montgomery -> Montgomery -> Montgomery # (-) :: Montgomery -> Montgomery -> Montgomery # (*) :: Montgomery -> Montgomery -> Montgomery # negate :: Montgomery -> Montgomery # abs :: Montgomery -> Montgomery # signum :: Montgomery -> Montgomery # fromInteger :: Integer -> Montgomery # | |
| Show Montgomery Source # | |
Defined in Numeric.Montgomery.Secp256k1.Scalar Methods showsPrec :: Int -> Montgomery -> ShowS # show :: Montgomery -> String # showList :: [Montgomery] -> ShowS # | |
| NFData Montgomery Source # | |
Defined in Numeric.Montgomery.Secp256k1.Scalar Methods rnf :: Montgomery -> () # | |
| Eq Montgomery Source # | |
Defined in Numeric.Montgomery.Secp256k1.Scalar | |
render :: Montgomery -> String Source #
Render a Montgomery value as a String, showing its individual
Limbs.
>>>putStrLn (render 1)(4624529908474429119, 4994812053365940164, 1, 0)
from :: Montgomery -> Wider Source #
Retrieve a Montgomery word from the Montgomery domain.
This function is a synonym for retr.
zero :: Montgomery Source #
Zero (the additive unit) in the Montgomery domain.
one :: Montgomery Source #
One (the multiplicative unit) in the Montgomery domain.
Comparison
eq :: Montgomery -> Montgomery -> Choice Source #
Constant-time equality comparison.
eq_vartime :: Montgomery -> Montgomery -> Bool Source #
Variable-time equality comparison.
Reduction and retrieval
Arguments
| :: Montgomery | low wider-word, Montgomery form |
| -> Montgomery | high wider-word, Montgomery form |
| -> Montgomery | reduced value |
Montgomery reduction.
The first argument represents the low words, and the second the high words, of an extra-large eight-limb word in Montgomery form.
Arguments
| :: Montgomery | value in Montgomery form |
| -> Wider | retrieved value |
Retrieve a Montgomery value from the Montgomery domain, producing
a Wider word.
Constant-time selection
Arguments
| :: Montgomery | a |
| -> Montgomery | b |
| -> Choice | c |
| -> Montgomery | result |
Return a if c is truthy, otherwise return b.
>>>import qualified Data.Choice as C>>>select 0 1 (C.true# ())1
Montgomery arithmetic
Arguments
| :: Montgomery | augend |
| -> Montgomery | addend |
| -> Montgomery | sum |
Addition in the Montgomery domain.
Note that Montgomery is an instance of Num, so you can use +
to apply this function.
>>>1 + 1 :: Montgomery2
Arguments
| :: Montgomery | minuend |
| -> Montgomery | subtrahend |
| -> Montgomery | difference |
Subtraction in the Montgomery domain.
Note that Montgomery is an instance of Num, so you can use -
to apply this function.
>>>1 - 1 :: Montgomery0
Arguments
| :: Montgomery | multiplicand in montgomery form |
| -> Montgomery | multiplier in montgomery form |
| -> Montgomery | montgomery product |
Multiplication in the Montgomery domain.
Note that Montgomery is an instance of Num, so you can use *
to apply this function.
>>>1 * 1 :: Montgomery1
mul# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) Source #
Arguments
| :: Montgomery | argument |
| -> Montgomery | square |
Squaring in the Montgomery domain.
>>>sqr 11>>>sqr 24>>>sqr (negate 2)4
neg :: Montgomery -> Montgomery Source #
Additive inverse in the Montgomery domain.
Note that Montgomery is an instance of Num, so you can use negate
to apply this function.
>>>negate 1 :: Montgomery115792089237316195423570985008687907852837564279074904382605163141518161494336>>>(negate 1 :: Montgomery) + 10
Arguments
| :: Montgomery | argument |
| -> Montgomery | inverse |
Multiplicative inverse in the Montgomery domain.
> inv 2
57896044618658097711785492504343953926418782139537452191302581570759080747169 >> inv 2 * 2 1
exp :: Montgomery -> Wider -> Montgomery Source #
Exponentiation in the Montgomery domain.
>>>exp 2 38>>>exp 2 101024
odd :: Montgomery -> Bool Source #
Check if a Montgomery value is odd.
>>>odd 1True>>>odd 2False>>>Data.Word.Wider.odd (retr 3) -- parity is preservedTrue