Implement to Montgomery domain conversion
This commit is contained in:
parent
22d8bc218d
commit
27e2d2d2bc
|
@ -6,8 +6,9 @@
|
||||||
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
|
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
|
||||||
![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)
|
![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)
|
||||||
|
|
||||||
This library provides constant time finite field primitives.
|
This library provides constant time finite field primitives for implementation of elliptic curve cryptography.
|
||||||
The main use will be for implementation of elliptic curve cryptography
|
|
||||||
|
Warning ⚠️: The library is in development state.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
|
|
@ -160,14 +160,14 @@ template scaleadd_impl(a: var Fp, c: Limb) =
|
||||||
sub(a, Fp.P, tooBig)
|
sub(a, Fp.P, tooBig)
|
||||||
|
|
||||||
func scaleadd*(a: var Fp, c: Limb) =
|
func scaleadd*(a: var Fp, c: Limb) =
|
||||||
## Scale-accumulate
|
## Scale-accumulate modulo P
|
||||||
##
|
##
|
||||||
## With a word W = 2^LimbBitSize and a field Fp
|
## With a word W = 2^LimbBitSize and a field Fp
|
||||||
## Does a <- a * W + c (mod p)
|
## Does a <- a * W + c (mod p)
|
||||||
scaleadd_impl(a, c)
|
scaleadd_impl(a, c)
|
||||||
|
|
||||||
func scaleadd*(a: var Fp, c: static Limb) =
|
func scaleadd*(a: var Fp, c: static Limb) =
|
||||||
## Scale-accumulate
|
## Scale-accumulate modulo P
|
||||||
##
|
##
|
||||||
## With a word W = 2^LimbBitSize and a field Fp
|
## With a word W = 2^LimbBitSize and a field Fp
|
||||||
## Does a <- a * W + c (mod p)
|
## Does a <- a * W + c (mod p)
|
||||||
|
|
|
@ -69,5 +69,12 @@ func montyMagic*(M: static BigInt): static Limb =
|
||||||
for _ in static(0 ..< k):
|
for _ in static(0 ..< k):
|
||||||
result *= 2 + M * result # x' = x(2 + ax) (`+` to avoid negating at the end)
|
result *= 2 + M * result # x' = x(2 + ax) (`+` to avoid negating at the end)
|
||||||
|
|
||||||
# func toMonty*[P: static BigInt](a: Fp[P], montyMagic: Limb): Montgomery[P] =
|
func toMonty*[P: static BigInt](a: Fp[P]): Montgomery[P] =
|
||||||
|
## Convert a big integer over Fp to it's montgomery representation
|
||||||
|
## over Fp.
|
||||||
|
## i.e. Does "a * (2^LimbSize)^W (mod p), where W is the number
|
||||||
|
## of words needed to represent p in base 2^LimbSize
|
||||||
|
|
||||||
|
result = a
|
||||||
|
for i in static(countdown(P.limbs.high, 0)):
|
||||||
|
scaleadd(result, 0)
|
||||||
|
|
Loading…
Reference in New Issue