mirror of
https://github.com/status-im/constantine.git
synced 2025-02-23 09:28:07 +00:00
Add placeholders for alternative Fp2 implementations
This commit is contained in:
parent
1f0ef23da7
commit
feb6557402
@ -67,6 +67,10 @@ From Ben Edgington, https://hackmd.io/@benjaminion/bls12-381
|
|||||||
Augusto Jun Devegili and Colm Ó hÉigeartaigh and Michael Scott and Ricardo Dahab, 2006\
|
Augusto Jun Devegili and Colm Ó hÉigeartaigh and Michael Scott and Ricardo Dahab, 2006\
|
||||||
https://eprint.iacr.org/2006/471
|
https://eprint.iacr.org/2006/471
|
||||||
|
|
||||||
|
- Software Implementation of Pairings\
|
||||||
|
D. Hankerson, A. Menezes, and M. Scott, 2009\
|
||||||
|
http://cacr.uwaterloo.ca/~ajmeneze/publications/pairings_software.pdf
|
||||||
|
|
||||||
- Constructing Tower Extensions for the implementation of Pairing-Based Cryptography\
|
- Constructing Tower Extensions for the implementation of Pairing-Based Cryptography\
|
||||||
Naomi Benger and Michael Scott, 2009\
|
Naomi Benger and Michael Scott, 2009\
|
||||||
https://eprint.iacr.org/2009/556
|
https://eprint.iacr.org/2009/556
|
||||||
|
72
constantine/tower_field_extensions/fp2_sqrt_minus2.nim
Normal file
72
constantine/tower_field_extensions/fp2_sqrt_minus2.nim
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# Constantine
|
||||||
|
# Copyright (c) 2018-2019 Status Research & Development GmbH
|
||||||
|
# Copyright (c) 2020-Present Mamy André-Ratsimbazafy
|
||||||
|
# Licensed and distributed under either of
|
||||||
|
# * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT).
|
||||||
|
# * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0).
|
||||||
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
|
# ############################################################
|
||||||
|
#
|
||||||
|
# Quadratic Extension field over base field 𝔽p
|
||||||
|
# 𝔽p2 = 𝔽p[√-5]
|
||||||
|
#
|
||||||
|
# ############################################################
|
||||||
|
|
||||||
|
# This implements a quadratic extension field over
|
||||||
|
# the base field 𝔽p:
|
||||||
|
# 𝔽p2 = 𝔽p[x]
|
||||||
|
# with element A of coordinates (a0, a1) represented
|
||||||
|
# by a0 + a1 x
|
||||||
|
#
|
||||||
|
# The irreducible polynomial chosen is
|
||||||
|
# x² - µ with µ = -2
|
||||||
|
# i.e. 𝔽p2 = 𝔽p[√-2]
|
||||||
|
#
|
||||||
|
# Consequently, for this file Fp2 to be valid
|
||||||
|
# -2 MUST not be a square in 𝔽p
|
||||||
|
#
|
||||||
|
# References
|
||||||
|
# [1] Software Implementation of Pairings\
|
||||||
|
# D. Hankerson, A. Menezes, and M. Scott, 2009\
|
||||||
|
# http://cacr.uwaterloo.ca/~ajmeneze/publications/pairings_software.pdf
|
||||||
|
|
||||||
|
|
||||||
|
import
|
||||||
|
../arithmetic/finite_fields,
|
||||||
|
../config/curves,
|
||||||
|
./abelian_groups
|
||||||
|
|
||||||
|
type
|
||||||
|
Fp2*[C: static Curve] = object
|
||||||
|
## Element of the extension field
|
||||||
|
## 𝔽p2 = 𝔽p[√-2] of a prime p
|
||||||
|
##
|
||||||
|
## with coordinates (c0, c1) such as
|
||||||
|
## c0 + c1 √-2
|
||||||
|
##
|
||||||
|
## This requires -2 to not be a square (mod p)
|
||||||
|
c0*, c1*: Fp[C]
|
||||||
|
|
||||||
|
func square*(r: var Fp2, a: Fp2) =
|
||||||
|
## Return a^2 in 𝔽p2 in ``r``
|
||||||
|
## ``r`` is initialized/overwritten
|
||||||
|
# (c0, c1)² => (c0 + c1√-2)²
|
||||||
|
# => c0² + 2 c0 c1√-2 + (c1√-2)²
|
||||||
|
# => c0² - 2c1² + 2 c0 c1 √-2
|
||||||
|
# => (c0²-2c1², 2 c0 c1)
|
||||||
|
#
|
||||||
|
# Costs (naive implementation)
|
||||||
|
# - 2 Multiplications 𝔽p
|
||||||
|
# - 1 Squaring 𝔽p
|
||||||
|
# - 1 Doubling 𝔽p
|
||||||
|
# - 1 Substraction 𝔽p
|
||||||
|
# Stack: 6 * ModulusBitSize (4x 𝔽p element + 2 named temporaries + 1 "in-place" mul temporary)
|
||||||
|
|
||||||
|
var c1d, c0s {.noInit.}: typeof(a.c1)
|
||||||
|
c1d.double(a.c1) # c1d = 2 c1 [1 Dbl]
|
||||||
|
c0s.square(a.c0) # c0s = c0² [1 Sqr, 1 Dbl]
|
||||||
|
|
||||||
|
r.c1.prod(c1d, a.c0) # r.c1 = 2 c1 c0 [1 Mul, 1 Sqr, 1 Dbl]
|
||||||
|
c1d *= a.c1 # c1d = 2 c1² [2 Mul, 1 Sqr, 1 Dbl] - 1 "in-place" temporary
|
||||||
|
r.c0.diff(c0s, c1d) # r.c0 = c0²-2c1² [2 Mul, 1 Sqr, 1 Dbl, 1 Sub]
|
52
constantine/tower_field_extensions/fp2_sqrt_minus5.nim
Normal file
52
constantine/tower_field_extensions/fp2_sqrt_minus5.nim
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Constantine
|
||||||
|
# Copyright (c) 2018-2019 Status Research & Development GmbH
|
||||||
|
# Copyright (c) 2020-Present Mamy André-Ratsimbazafy
|
||||||
|
# Licensed and distributed under either of
|
||||||
|
# * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT).
|
||||||
|
# * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0).
|
||||||
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
|
# ############################################################
|
||||||
|
#
|
||||||
|
# Quadratic Extension field over base field 𝔽p
|
||||||
|
# 𝔽p2 = 𝔽p[√-5]
|
||||||
|
#
|
||||||
|
# ############################################################
|
||||||
|
|
||||||
|
# This implements a quadratic extension field over
|
||||||
|
# the base field 𝔽p:
|
||||||
|
# 𝔽p2 = 𝔽p[x]
|
||||||
|
# with element A of coordinates (a0, a1) represented
|
||||||
|
# by a0 + a1 x
|
||||||
|
#
|
||||||
|
# The irreducible polynomial chosen is
|
||||||
|
# x² - µ with µ = -5
|
||||||
|
# i.e. 𝔽p2 = 𝔽p[√-5]
|
||||||
|
#
|
||||||
|
# Consequently, for this file Fp2 to be valid
|
||||||
|
# -5 MUST not be a square in 𝔽p
|
||||||
|
#
|
||||||
|
# References
|
||||||
|
# [1] High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves\
|
||||||
|
# Jean-Luc Beuchat and Jorge Enrique González Díaz and Shigeo Mitsunari and Eiji Okamoto and Francisco Rodríguez-Henríquez and Tadanori Teruya, 2010\
|
||||||
|
# https://eprint.iacr.org/2010/354
|
||||||
|
|
||||||
|
import
|
||||||
|
../arithmetic/finite_fields,
|
||||||
|
../config/curves,
|
||||||
|
./abelian_groups
|
||||||
|
|
||||||
|
type
|
||||||
|
Fp2*[C: static Curve] = object
|
||||||
|
## Element of the extension field
|
||||||
|
## 𝔽p2 = 𝔽p[√-5] of a prime p
|
||||||
|
##
|
||||||
|
## with coordinates (c0, c1) such as
|
||||||
|
## c0 + c1 √-5
|
||||||
|
##
|
||||||
|
## This requires -5 to not be a square (mod p)
|
||||||
|
c0*, c1*: Fp[C]
|
||||||
|
|
||||||
|
# TODO: need fast multiplication by small constant
|
||||||
|
# which probably requires lazy carries
|
||||||
|
# https://github.com/mratsim/constantine/issues/15
|
Loading…
x
Reference in New Issue
Block a user