From c4e3dde69639e535e1360898e2a4875aef5d1c92 Mon Sep 17 00:00:00 2001 From: AztecBot Date: Sat, 4 Apr 2026 23:24:03 +0000 Subject: [PATCH 1/2] fix: reject VK with log_circuit_size=0 in UltraKeccak verifier --- .../cpp/src/barretenberg/transcript/transcript.hpp | 1 + .../cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp index 43cfc758497b..432ae6fdf6ff 100644 --- a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp +++ b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp @@ -295,6 +295,7 @@ template class BaseTranscript { template std::vector get_dyadic_powers_of_challenge(const std::string& label, size_t num_challenges) { + BB_ASSERT(num_challenges > 0, "get_dyadic_powers_of_challenge called with num_challenges=0"); ChallengeType challenge = get_challenge(label); std::vector pows(num_challenges); pows[0] = challenge; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp index ed9f7a549153..fc96d4d22753 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp @@ -30,7 +30,13 @@ template size_t UltraVerifier_::compute_ return static_cast(Flavor::VIRTUAL_LOG_N); } else { // Non-padded: use actual circuit size from VK (native only) - return static_cast(verifier_instance->get_vk()->log_circuit_size); + const size_t log_circuit_size = static_cast(verifier_instance->get_vk()->log_circuit_size); + // Any valid circuit has at least NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS rows, giving + // a minimum dyadic size of 8 (log_circuit_size >= 3). Reject clearly malformed VKs early to + // prevent downstream out-of-bounds access (e.g. in get_dyadic_powers_of_challenge). + BB_ASSERT_GTE( + log_circuit_size, static_cast(1), "VK log_circuit_size is 0, which is invalid for any circuit"); + return log_circuit_size; } } From 0f228ea388c59e1505a05c725583b096b1ff8717 Mon Sep 17 00:00:00 2001 From: ludamad Date: Sun, 5 Apr 2026 13:23:02 -0400 Subject: [PATCH 2/2] Update ultra_verifier.cpp --- .../cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp index fc96d4d22753..1b63386f9b23 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_verifier.cpp @@ -31,9 +31,6 @@ template size_t UltraVerifier_::compute_ } else { // Non-padded: use actual circuit size from VK (native only) const size_t log_circuit_size = static_cast(verifier_instance->get_vk()->log_circuit_size); - // Any valid circuit has at least NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS rows, giving - // a minimum dyadic size of 8 (log_circuit_size >= 3). Reject clearly malformed VKs early to - // prevent downstream out-of-bounds access (e.g. in get_dyadic_powers_of_challenge). BB_ASSERT_GTE( log_circuit_size, static_cast(1), "VK log_circuit_size is 0, which is invalid for any circuit"); return log_circuit_size;