#include "common/utils.h"
#include "common/alloc.h"
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
bool is_power_of_two(uint64_t n) {
return (n & (n - 1)) == 0;
}
uint64_t log2_pow2(uint64_t n) {
uint64_t position = 0;
while (n >>= 1)
position++;
return position;
}
uint64_t reverse_bits(uint64_t n) {
uint64_t result = 0;
for (size_t i = 0; i < 64; ++i) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
uint64_t reverse_bits_limited(uint64_t n, uint64_t value) {
size_t unused_bit_len = 64 - log2_pow2(n);
return reverse_bits(value) >> unused_bit_len;
}
C_KZG_RET bit_reversal_permutation(void *values, size_t size, size_t n) {
C_KZG_RET ret;
byte *tmp = NULL;
byte *v = (byte *)values;
if (n == 0 || n == 1) {
ret = C_KZG_OK;
goto out;
}
if (!is_power_of_two(n)) {
ret = C_KZG_BADARGS;
goto out;
}
ret = c_kzg_malloc((void **)&tmp, size);
if (ret != C_KZG_OK) goto out;
uint64_t unused_bit_len = 64 - log2_pow2(n);
assert(unused_bit_len <= 63);
for (size_t i = 0; i < n; i++) {
uint64_t r = reverse_bits(i) >> unused_bit_len;
if (r > i) {
memcpy(tmp, v + (i * size), size);
memcpy(v + (i * size), v + (r * size), size);
memcpy(v + (r * size), tmp, size);
}
}
out:
c_kzg_free(tmp);
return ret;
}
void compute_powers(fr_t *out, const fr_t *x, size_t n) {
fr_t current_power = FR_ONE;
for (size_t i = 0; i < n; i++) {
out[i] = current_power;
fr_mul(¤t_power, ¤t_power, x);
}
}
bool pairings_verify(const g1_t *a1, const g2_t *a2, const g1_t *b1, const g2_t *b2) {
blst_fp12 loop0, loop1, gt_point;
blst_p1_affine aa1, bb1;
blst_p2_affine aa2, bb2;
g1_t a1neg = *a1;
blst_p1_cneg(&a1neg, true);
blst_p1_to_affine(&aa1, &a1neg);
blst_p1_to_affine(&bb1, b1);
blst_p2_to_affine(&aa2, a2);
blst_p2_to_affine(&bb2, b2);
blst_miller_loop(&loop0, &aa2, &aa1);
blst_miller_loop(&loop1, &bb2, &bb1);
blst_fp12_mul(>_point, &loop0, &loop1);
blst_final_exp(>_point, >_point);
return blst_fp12_is_one(>_point);
}