msm-webgpu 0.1.0

Multi-Scalar Multiplication (MSM) implementation for WebGPU.
Documentation
{{> structs }}
{{> montgomery_product_funcs }}
{{> field_funcs }}
{{> bigint_funcs }}
{{> barrett_funcs }}
{{> ec_funcs }}

@group(0) @binding(0)
var<storage, read_write> a: Point;
@group(0) @binding(1)
var<storage, read_write> b: Point;
@group(0) @binding(2)
var<storage, read_write> result: Point;

@group(0) @binding(3)
var<uniform> scalar: u32;

@compute @workgroup_size(1)
fn test_point_add(
    @builtin(global_invocation_id) global_id: vec3<u32>,
    @builtin(local_invocation_id) local_id: vec3<u32>
) {
    var r = get_r();
    var ax = a.x;
    var ay = a.y;
    var az = a.z;
    var ar_x = field_mul(&ax, &r);
    var ar_y = field_mul(&ay, &r);
    var ar_z = field_mul(&az, &r);
    var p_a = Point(ar_x, ar_y, ar_z);
    var bx = b.x;
    var by = b.y;
    var bz = b.z;
    var br_x = field_mul(&bx, &r);
    var br_y = field_mul(&by, &r);
    var br_z = field_mul(&bz, &r);
    var p_b = Point(br_x, br_y, br_z);
    result = point_add(p_a, p_b);
}

@compute @workgroup_size(1)
fn test_negate_point(
    @builtin(global_invocation_id) global_id: vec3<u32>,
    @builtin(local_invocation_id) local_id: vec3<u32>
) {
    var r = get_r();    
    var ax = a.x;
    var ay = a.y;
    var az = a.z;
    var ar_x = field_mul(&ax, &r);
    var ar_y = field_mul(&ay, &r);
    var ar_z = field_mul(&az, &r);
    var p_a = Point(ar_x, ar_y, ar_z);
    result = negate_point(p_a);
}

@compute @workgroup_size(1)
fn test_double_and_add(
    @builtin(global_invocation_id) global_id: vec3<u32>,
    @builtin(local_invocation_id) local_id: vec3<u32>
) {
    var r = get_r();
    var ax = a.x;
    var ay = a.y;
    var az = a.z;
    var ar_x = field_mul(&ax, &r);
    var ar_y = field_mul(&ay, &r);
    var ar_z = field_mul(&az, &r);
    var p_a = Point(ar_x, ar_y, ar_z);
    result = double_and_add(p_a, scalar);
}

@compute @workgroup_size(1)
fn test_point_add_identity(
    @builtin(global_invocation_id) global_id: vec3<u32>,
    @builtin(local_invocation_id) local_id: vec3<u32>
) {
    var r = get_r();
    var ax = a.x;
    var ay = a.y;
    var az = a.z;
    var ar_x = field_mul(&ax, &r);
    var ar_y = field_mul(&ay, &r);
    var ar_z = field_mul(&az, &r);
    var p_a = Point(ar_x, ar_y, ar_z);
    var p_b = POINT_IDENTITY;
    result = point_add(p_a, p_b);
}