/ bindings / lib_curves.nim
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  # ----------------------------------------------------------