Skip to content

Commit 59f0204

Browse files
authored
Fix VDF prover failures on Windows (#216)
use llabs instead of labs
1 parent 7233821 commit 59f0204

6 files changed

+59
-15
lines changed

src/Reducer.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ bool bLZCHasHW=false;
229229

230230
// The condition (abs(v_) | abs(x_)) <= THRESH protects against
231231
// overflow
232-
below_threshold = (labs(v_) | labs(x_)) <= THRESH ? 1 : 0;
232+
// must use llabs() as labs() is undefined for too large numbers
233+
below_threshold = (llabs(v_) | llabs(x_)) <= THRESH ? 1 : 0;
233234
} while (below_threshold && a > c && c > 0);
234235

235236
if (below_threshold) {

src/bqfc.c

+3
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ static void bqfc_export(uint8_t *out_str, size_t *offset, size_t size,
120120
{
121121
size_t bytes;
122122

123+
// mpz_export can overflow out_str if reduction bug but this should never happen
123124
mpz_export(&out_str[*offset], &bytes, -1, 1, 0, 0, n);
125+
if (bytes > size)
126+
gmp_printf("bqfc_export overflow offset %d size %d n %Zd\n", *offset, size, n);
124127
if (bytes < size)
125128
memset(&out_str[*offset + bytes], 0, size - bytes);
126129
*offset += size;

src/proof_common.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ integer HashPrime(std::vector<uint8_t> seed, int length, vector<int> bitmask) {
2727
break;
2828
}
2929
picosha2::hash256(sprout.begin(), sprout.end(), hash.begin(), hash.end());
30+
// Visual Studio doesn't like pointer arithmetic past the bounds
3031
blob.insert(blob.end(), hash.begin(),
31-
std::min(hash.end(), hash.begin() + length / 8 - blob.size()));
32+
hash.begin() + std::min(hash.size(), length / 8 - blob.size()));
3233
}
3334

3435
assert ((int) blob.size() * 8 == length);

src/prover_slow.h

+12-10
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ uint64_t GetBlock(uint64_t i, uint64_t k, uint64_t T, integer& B) {
2626
mpz_mul_2exp(res.impl, res.impl, k);
2727
res = res / B;
2828
auto res_vector = res.to_vector();
29-
return res_vector[0];
29+
// 0 value results in empty vector from mpz_export
30+
// https://gmplib.org/list-archives/gmp-bugs/2009-July/001534.html
31+
return res_vector.empty() ? 0 : res_vector[0];
3032
}
3133

3234
form GenerateWesolowski(form &y, form &x_init,
@@ -47,28 +49,28 @@ form GenerateWesolowski(form &y, form &x_init,
4749
for (int64_t j = l - 1; j >= 0; j--) {
4850
x = FastPowFormNucomp(x, D, integer(1 << k), L, reducer);
4951

50-
std::vector<form> ys((1 << k));
51-
for (uint64_t i = 0; i < (1UL << k); i++)
52+
std::vector<form> ys((1ULL << k));
53+
for (uint64_t i = 0; i < (1ULL << k); i++)
5254
ys[i] = form::identity(D);
5355

54-
for (uint64_t i = 0; i < ceil(double(num_iterations) / (k * l)); i++) {
56+
for (uint64_t i = 0; i < (num_iterations + k * l - 1) / (k * l); i++) {
5557
if (num_iterations >= k * (i * l + j + 1)) {
5658
uint64_t b = GetBlock(i*l + j, k, num_iterations, B);
5759
nucomp_form(ys[b], ys[b], intermediates[i], D, L);
5860
}
5961
}
60-
for (uint64_t b1 = 0; b1 < (1UL << k1); b1++) {
62+
for (uint64_t b1 = 0; b1 < (1ULL << k1); b1++) {
6163
form z = form::identity(D);
62-
for (uint64_t b0 = 0; b0 < (1UL << k0); b0++) {
63-
nucomp_form(z, z, ys[b1 * (1 << k0) + b0], D, L);
64+
for (uint64_t b0 = 0; b0 < (1ULL << k0); b0++) {
65+
nucomp_form(z, z, ys[b1 * (1ULL << k0) + b0], D, L);
6466
}
6567
z = FastPowFormNucomp(z, D, integer(b1 * (1 << k0)), L, reducer);
6668
nucomp_form(x, x, z, D, L);
6769
}
68-
for (uint64_t b0 = 0; b0 < (1UL << k0); b0++) {
70+
for (uint64_t b0 = 0; b0 < (1ULL << k0); b0++) {
6971
form z = form::identity(D);
70-
for (uint64_t b1 = 0; b1 < (1UL << k1); b1++) {
71-
nucomp_form(z, z, ys[b1 * (1 << k0) + b0], D, L);
72+
for (uint64_t b1 = 0; b1 < (1ULL << k1); b1++) {
73+
nucomp_form(z, z, ys[b1 * (1ULL << k0) + b0], D, L);
7274
}
7375
z = FastPowFormNucomp(z, D, integer(b0), L, reducer);
7476
nucomp_form(x, x, z, D, L);

src/verifier_test.cpp

+39-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "verifier.h"
22
#include "create_discriminant.h"
3+
#include "c_bindings/c_wrapper.h"
4+
#include "prover_slow.h"
35

46
void assertm(bool expr, std::string msg, bool verbose=false) {
57
if (expr && verbose) {
@@ -22,13 +24,47 @@ std::vector<uint8_t> HexToBytes(const char *hex_proof) {
2224
return result;
2325
}
2426

27+
ByteArray prove_wrapper(const uint8_t* challenge_hash, size_t challenge_size, const uint8_t* x_s, size_t x_s_size, size_t discriminant_size_bits, uint64_t num_iterations) {
28+
try {
29+
std::vector<uint8_t> challenge_hash_bytes(challenge_hash, challenge_hash + challenge_size);
30+
integer discriminant = CreateDiscriminant(challenge_hash_bytes, discriminant_size_bits);
31+
form x = DeserializeForm(discriminant, x_s, x_s_size);
32+
std::vector<uint8_t> result = ProveSlow(discriminant, x, num_iterations, "");
33+
34+
// Allocate memory for the result and copy data
35+
uint8_t* resultData = new uint8_t[result.size()];
36+
std::copy(result.begin(), result.end(), resultData);
37+
38+
return ByteArray { resultData, result.size() };
39+
} catch (...) {
40+
return ByteArray { nullptr, 0 };
41+
}
42+
}
43+
2544
int main()
2645
{
27-
uint8_t arr[10000];
28-
std::vector<uint8_t> result=HexToBytes("003f360be667de706fe886f766fe20240de04fe2c2f91207f1bbdddf20c554ab8d168b2ce9664d75f4613375a0ab12bf8158983574c9f5cd61c6b8a905fd3fa6bbffc5401b4ccedbe093b560293263a226e46302e720726586251116bc689ef09dc70d99e0a090c4409f928e218e85032fdbee02fedd563073be555b75a70a2d6a430033bc7a4926e3504e87698a0ace0dee6364cced2e9142b4e4cbe55a6371aab41e501ceed21d79d3a0dbbd82ce913c5de40b13eb7c59b1b52b6ef270ee603bd5e7fffcc9f5fae6dbd5aeec394181af130c0fdd195b22be745449b7a584ac80fc75ed49acfdb4d650f5cd344f86377ebbbaef5b19a0af3ae08101d1697f5656a52193000000000071c6f40024c342868a0c2a201b1b26a5d52c5d2f92a106c19ff926deb3fba1e74a444ecee3f8f507c062b949a2eaadd442b049417f82e8811526fa83c6d099d75323e068ffeca9dcd163761000c65d21dede72787ac350f25bdd3d29db6e9cb0e22c8124c724db33660c88784e2871b62ecf816846db7b469c71cad9a5dcfc5548ed2dd781006fa15b968facf4d79219646267eb187a670306d1ff1a59fc28ae00d36bb5a1cba659f48aa64a9022711a66105ef14401ff3948add265240aaad329ee76ba4c2300496746b86bcccacff5947c3fcb956cde2cffae10435960d7097f989aac742cf1047887f11584d20297958385e1715fe0f9b69141750c20d8134420eafec68fd10000000001555540006958aabfe4cc5d870e61fef82bcf1f2c3859e2bd8b1177e8a8872376b5cabace5dcb59b6fecada7e522d05f6f0e352939a6bfdf8c454fbe822cfa5ce97d17be0ffde44a4812cde9d04ec5c08dce6f9146586fdc8e081e05ec690b7effe24ea756f3d300f361203b61e1a39220c6eafa7852842674e317dcae5549c78c7144296ff004a6d0d2854c55e4c1de2f17dc4480b81652cfec37124ef41560a28c853482732434d1c006763b2e341528ae0bcc29fb76f1a4dafd99ade4fd75ec9cc9ca3f3d7001bcb6eb71e43eb22169ab721637551a8ec93838eb0825e9ecba9175297a00b146e9fdd244c5b722f29d3c46ec38840ba18f1f06ddec3dea844867386c2e1ac95");
46+
// Test overflow for slow prover (part of challenge b'\xa6\xc4%X\x17O\xb1\xee\xdcd')
47+
int l,k;
48+
ApproximateParameters(90909, l, k);
49+
50+
cout << "ApproximateParameters for 90909 l: " << l << " k: " << k << endl;
51+
52+
std::vector<uint8_t> challenge_hash=HexToBytes("a6c42558174fb1eedc64");
53+
std::vector<uint8_t> x_s=HexToBytes("0300aca4849458af5c557710c80f21519f196907764d2d55c9b70581a90d49ca7b3201ad6a9da836429e6592c200e965434f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
54+
55+
ByteArray ba=prove_wrapper(challenge_hash.data(), challenge_hash.size(), x_s.data(), x_s.size(), 512, 90909);
56+
57+
for (size_t i = 0; i < ba.length; i++)
58+
printf( "%02x", ba.data[i]);
59+
printf("\n");
60+
61+
delete[] ba.data;
62+
63+
uint8_t arr[10000];
64+
std::vector<uint8_t> result=HexToBytes("003f360be667de706fe886f766fe20240de04fe2c2f91207f1bbdddf20c554ab8d168b2ce9664d75f4613375a0ab12bf8158983574c9f5cd61c6b8a905fd3fa6bbffc5401b4ccedbe093b560293263a226e46302e720726586251116bc689ef09dc70d99e0a090c4409f928e218e85032fdbee02fedd563073be555b75a70a2d6a430033bc7a4926e3504e87698a0ace0dee6364cced2e9142b4e4cbe55a6371aab41e501ceed21d79d3a0dbbd82ce913c5de40b13eb7c59b1b52b6ef270ee603bd5e7fffcc9f5fae6dbd5aeec394181af130c0fdd195b22be745449b7a584ac80fc75ed49acfdb4d650f5cd344f86377ebbbaef5b19a0af3ae08101d1697f5656a52193000000000071c6f40024c342868a0c2a201b1b26a5d52c5d2f92a106c19ff926deb3fba1e74a444ecee3f8f507c062b949a2eaadd442b049417f82e8811526fa83c6d099d75323e068ffeca9dcd163761000c65d21dede72787ac350f25bdd3d29db6e9cb0e22c8124c724db33660c88784e2871b62ecf816846db7b469c71cad9a5dcfc5548ed2dd781006fa15b968facf4d79219646267eb187a670306d1ff1a59fc28ae00d36bb5a1cba659f48aa64a9022711a66105ef14401ff3948add265240aaad329ee76ba4c2300496746b86bcccacff5947c3fcb956cde2cffae10435960d7097f989aac742cf1047887f11584d20297958385e1715fe0f9b69141750c20d8134420eafec68fd10000000001555540006958aabfe4cc5d870e61fef82bcf1f2c3859e2bd8b1177e8a8872376b5cabace5dcb59b6fecada7e522d05f6f0e352939a6bfdf8c454fbe822cfa5ce97d17be0ffde44a4812cde9d04ec5c08dce6f9146586fdc8e081e05ec690b7effe24ea756f3d300f361203b61e1a39220c6eafa7852842674e317dcae5549c78c7144296ff004a6d0d2854c55e4c1de2f17dc4480b81652cfec37124ef41560a28c853482732434d1c006763b2e341528ae0bcc29fb76f1a4dafd99ade4fd75ec9cc9ca3f3d7001bcb6eb71e43eb22169ab721637551a8ec93838eb0825e9ecba9175297a00b146e9fdd244c5b722f29d3c46ec38840ba18f1f06ddec3dea844867386c2e1ac95");
2965
std::copy(result.begin(), result.end(), arr);
3066

31-
bool is_valid = CheckProofOfTimeNWesolowski(
67+
bool is_valid = CheckProofOfTimeNWesolowski(
3268
integer("-131653324254138636653163861414331698305531090221496467927360326686715180966094250598321899621249972220387687148397451395672779897144571112116763666653213748473909547482437246405018707472153290116227072825447643324530509016778432769802300913461285128339119844239772697652504835780459732685000796733645621728639"),
3369
DEFAULT_ELEMENT,
3470
arr,

tests/test_n_weso_verifier.py

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def test_prove_n_weso_and_verify():
6666
discriminant_challenge = secrets.token_bytes(10)
6767
discriminant_size = 512
6868
discriminant = create_discriminant(discriminant_challenge, discriminant_size)
69+
print(f"discriminant_challenge {discriminant_challenge.hex()} discriminant {discriminant}")
6970
form_size = 100
7071
initial_el = b"\x08" + (b"\x00" * 99)
7172

0 commit comments

Comments
 (0)