lib_curves.nim
1 # Constantine 2 # Copyright (c) 2018-2019 Status Research & Development GmbH 3 # Copyright (c) 2020-Present Mamy André-Ratsimbazafy 4 # Licensed and distributed under either of 5 # * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT). 6 # * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0). 7 # at your option. This file may not be copied, modified, or distributed except according to those terms. 8 9 # ############################################################ 10 # 11 # Curves 12 # 13 # ############################################################ 14 15 import ./c_curve_decls 16 export c_curve_decls 17 18 when not defined(CTT_MAKE_HEADERS): 19 template collectBindings(cBindingsStr: untyped, body: typed): untyped = 20 body 21 else: 22 # We gate `c_typedefs` as it imports strutils 23 # which uses the {.rtl.} pragma and might compile in Nim Runtime Library procs 24 # that cannot be removed. 25 # 26 # We want to ensure its only used for header generation, not in deployment. 27 import ./c_typedefs 28 import std/[macros, strutils] 29 30 macro collectBindings(cBindingsStr: untyped, body: typed): untyped = 31 ## Collect function definitions from a generator template 32 var cBindings: string 33 for generator in body: 34 generator.expectKind(nnkStmtList) 35 for fnDef in generator: 36 if fnDef.kind notin {nnkProcDef, nnkFuncDef}: 37 continue 38 39 cBindings &= "\n" 40 # rettype name(pType0* pName0, pType1* pName1, ...); 41 cBindings &= fnDef.params[0].toCrettype() 42 cBindings &= ' ' 43 cBindings &= $fnDef.name 44 cBindings &= '(' 45 for i in 1 ..< fnDef.params.len: 46 if i != 1: cBindings &= ", " 47 48 let paramDef = fnDef.params[i] 49 paramDef.expectKind(nnkIdentDefs) 50 let pType = paramDef[^2] 51 # No default value 52 paramDef[^1].expectKind(nnkEmpty) 53 54 for j in 0 ..< paramDef.len - 2: 55 if j != 0: cBindings &= ", " 56 var name = $paramDef[j] 57 cBindings &= toCparam(name.split('`')[0], pType) 58 59 if fnDef.params[0].eqIdent"bool": 60 cBindings &= ") __attribute__((warn_unused_result));" 61 else: 62 cBindings &= ");" 63 64 65 result = newConstStmt(nnkPostfix.newTree(ident"*", cBindingsStr), newLit cBindings) 66 67 68 # ---------------------------------------------------------- 69 70 type 71 bls12_381_fr = Fr[BLS12_381] 72 bls12_381_fp = Fp[BLS12_381] 73 bls12_381_fp2 = Fp2[BLS12_381] 74 bls12_381_ec_g1_aff = ECP_ShortW_Aff[Fp[BLS12_381], G1] 75 bls12_381_ec_g1_jac = ECP_ShortW_Jac[Fp[BLS12_381], G1] 76 bls12_381_ec_g1_prj = ECP_ShortW_Prj[Fp[BLS12_381], G1] 77 bls12_381_ec_g2_aff = ECP_ShortW_Aff[Fp2[BLS12_381], G2] 78 bls12_381_ec_g2_jac = ECP_ShortW_Jac[Fp2[BLS12_381], G2] 79 bls12_381_ec_g2_prj = ECP_ShortW_Prj[Fp2[BLS12_381], G2] 80 81 collectBindings(cBindings_bls12_381): 82 genBindingsField(bls12_381_fr) 83 genBindingsField(bls12_381_fp) 84 genBindingsFieldSqrt(bls12_381_fp) 85 genBindingsExtField(bls12_381_fp2) 86 genBindingsExtFieldSqrt(bls12_381_fp2) 87 genBindings_EC_ShortW_Affine(bls12_381_ec_g1_aff, bls12_381_fp) 88 genBindings_EC_ShortW_NonAffine(bls12_381_ec_g1_jac, bls12_381_ec_g1_aff, bls12_381_fp) 89 genBindings_EC_ShortW_NonAffine(bls12_381_ec_g1_prj, bls12_381_ec_g1_aff, bls12_381_fp) 90 genBindings_EC_ShortW_Affine(bls12_381_ec_g2_aff, bls12_381_fp2) 91 genBindings_EC_ShortW_NonAffine(bls12_381_ec_g2_jac, bls12_381_ec_g2_aff, bls12_381_fp2) 92 genBindings_EC_ShortW_NonAffine(bls12_381_ec_g2_prj, bls12_381_ec_g2_aff, bls12_381_fp2) 93 94 # ---------------------------------------------------------- 95 96 type 97 bn254_snarks_fr = Fr[BN254_Snarks] 98 bn254_snarks_fp = Fp[BN254_Snarks] 99 bn254_snarks_fp2 = Fp2[BN254_Snarks] 100 bn254_snarks_ec_g1_aff = ECP_ShortW_Aff[Fp[BN254_Snarks], G1] 101 bn254_snarks_ec_g1_jac = ECP_ShortW_Jac[Fp[BN254_Snarks], G1] 102 bn254_snarks_ec_g1_prj = ECP_ShortW_Prj[Fp[BN254_Snarks], G1] 103 bn254_snarks_ec_g2_aff = ECP_ShortW_Aff[Fp2[BN254_Snarks], G2] 104 bn254_snarks_ec_g2_jac = ECP_ShortW_Jac[Fp2[BN254_Snarks], G2] 105 bn254_snarks_ec_g2_prj = ECP_ShortW_Prj[Fp2[BN254_Snarks], G2] 106 107 collectBindings(cBindings_bn254_snarks): 108 genBindingsField(bn254_snarks_fr) 109 genBindingsField(bn254_snarks_fp) 110 genBindingsFieldSqrt(bn254_snarks_fp) 111 genBindingsExtField(bn254_snarks_fp2) 112 genBindingsExtFieldSqrt(bn254_snarks_fp2) 113 genBindings_EC_ShortW_Affine(bn254_snarks_ec_g1_aff, bn254_snarks_fp) 114 genBindings_EC_ShortW_NonAffine(bn254_snarks_ec_g1_jac, bn254_snarks_ec_g1_aff, bn254_snarks_fp) 115 genBindings_EC_ShortW_NonAffine(bn254_snarks_ec_g1_prj, bn254_snarks_ec_g1_aff, bn254_snarks_fp) 116 genBindings_EC_ShortW_Affine(bn254_snarks_ec_g2_aff, bn254_snarks_fp2) 117 genBindings_EC_ShortW_NonAffine(bn254_snarks_ec_g2_jac, bn254_snarks_ec_g2_aff, bn254_snarks_fp2) 118 genBindings_EC_ShortW_NonAffine(bn254_snarks_ec_g2_prj, bn254_snarks_ec_g2_aff, bn254_snarks_fp2) 119 120 # ---------------------------------------------------------- 121 122 type 123 pallas_fr = Fr[Pallas] 124 pallas_fp = Fp[Pallas] 125 pallas_ec_aff = ECP_ShortW_Aff[Fp[Pallas], G1] 126 pallas_ec_jac = ECP_ShortW_Jac[Fp[Pallas], G1] 127 pallas_ec_prj = ECP_ShortW_Prj[Fp[Pallas], G1] 128 129 collectBindings(cBindings_pallas): 130 genBindingsField(pallas_fr) 131 genBindingsField(pallas_fp) 132 genBindingsFieldSqrt(pallas_fp) 133 genBindings_EC_ShortW_Affine(pallas_ec_aff, pallas_fp) 134 genBindings_EC_ShortW_NonAffine(pallas_ec_jac, pallas_ec_aff, pallas_fp) 135 genBindings_EC_ShortW_NonAffine(pallas_ec_prj, pallas_ec_aff, pallas_fp) 136 137 type 138 vesta_fr = Fr[Vesta] 139 vesta_fp = Fp[Vesta] 140 vesta_ec_aff = ECP_ShortW_Aff[Fp[Vesta], G1] 141 vesta_ec_jac = ECP_ShortW_Jac[Fp[Vesta], G1] 142 vesta_ec_prj = ECP_ShortW_Prj[Fp[Vesta], G1] 143 144 collectBindings(cBindings_vesta): 145 genBindingsField(vesta_fr) 146 genBindingsField(vesta_fp) 147 genBindingsFieldSqrt(vesta_fp) 148 genBindings_EC_ShortW_Affine(vesta_ec_aff, vesta_fp) 149 genBindings_EC_ShortW_NonAffine(vesta_ec_jac, vesta_ec_aff, vesta_fp) 150 genBindings_EC_ShortW_NonAffine(vesta_ec_prj, vesta_ec_aff, vesta_fp) 151 152 # ----------------------------------------------------------