/ bindings / c_curve_decls.nim
c_curve_decls.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  import
 10    ../constantine/math/config/curves,
 11    ../constantine/curves_primitives
 12  
 13  export curves, curves_primitives
 14  
 15  # Overview
 16  # ------------------------------------------------------------
 17  #
 18  # This files provides template for C bindings generation
 19  
 20  template genBindingsField*(Field: untyped) =
 21    when appType == "lib":
 22      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
 23    else:
 24      {.push noconv, exportc,  raises: [].} # No exceptions allowed
 25  
 26    func `ctt _ Field _ unmarshalBE`(dst: var Field, src: openarray[byte]): bool =
 27      ## Deserialize
 28      unmarshalBE(dst, src)
 29  
 30    func `ctt _ Field _ marshalBE`(dst: var openarray[byte], src: Field): bool =
 31      marshalBE(dst, src)
 32    # --------------------------------------------------------------------------------------
 33    func `ctt _ Field _ is_eq`(a, b: Field): SecretBool =
 34      a == b
 35  
 36    func `ctt _ Field _ is_zero`(a: Field): SecretBool =
 37      a.isZero()
 38  
 39    func `ctt _ Field _ is_one`(a: Field): SecretBool =
 40      a.isOne()
 41  
 42    func `ctt _ Field _ is_minus_one`(a: Field): SecretBool =
 43      a.isMinusOne()
 44    # --------------------------------------------------------------------------------------
 45    func `ctt _ Field _ set_zero`(a: var Field) =
 46      a.setZero()
 47  
 48    func `ctt _ Field _ set_one`(a: var Field) =
 49      a.setOne()
 50  
 51    func `ctt _ Field _ set_minus_one`(a: var Field) =
 52      a.setMinusOne()
 53    # --------------------------------------------------------------------------------------
 54    func `ctt _ Field _ neg`(r: var Field, a: Field) =
 55      r.neg(a)
 56  
 57    func `ctt _ Field _ neg_in_place`(a: var Field) =
 58      a.neg()
 59  
 60    func `ctt _ Field _ sum`(r: var Field, a, b: Field) =
 61      r.sum(a,b)
 62  
 63    func `ctt _ Field _ add_in_place`(a: var Field, b: Field) =
 64      a += b
 65  
 66    func `ctt _ Field _ diff`(r: var Field, a, b: Field) =
 67      r.diff(a,b)
 68  
 69    func `ctt _ Field _ sub_in_place`(a: var Field, b: Field) =
 70      a -= b
 71  
 72    func `ctt _ Field _ double`(r: var Field, a: Field) =
 73      r.double(a)
 74  
 75    func `ctt _ Field _ double_in_place`(a: var Field) =
 76      a.double()
 77    # --------------------------------------------------------------------------------------
 78    func `ctt _ Field _ prod`(r: var Field, a, b: Field) =
 79      r.prod(a,b)
 80  
 81    func `ctt _ Field _ mul_in_place`(a: var Field, b: Field) =
 82      a *= b
 83  
 84    func `ctt _ Field _ square`(r: var Field, a: Field) =
 85      r.square(a)
 86  
 87    func `ctt _ Field _ square_in_place`(a: var Field) =
 88      a.square()
 89    # --------------------------------------------------------------------------------------
 90    func `ctt _ Field _ div2`(a: var Field) =
 91      a.div2()
 92  
 93    func `ctt _ Field _ inv`(r: var Field, a: Field) =
 94      r.inv(a)
 95  
 96    func `ctt _ Field _ inv_in_place`(a: var Field) =
 97      a.inv()
 98    # --------------------------------------------------------------------------------------
 99    func `ctt _ Field _ ccopy`(a: var Field, b: Field, ctl: SecretBool) =
