Bls12_381.G1Elliptic curve built over the field Fq and the equation y^2 = x^3 + 4
include CURVEThe type of the element on the curve and in the prime subgroup. The point is given in jacobian coordinates
affine_of_jacobian p creates a new value of type affine representing the point p in affine coordinates
jacobian_of_affine p creates a new value of type t representing the point p in jacobian coordinates
val to_affine_array : t array -> affine_arrayto_affine_array pts builds a contiguous C array and populate it with the points pts in affine coordinates. Use it with pippenger_with_affine_array to get better performance.
val of_affine_array : affine_array -> t arrayBuild a OCaml array of t values from the contiguous C array
val affine_array_of_compressed_bytes_opt :
subgroup_check:bool ->
Stdlib.Bytes.t array ->
affine_array optionaffine_array_of_compressed_bytes_opt pts builds a contiguous C array and populate it with the points pts in affine coordinates from their compressed representation in bytes.
If subgroup_check is set, the function also checks if the points are in the prime subgroup.
Use it with affine_add_bulk to get better performance
val size_of_affine_array : affine_array -> intReturn the number of elements in the array
module Scalar : Ff_sig.PRIME with type t = Fr.tCheck if a point, represented as a byte array, is on the curve and in the prime subgroup. The bytes must be of length size_in_bytes.
val of_bytes_opt : Stdlib.Bytes.t -> t optionAttempt to construct a point from a byte array of length size_in_bytes. Return None if the bytes do not represent a point on the curve and in the prime subgroup.
val of_bytes_exn : Stdlib.Bytes.t -> tAttempt to construct a point from a byte array of length size_in_bytes. Raise Not_on_curve if the point is not on the curve and in the prime subgroup.
val of_compressed_bytes_opt : Stdlib.Bytes.t -> t optionAllocates a new point from a byte of length size_in_bytes / 2 array representing a point in compressed form. Return None if the bytes do not represent a point on the curve and in the prime subgroup.
val of_compressed_bytes_exn : Stdlib.Bytes.t -> tAllocates a new point from a byte array of length size_in_bytes / 2 representing a point in compressed form. Raise Not_on_curve if the point is not on the curve and in the prime subgroup.
val to_bytes : t -> Stdlib.Bytes.tReturn a representation in bytes
val to_compressed_bytes : t -> Stdlib.Bytes.tReturn a compressed bytes representation
val zero : tZero of the elliptic curve
val one : tA fixed generator of the elliptic curve
val is_zero : t -> boolReturn true if the given element is zero
val random : ?state:Stdlib.Random.State.t -> unit -> tGenerate a random element. The function ensures the element is on the curve and in the prime subgroup.
The routines in the module Random.State are used to generate the elements. A state can be given to the function to be used. If no state is given, Random.get_state is used.
To create a value of type Random.State.t, you can use Random.State.make [|42|].
add_inplace res a b is the same than add but writes the result in res. No allocation happens.
add_bulk xs returns the sum of the elements of xs by performing only one allocation for the output. This method is recommended to save the allocation overhead of using n times add.
val affine_add_bulk : affine_array -> taffine_add_bulk xs returns the sum of the elements of xs by performing only one allocation for the output.
mul_inplace g x is the same than mul but writes the output in res. No allocation happens.
val hash_to_curve : Stdlib.Bytes.t -> Stdlib.Bytes.t -> thash_to_curve msg dst follows the standard Hashing to Elliptic Curves applied to BLS12-381
pippenger ?start ?len pts scalars computes the multi scalar exponentiation/multiplication. The scalars are given in scalars and the points in pts. If pts and scalars are not of the same length, perform the computation on the first n points where n is the smallest size. Arguments start and len can be used to take advantages of multicore OCaml. Default value for start (resp. len) is 0 (resp. the length of the array scalars).
Perform allocations on the C heap to convert scalars to bytes and to convert the points pts in affine coordinates as values of type t are in jacobian coordinates.
Warning. Undefined behavior if the point to infinity is in the array
val pippenger_with_affine_array :
?start:int ->
?len:int ->
affine_array ->
Scalar.t array ->
tpippenger_with_affine_array ?start ?len pts scalars computes the multi scalar exponentiation/multiplication. The scalars are given in scalars and the points in pts. If pts and scalars are not of the same length, perform the computation on the first n points where n is the smallest length. The differences with pippenger are 1. the points are loaded in a contiguous C array to speed up the access to the elements by relying on the CPU cache 2. and the points are in affine coordinates, the form expected by the algorithm implementation, avoiding new allocations and field inversions required to convert from jacobian (representation of a points of type t, as expected by pippenger) to affine coordinates. Expect a speed improvement around 20% compared to pippenger, and less allocation on the C heap. A value of affine_array can be built using to_affine_array. Arguments start and len can be used to take advantages of multicore OCaml. Default value for start (resp. len) is 0 (resp. the length of the array scalars).
Perform allocations on the C heap to convert scalars to bytes.
Warning. Undefined behavior if the point to infinity is in the array
val pippenger_with_compressed_bytes_array_opt :
subgroup_check:bool ->
Stdlib.Bytes.t array ->
Scalar.t array ->
Stdlib.Bytes.t optionpippenger_with_compressed_bytes_array_opt points scalars computes the multi-scalar multiplication, i.e., the sum of scalars[i] * points[i].
If subgroup_check is set, the function also checks if the points are in the prime subgroup.
Returns None if deserialization of points fails.
val add_bulk_with_compressed_bytes_array_opt :
subgroup_check:bool ->
Stdlib.Bytes.t array ->
Stdlib.Bytes.t optionadd_bulk_with_compressed_bytes_array_opt points computes the sum of points[i].
If subgroup_check is set, the function also checks if the points are in the prime subgroup.
Returns None if deserialization of points fails.