mirror of
https://github.com/status-im/constantine.git
synced 2025-02-23 17:38:09 +00:00
* Add MultiScalar recoding from "Efficient and Secure Algorithms for GLV-Based Scalar Multiplication" by Faz et al * precompute cube root of unity - Add VM precomputation of Fp - workaround upstream bug https://github.com/nim-lang/Nim/issues/14585 * Add the φ-accelerated lookup table builder * Add a dedicated bithacks file * cosmetic import consistency * Build the φ precompute table with n-1 EC additions instead of 2^(n-1) additions * remove binary * Add the GLV precomputations to the sage scripts * You can't avoid it, bigint multiplication is needed at one point * Add bigint multiplication discarding some low words * Implement the lattice decomposition in sage * Proper decomposition for BN254 * Prepare the code for a new scalar mul * We compile, and now debugging hunt * More helpers to debug GLV scalar Mul * Fix conditional negation * Endomorphism accelerated scalar mul working for BN254 curve * Implement endomorphism acceleration for BLS12-381 (needed cofactor clearing of the point) * fix nimble test script after bench rename
43 lines
1.2 KiB
Nim
43 lines
1.2 KiB
Nim
import std/macros
|
|
|
|
proc replaceNodes(ast: NimNode, what: NimNode, by: NimNode): NimNode =
|
|
# Replace "what" ident node by "by"
|
|
proc inspect(node: NimNode): NimNode =
|
|
case node.kind:
|
|
of {nnkIdent, nnkSym}:
|
|
if node.eqIdent(what):
|
|
return by
|
|
return node
|
|
of nnkEmpty:
|
|
return node
|
|
of nnkLiterals:
|
|
return node
|
|
else:
|
|
var rTree = node.kind.newTree()
|
|
for child in node:
|
|
rTree.add inspect(child)
|
|
return rTree
|
|
result = inspect(ast)
|
|
|
|
macro staticFor*(idx: untyped{nkIdent}, start, stopEx: static int, body: untyped): untyped =
|
|
result = newStmtList()
|
|
for i in start ..< stopEx:
|
|
result.add nnkBlockStmt.newTree(
|
|
ident("unrolledIter_" & $idx & $i),
|
|
body.replaceNodes(idx, newLit i)
|
|
)
|
|
|
|
{.experimental: "dynamicBindSym".}
|
|
|
|
macro staticFor*(ident: untyped{nkIdent}, choices: typed, body: untyped): untyped =
|
|
## matches
|
|
## staticFor(curve, TestCurves):
|
|
## body
|
|
## and unroll the body for each curve in TestCurves
|
|
result = newStmtList()
|
|
for choice in choices:
|
|
result.add nnkBlockStmt.newTree(
|
|
ident($ident & "_" & $choice.intVal),
|
|
body.replaceNodes(ident, choice)
|
|
)
|