2022-10-04 18:45:12 +00:00
|
|
|
#include <inttypes.h>
|
|
|
|
#include <stdio.h>
|
2022-10-04 21:40:18 +00:00
|
|
|
#include <stdlib.h>
|
2022-10-04 18:45:12 +00:00
|
|
|
#include "c_kzg_4844.h"
|
2022-11-07 16:50:32 +00:00
|
|
|
#include "ckzg.h"
|
2022-10-04 18:45:12 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
KZGSettings* load_trusted_setup_wrap(const char* file) {
|
|
|
|
KZGSettings* out = malloc(sizeof(KZGSettings));
|
2022-10-10 19:12:31 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
if (out == NULL) return NULL;
|
2022-10-10 19:12:31 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
FILE* f = fopen(file, "r");
|
2022-10-10 19:12:31 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
if (f == NULL) { free(out); return NULL; }
|
2022-10-10 19:12:31 +00:00
|
|
|
|
2022-11-10 16:23:40 +00:00
|
|
|
if (load_trusted_setup(out, f) != C_KZG_OK) { free(out); fclose(f); return NULL; }
|
2022-10-10 19:12:31 +00:00
|
|
|
|
2022-11-10 16:23:40 +00:00
|
|
|
fclose(f);
|
2022-10-10 19:12:31 +00:00
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
void free_trusted_setup_wrap(KZGSettings *s) {
|
|
|
|
free_trusted_setup(s);
|
|
|
|
free(s);
|
|
|
|
}
|
2022-10-05 19:04:35 +00:00
|
|
|
|
2022-11-04 09:07:05 +00:00
|
|
|
void blob_to_kzg_commitment_wrap(uint8_t out[48], const Blob blob, const KZGSettings *s) {
|
2022-10-20 18:29:36 +00:00
|
|
|
KZGCommitment c;
|
2022-11-04 09:07:05 +00:00
|
|
|
blob_to_kzg_commitment(&c, blob, s);
|
2022-10-20 18:29:36 +00:00
|
|
|
bytes_from_g1(out, &c);
|
2022-10-05 19:04:35 +00:00
|
|
|
}
|
|
|
|
|
2022-11-04 09:07:05 +00:00
|
|
|
int verify_aggregate_kzg_proof_wrap(const Blob blobs[], const uint8_t commitments[], size_t n, const uint8_t proof[48], const KZGSettings *s) {
|
|
|
|
KZGProof f;
|
|
|
|
C_KZG_RET ret;
|
|
|
|
ret = bytes_to_g1(&f, proof);
|
|
|
|
if (ret != C_KZG_OK) return -1;
|
2022-10-05 19:04:35 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
KZGCommitment* c = calloc(n, sizeof(KZGCommitment));
|
2022-11-04 09:07:05 +00:00
|
|
|
if (c == NULL) return -2;
|
2022-10-05 19:04:35 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
for (size_t i = 0; i < n; i++) {
|
|
|
|
ret = bytes_to_g1(&c[i], &commitments[i * 48]);
|
2022-11-04 09:07:05 +00:00
|
|
|
if (ret != C_KZG_OK) { free(c); return -1; }
|
2022-10-20 18:29:36 +00:00
|
|
|
}
|
2022-10-05 19:04:35 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
bool b;
|
2022-11-04 09:07:05 +00:00
|
|
|
ret = verify_aggregate_kzg_proof(&b, blobs, c, n, &f, s);
|
|
|
|
free(c);
|
|
|
|
if (ret != C_KZG_OK) return -1;
|
2022-10-04 21:40:18 +00:00
|
|
|
|
2022-10-20 18:29:36 +00:00
|
|
|
return b ? 0 : 1;
|
|
|
|
}
|
2022-10-06 23:45:42 +00:00
|
|
|
|
2022-11-04 09:07:05 +00:00
|
|
|
C_KZG_RET compute_aggregate_kzg_proof_wrap(uint8_t out[48], const Blob blobs[], size_t n, const KZGSettings *s) {
|
2022-10-20 18:29:36 +00:00
|
|
|
KZGProof f;
|
2022-11-04 09:07:05 +00:00
|
|
|
C_KZG_RET ret;
|
|
|
|
ret = compute_aggregate_kzg_proof(&f, blobs, n, s);
|
|
|
|
if (ret != C_KZG_OK) return -1;
|
2022-10-20 18:29:36 +00:00
|
|
|
bytes_from_g1(out, &f);
|
|
|
|
return C_KZG_OK;
|
2022-10-10 22:28:29 +00:00
|
|
|
}
|
2022-10-31 13:42:38 +00:00
|
|
|
|
|
|
|
int verify_kzg_proof_wrap(const uint8_t c[48], const uint8_t x[32], const uint8_t y[32], const uint8_t p[48], KZGSettings *s) {
|
|
|
|
KZGCommitment commitment;
|
|
|
|
KZGProof proof;
|
|
|
|
BLSFieldElement fx, fy;
|
|
|
|
bool out;
|
|
|
|
|
|
|
|
bytes_to_bls_field(&fx, x);
|
|
|
|
bytes_to_bls_field(&fy, y);
|
|
|
|
if (bytes_to_g1(&commitment, c) != C_KZG_OK) return -1;
|
|
|
|
if (bytes_to_g1(&proof, p) != C_KZG_OK) return -1;
|
|
|
|
|
|
|
|
if (verify_kzg_proof(&out, &commitment, &fx, &fy, &proof, s) != C_KZG_OK)
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
return out ? 0 : 1;
|
|
|
|
}
|