Skip to content
/ ec-gpu Public
forked from linguohua/ec-gpu

OpenCL code generator for finite-field arithmetic over arbitrary prime fields

License

Notifications You must be signed in to change notification settings

ailaiyu/ec-gpu

 
 

Repository files navigation

ec-gpu & ec-gpu-gen

crates.io Documentation Build Status minimum rustc 1.51 dependency status

crates.io Documentation Build Status minimum rustc 1.51 dependency status

CUDA/OpenCL code generator for finite-field arithmetic over prime fields and elliptic curve arithmetic constructed with Rust.

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 CUDA/OpenCL codes for blstrs Scalar elements:

use blstrs::Scalar;
let src = [
    ec_gpu_gen::common(),
    ec_gpu_gen::field::<Scalar, ec_gpu_gen::Limb64>("Fr")
].join("\n");

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)

Tests

In order to run the tests, you need to enable one (or both) of tests-cuda and tests-opencl.

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.

About

OpenCL code generator for finite-field arithmetic over arbitrary prime fields

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Rust 78.4%
  • C 21.6%