100      a.ccopy(b, ctl)
101  
102    func `ctt _ Field _ cswap`(a, b: var Field, ctl: SecretBool) =
103      a.cswap(b, ctl)
104  
105    func `ctt _ Field _ cset_zero`(a: var Field, ctl: SecretBool) =
106      a.csetZero(ctl)
107  
108    func `ctt _ Field _ cset_one`(a: var Field, ctl: SecretBool) =
109      a.csetOne(ctl)
110  
111    func `ctt _ Field _ cneg_in_place`(a: var Field, ctl: SecretBool) =
112      a.cneg(ctl)
113  
114    func `ctt _ Field _ cadd_in_place`(a: var Field, b: Field, ctl: SecretBool) =
115      a.cadd(b, ctl)
116  
117    func `ctt _ Field _ csub_in_place`(a: var Field, b: Field, ctl: SecretBool) =
118      a.csub(b, ctl)
119  
120    {.pop.}
121  
122  
123  template genBindingsFieldSqrt*(Field: untyped) =
124    when appType == "lib":
125      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
126    else:
127      {.push noconv, exportc,  raises: [].} # No exceptions allowed
128  
129    func `ctt _ Field _ is_square`(a: Field): SecretBool =
130      a.isSquare()
131  
132    func `ctt _ Field _ invsqrt`(r: var Field, a: Field) =
133      r.invsqrt(a)
134  
135    func `ctt _ Field _ invsqrt_in_place`(r: var Field, a: Field): SecretBool =
136      r.invsqrt_if_square(a)
137  
138    func `ctt _ Field _ sqrt_in_place`(a: var Field) =
139      a.sqrt()
140  
141    func `ctt _ Field _ sqrt_if_square_in_place`(a: var Field): SecretBool =
142      a.sqrt_if_square()
143  
144    func `ctt _ Field _ sqrt_invsqrt`(sqrt, invsqrt: var Field, a: Field) =
145      sqrt_invsqrt(sqrt, invsqrt, a)
146  
147    func `ctt _ Field _ sqrt_invsqrt_if_square`(sqrt, invsqrt: var Field, a: Field): SecretBool =
148      sqrt_invsqrt_if_square(sqrt, invsqrt, a)
149  
150    func `ctt _ Field _ sqrt_ratio_if_square`(r: var Field, u, v: Field): SecretBool =
151      r.sqrt_ratio_if_square(u, v)
152  
153    {.pop.}
154  
155  
156  template genBindingsExtField*(Field: untyped) =
157    when appType == "lib":
158      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
159    else:
160      {.push noconv, exportc,  raises: [].} # No exceptions allowed
161  
162    # --------------------------------------------------------------------------------------
163    func `ctt _ Field _ is_eq`(a, b: Field): SecretBool =
164      a == b
165  
166    func `ctt _ Field _ is_zero`(a: Field): SecretBool =
167      a.isZero()
168  
169    func `ctt _ Field _ is_one`(a: Field): SecretBool =
170      a.isOne()
171  
172    func `ctt _ Field _ is_minus_one`(a: Field): SecretBool =
173      a.isMinusOne()
174    # --------------------------------------------------------------------------------------
175    func `ctt _ Field _ set_zero`(a: var Field) =
176      a.setZero()
177  
178    func `ctt _ Field _ set_one`(a: var Field) =
179      a.setOne()
180  
181    func `ctt _ Field _ set_minus_one`(a: var Field) =
182      a.setMinusOne()
183    # --------------------------------------------------------------------------------------
184    func `ctt _ Field _ neg`(a: var Field) =
185      a.neg()
186  
187    func `ctt _ Field _ sum`(r: var Field, a, b: Field) =
188      r.sum(a,b)
189  
190    func `ctt _ Field _ add_in_place`(a: var Field, b: Field) =
191      a += b
192  
193    func `ctt _ Field _ diff`(r: var Field, a, b: Field) =
194      r.diff(a,b)
195  
196    func `ctt _ Field _ sub_in_place`(a: var Field, b: Field) =
197      a -= b
198  
199    func `ctt _ Field _ double`(r: var Field, a: Field) =
200      r.double(a)
201  
202    func `ctt _ Field _ double_in_place`(a: var Field) =
203      a.double()
204  
205    func `ctt _ Field _ conj`(r: var Field, a: Field) =
206      r.conj(a)
207  
208    func `ctt _ Field _ conj_in_place`(a: var Field) =
209      a.conj()
210  
211    func `ctt _ Field _ conjneg`(r: var Field, a: Field) =
212      r.conjneg(a)
213  
214    func `ctt _ Field _ conjneg_in_place`(a: var Field) =
215      a.conjneg()
216  
217    # --------------------------------------------------------------------------------------
218    func `ctt _ Field _ prod`(r: var Field, a, b: Field) =
219      r.prod(a,b)
220  
221    func `ctt _ Field _ mul_in_place`(a: var Field, b: Field) =
222      a *= b
223  
224    func `ctt _ Field _ square`(r: var Field, a: Field) =
225      r.square(a)
226  
227    func `ctt _ Field _ square_in_place`(a: var Field) =
228      a.square()
229    # --------------------------------------------------------------------------------------
230    func `ctt _ Field _ div2`(a: var Field) =
231      a.div2()
232  
233    func `ctt _ Field _ inv`(r: var Field, a: Field) =
234      r.inv(a)
235  
236    func `ctt _ Field _ inv_in_place`(a: var Field) =
237      a.inv()
238    # --------------------------------------------------------------------------------------
239    func `ctt _ Field _ ccopy`(a: var Field, b: Field, ctl: SecretBool) =
240      a.ccopy(b, ctl)
241  
242    func `ctt _ Field _ cset_zero`(a: var Field, ctl: SecretBool) =
243      a.csetZero(ctl)
244  
245    func `ctt _ Field _ cset_one`(a: var Field, ctl: SecretBool) =
246      a.csetOne(ctl)
247  
248    func `ctt _ Field _ cneg_in_place`(a: var Field, ctl: SecretBool) =
249      a.cneg(ctl)
250  
251    func `ctt _ Field _ cadd_in_place`(a: var Field, b: Field, ctl: SecretBool) =
252      a.cadd(b, ctl)
253  
254    func `ctt _ Field _ csub_in_place`(a: var Field, b: Field, ctl: SecretBool) =
255      a.csub(b, ctl)
256  
257    {.pop.}
258  
259  template genBindingsExtFieldSqrt*(Field: untyped) =
260    when appType == "lib":
261      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
262    else:
263      {.push noconv, exportc,  raises: [].} # No exceptions allowed
264  
265    func `ctt _ Field _ is_square`(a: Field): SecretBool =
266      a.isSquare()
267  
268    func `ctt _ Field _ sqrt_in_place`(a: var Field) =
269      a.sqrt()
270  
271    func `ctt _ Field _ sqrt_if_square_in_place`(a: var Field): SecretBool =
272      a.sqrt_if_square()
273  
274    {.pop}
275  
276  template genBindings_EC_ShortW_Affine*(ECP, Field: untyped) =
277    when appType == "lib":
278      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
279    else:
280      {.push noconv, exportc,  raises: [].} # No exceptions allowed
281  
282    # --------------------------------------------------------------------------------------
283    func `ctt _ ECP _ is_eq`(P, Q: ECP): SecretBool =
284      P == Q
285  
286    func `ctt _ ECP _ is_inf`(P: ECP): SecretBool =
287      P.isInf()
288  
289    func `ctt _ ECP _ set_inf`(P: var ECP) =
290      P.setInf()
291  
292    func `ctt _ ECP _ ccopy`(P: var ECP, Q: ECP, ctl: SecretBool) =
293      P.ccopy(Q, ctl)
294  
295    func `ctt _ ECP _ is_on_curve`(x, y: Field): SecretBool =
296      isOnCurve(x, y, ECP.G)
297  
298    func `ctt _ ECP _ neg`(P: var ECP, Q: ECP) =
299      P.neg(Q)
300  
301    func `ctt _ ECP _ neg_in_place`(P: var ECP) =
302      P.neg()
303  
304    {.pop.}
305  
306  template genBindings_EC_ShortW_NonAffine*(ECP, ECP_Aff, Field: untyped) =
307    when appType == "lib":
308      {.push noconv, dynlib, exportc,  raises: [].} # No exceptions allowed
309    else:
310      {.push noconv, exportc,  raises: [].} # No exceptions allowed
311  
312    # --------------------------------------------------------------------------------------
313    func `ctt _ ECP _ is_eq`(P, Q: ECP): SecretBool =
314      P == Q
315  
316    func `ctt _ ECP _ is_inf`(P: ECP): SecretBool =
317      P.isInf()
318  
319    func `ctt _ ECP _ set_inf`(P: var ECP) =
320      P.setInf()
321  
322    func `ctt _ ECP _ ccopy`(P: var ECP, Q: ECP, ctl: SecretBool) =
323      P.ccopy(Q, ctl)
324  
325    func `ctt _ ECP _ neg`(P: var ECP, Q: ECP) =
326      P.neg(Q)
327  
328    func `ctt _ ECP _ neg_in_place`(P: var ECP) =
329      P.neg()
330  
331    func `ctt _ ECP _ cneg_in_place`(P: var ECP, ctl: SecretBool) =
332      P.neg()
333  
334    func `ctt _ ECP _ sum`(r: var ECP, P, Q: ECP) =
335      r.sum(P, Q)
336  
337    func `ctt _ ECP _ add_in_place`(P: var ECP, Q: ECP) =
338      P += Q
339  
340    func `ctt _ ECP _ diff`(r: var ECP, P, Q: ECP) =
341      r.diff(P, Q)
342  
343    func `ctt _ ECP _ double`(r: var ECP, P: ECP) =
344      r.double(P)
345  
346    func `ctt _ ECP _ double_in_place`(P: var ECP) =
347      P.double()
348  
349    func `ctt _ ECP _ affine`(dst: var ECP_Aff, src: ECP) =
350      dst.affine(src)
351  
352    func `ctt _ ECP _ from_affine`(dst: var ECP, src: ECP_Aff) =
353      dst.fromAffine(src)
354  
355    {.pop.}