6 releases

0.3.0 Jun 1, 2021
0.2.0 Jul 17, 2020
0.1.3 Jul 13, 2020
0.1.2 Jun 12, 2020

#11 in #prime-field

Download history 49/week @ 2024-02-26 14/week @ 2024-03-04 30/week @ 2024-03-11 12/week @ 2024-03-18 76/week @ 2024-04-01 3/week @ 2024-04-08 5/week @ 2024-04-15 16/week @ 2024-04-22 5/week @ 2024-04-29 15/week @ 2024-05-06 10/week @ 2024-05-13 20/week @ 2024-05-20 4/week @ 2024-05-27 24/week @ 2024-06-03 20/week @ 2024-06-10

69 downloads per month
Used in 10 crates (2 directly)

MIT/Apache

17KB
369 lines

ff-cl-gen Crates.io

OpenCL code generator for finite-field arithmetic over prime fields constructed with Rust ff library.

Notes:

  • Limbs are 32/64-bit long, by your choice.
  • The library assumes that the most significant bit of your prime-field is unset. This allows for cheap reductions.

Usage

Generating OpenCL codes for Bls12-381 Fr elements:

use paired::bls12_381::Fr;
let src = ff_cl_gen::field::<Fr, Limb64>("Fr");

Generated interface (FIELD is substituted with Fr):

#define FIELD_LIMB_BITS ... // 32/64
#define FIELD_limb ... // uint/ulong, based on FIELD_LIMB_BITS
#define FIELD_LIMBS ... // Number of limbs for this field
#define FIELD_P ... // Normal form of field modulus
#define FIELD_ONE ... // Montomery form of one
#define FIELD_ZERO ... // Montomery/normal form of zero
#define FIELD_BITS (FIELD_LIMBS * FIELD_LIMB_BITS)

typedef struct { FIELD_limb val[FIELD_LIMBS]; } FIELD;

bool FIELD_gte(FIELD a, FIELD b); // Greater than or equal
bool FIELD_eq(FIELD a, FIELD b); // Equal
FIELD FIELD_sub(FIELD a, FIELD b); // Modular subtraction
FIELD FIELD_add(FIELD a, FIELD b); // Modular addition
FIELD FIELD_mul(FIELD a, FIELD b); // Modular multiplication
FIELD FIELD_sqr(FIELD a); // Modular squaring
FIELD FIELD_double(FIELD a); // Modular doubling
FIELD FIELD_pow(FIELD base, uint exponent); // Modular power
FIELD FIELD_pow_lookup(global FIELD *bases, uint exponent); // Modular power with lookup table for bases
FIELD FIELD_mont(FIELD a); // To montgomery form
FIELD FIELD_unmont(FIELD a); // To regular form
bool FIELD_get_bit(FIELD l, uint i); // Get `i`th bit (From most significant digit)
uint FIELD_get_bits(FIELD l, uint skip, uint window); // Get `window` consecutive bits, (Starting from `skip`th bit from most significant digit)

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.2–1.7MB
~34K SLoC