From 83ee2f3be10e26fef92a5ff8a194d1a9ed1850d8 Mon Sep 17 00:00:00 2001 From: Oleksandr Brezhniev Date: Wed, 27 Dec 2023 16:04:57 +0000 Subject: [PATCH] Fix constant names. Add groth16_CalcPublicBufferSize function. Used it to --- src/main_prover.cpp | 23 +++++++++++++---------- src/prover.cpp | 27 +++++++++++++++++++-------- src/prover.h | 18 ++++++++++++------ 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/main_prover.cpp b/src/main_prover.cpp index cc4c8ca..4bcd339 100644 --- a/src/main_prover.cpp +++ b/src/main_prover.cpp @@ -26,29 +26,33 @@ int main(int argc, char **argv) std::string proofFilename = argv[3]; std::string publicFilename = argv[4]; + BinFileUtils::FileLoader zkeyFileLoader(zkeyFilename); + BinFileUtils::FileLoader wtnsFileLoader(wtnsFilename); + char proofBuffer[BufferSize]; - char publicBuffer[BufferSize]; + + size_t publicBufferSize = groth16_CalcPublicBufferSize( + zkeyFileLoader.dataBuffer(), + zkeyFileLoader.dataSize() + ); + + char publicBuffer[publicBufferSize]; + size_t proofSize = sizeof(proofBuffer); size_t publicSize = sizeof(publicBuffer); char errorMessage[256]; int error = 0; - BinFileUtils::FileLoader zkeyFileLoader(zkeyFilename); - BinFileUtils::FileLoader wtnsFileLoader(wtnsFilename); - error = groth16_prover(zkeyFileLoader.dataBuffer(), zkeyFileLoader.dataSize(), wtnsFileLoader.dataBuffer(), wtnsFileLoader.dataSize(), proofBuffer, &proofSize, publicBuffer, &publicSize, errorMessage, sizeof(errorMessage)); - if (error == PPROVER_ERROR_SHORT_BUFFER) { - + if (error == PROVER_ERROR_SHORT_BUFFER) { std::cerr << "Error: Short buffer for proof or public" << '\n'; return EXIT_FAILURE; - } - - else if (error) { + } else if (error) { std::cerr << errorMessage << '\n'; return EXIT_FAILURE; } @@ -66,7 +70,6 @@ int main(int argc, char **argv) } catch (std::exception* e) { std::cerr << e->what() << '\n'; return EXIT_FAILURE; - } catch (std::exception& e) { std::cerr << e.what() << '\n'; return EXIT_FAILURE; diff --git a/src/prover.cpp b/src/prover.cpp index 7968d54..dae0a1b 100644 --- a/src/prover.cpp +++ b/src/prover.cpp @@ -16,12 +16,12 @@ using json = nlohmann::json; static size_t ProofBufferMinSize() { - return 726; + return 810; } static size_t PublicBufferMinSize(size_t count) { - return count * 81 + 3; + return count * 82 + 4; } static void VerifyPrimes(mpz_srcptr zkey_prime, mpz_srcptr wtns_prime) @@ -54,6 +54,17 @@ std::string BuildPublicString(AltBn128::FrElement *wtnsData, size_t nPublic) return jsonPublic.dump(); } +unsigned long groth16_CalcPublicBufferSize(const void *zkey_buffer, unsigned long zkey_size) { + try { + BinFileUtils::BinFile zkey(zkey_buffer, zkey_size, "zkey", 1); + auto zkeyHeader = ZKeyUtils::loadHeader(&zkey); + return PublicBufferMinSize(zkeyHeader->nPublic); + } catch (...) { + } + + return 0; +} + int groth16_prover(const void *zkey_buffer, unsigned long zkey_size, const void *wtns_buffer, unsigned long wtns_size, @@ -76,7 +87,7 @@ groth16_prover(const void *zkey_buffer, unsigned long zkey_size, *proof_size = proofMinSize; *public_size = publicMinSize; - return PPROVER_ERROR_SHORT_BUFFER; + return PROVER_ERROR_SHORT_BUFFER; } VerifyPrimes(zkeyHeader->rPrime, wtnsHeader->prime); @@ -112,7 +123,7 @@ groth16_prover(const void *zkey_buffer, unsigned long zkey_size, *proof_size = stringProofSize; *public_size = stringPublicSize; - return PPROVER_ERROR_SHORT_BUFFER; + return PROVER_ERROR_SHORT_BUFFER; } std::strncpy(proof_buffer, stringProof.data(), *proof_size); @@ -123,7 +134,7 @@ groth16_prover(const void *zkey_buffer, unsigned long zkey_size, if (error_msg) { strncpy(error_msg, e.what(), error_msg_maxsize); } - return PPROVER_ERROR; + return PROVER_ERROR; } catch (std::exception *e) { @@ -131,14 +142,14 @@ groth16_prover(const void *zkey_buffer, unsigned long zkey_size, strncpy(error_msg, e->what(), error_msg_maxsize); } delete e; - return PPROVER_ERROR; + return PROVER_ERROR; } catch (...) { if (error_msg) { strncpy(error_msg, "unknown error", error_msg_maxsize); } - return PPROVER_ERROR; + return PROVER_ERROR; } - return PRPOVER_OK; + return PROVER_OK; } diff --git a/src/prover.h b/src/prover.h index 4dfad8e..3f1cf0f 100644 --- a/src/prover.h +++ b/src/prover.h @@ -6,17 +6,23 @@ extern "C" { #endif //Error codes returned by the functions. -#define PRPOVER_OK 0x0 -#define PPROVER_ERROR 0x1 -#define PPROVER_ERROR_SHORT_BUFFER 0x2 +#define PROVER_OK 0x0 +#define PROVER_ERROR 0x1 +#define PROVER_ERROR_SHORT_BUFFER 0x2 +/** + * Calculates buffer size to output public signals as json string + * @returns buffer size in bytes or 0 in case of an error + */ +unsigned long groth16_CalcPublicBufferSize(const void *zkey_buffer, unsigned long zkey_size); /** + * groth16_prover * @return error code: - * PRPOVER_OK - in case of success. - * PPROVER_ERROR - in case of an error. + * PROVER_OK - in case of success + * PPOVER_ERROR - in case of an error + * PROVER_ERROR_SHORT_BUFFER - in case of a short buffer error, also updates proof_size and public_size with actual proof and public sizess */ - int groth16_prover(const void *zkey_buffer, unsigned long zkey_size, const void *wtns_buffer, unsigned long wtns_size,