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.}