7 #ifndef SECP256K1_MODULE_BULLETPROOF_TESTS
8 #define SECP256K1_MODULE_BULLETPROOF_TESTS
29 unsigned char proof[2000];
30 const unsigned char *proof_ptr = proof;
31 const unsigned char blind[32] =
" i am not a blinding factor ";
32 const unsigned char *blind_ptr[4];
33 size_t blindlen =
sizeof(blind);
34 size_t plen =
sizeof(proof);
35 uint64_t value[4] = { 1234, 4567, 8910, 1112 } ;
36 uint64_t min_value[4] = { 1000, 4567, 0, 5000 } ;
37 const uint64_t *mv_ptr = min_value;
38 unsigned char rewind_blind[32];
47 pcommit_arr[0] = pcommit;
66 CHECK(gens == NULL && ecount == 1);
68 CHECK(gens != NULL && ecount == 1);
73 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, min_value, blind_ptr, 1, &value_gen, 64, blind, blind, 32) == 1);
81 CHECK(
secp256k1_bulletproof_rangeproof_verify(vrfy, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 1);
82 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 1);
84 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
86 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen - 1, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
88 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, 0, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
90 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 31) == 0);
92 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, NULL, 0) == 0);
94 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 2, 64, &value_gen, blind, 32) == 0);
96 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 4, 64, &value_gen, blind, 32) == 0);
99 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, NULL, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
101 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, NULL, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
103 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, NULL, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
105 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, NULL, pcommit, 1, 64, &value_gen, blind, 32) == 0);
107 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, NULL, 1, 64, &value_gen, blind, 32) == 0);
109 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 0, 64, &value_gen, blind, 32) == 0);
111 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 65, &value_gen, blind, 32) == 0);
113 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 0, &value_gen, blind, 32) == 0);
115 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, NULL, blind, 32) == 0);
117 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, NULL, 32) == 0);
119 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 0) == 0);
127 const unsigned char *proof_ptr = proof;
128 const unsigned char blind[32] =
" i am not a blinding factor ";
130 uint64_t min_value[4] = { 0, 0, 0, 5000 } ;
131 const unsigned char *blind_ptr[4];
132 blind_ptr[0] = blind;
133 blind_ptr[1] = blind;
134 blind_ptr[2] = blind;
135 blind_ptr[3] = blind;
150 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, min_value, blind_ptr, 1, &
secp256k1_generator_const_g, 64, blind, NULL, 0) == 1);
157 const unsigned char *proof_ptr = proof;
158 const unsigned char blind[32] =
" i am not a blinding factor ";
159 uint64_t min_value[4] = { 0, 0, 0, 5000 } ;
163 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &
secp256k1_generator_const_g, NULL, 0) == 1);
166 static void test_build_verify() {
173 unsigned char proof[2000];
174 const unsigned char *proof_ptr = proof;
175 const unsigned char blind[32] =
" i am not a blinding factor ";
176 const unsigned char *blind_ptr[4];
177 size_t blindlen =
sizeof(blind);
178 size_t plen =
sizeof(proof);
179 uint64_t value[4] = { 1234, 4567, 8910, 1112 } ;
180 uint64_t min_value[4] = { 0, 0, 0, 5000 } ;
181 const uint64_t *mv_ptr = min_value;
182 unsigned char rewind_blind[32];
187 blind_ptr[0] = blind;
188 blind_ptr[1] = blind;
189 blind_ptr[2] = blind;
190 blind_ptr[3] = blind;
191 pcommit_arr[0] = pcommit;
205 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, min_value, blind_ptr, 2, &
secp256k1_generator_const_g, 64, blind, NULL, 0) == 1);
209 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 2, 64, &
secp256k1_generator_const_g, NULL, 0) == 1);
212 static void test_bulletproof_api(
void) {
222 unsigned char proof[2000];
223 const unsigned char *proof_ptr = proof;
224 const unsigned char blind[32] =
" i am not a blinding factor ";
225 const unsigned char *blind_ptr[4];
226 size_t blindlen =
sizeof(blind);
227 size_t plen =
sizeof(proof);
228 uint64_t value[4] = { 1234, 4567, 8910, 1112 } ;
229 uint64_t min_value[4] = { 1000, 4567, 0, 5000 } ;
230 const uint64_t *mv_ptr = min_value;
231 unsigned char rewind_blind[32];
234 const char circ_desc_good[] =
"2,0,0,4; L0 = 17; 2*L1 - L0 = 21; O0 = 1; O1 = 1;";
235 const char circ_desc_bad[] =
"2,0,0,4; L0 = 17; 2*L1 - L0 = 21; O0 = 1; O1 x 1;";
242 blind_ptr[0] = blind;
243 blind_ptr[1] = blind;
244 blind_ptr[2] = blind;
245 blind_ptr[3] = blind;
246 pcommit_arr[0] = pcommit;
265 CHECK(gens == NULL && ecount == 1);
267 CHECK(gens != NULL && ecount == 1);
271 CHECK(
secp256k1_bulletproof_rangeproof_prove(none, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
273 CHECK(
secp256k1_bulletproof_rangeproof_prove(sign, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
275 CHECK(
secp256k1_bulletproof_rangeproof_prove(vrfy, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
277 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 1);
280 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 2, &value_gen, 64, blind, NULL, 0) == 1);
283 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 4, &value_gen, 64, blind, NULL, 0) == 0);
286 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, min_value, blind_ptr, 2, &value_gen, 64, blind, NULL, 0) == 1);
288 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, &value[1], &min_value[1], blind_ptr, 2, &value_gen, 64, blind, NULL, 0) == 1);
290 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, &value[2], &min_value[2], blind_ptr, 2, &value_gen, 64, blind, NULL, 0) == 0);
293 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, NULL, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
295 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, NULL, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
297 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, NULL, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
299 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, NULL, value, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
301 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, NULL, NULL, blind_ptr, 1, &value_gen, 64, blind, NULL, 0) == 0);
303 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, NULL, 1, &value_gen, 64, blind, NULL, 0) == 0);
305 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 0, &value_gen, 64, blind, NULL, 0) == 0);
307 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, NULL, 64, blind, NULL, 0) == 0);
309 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 0, blind, NULL, 0) == 0);
311 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 65, blind, NULL, 0) == 0);
313 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, -1, blind, NULL, 0) == 0);
315 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, NULL, NULL, 0) == 0);
317 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, NULL, blind_ptr, 1, &value_gen, 64, blind, blind, 0) == 1);
319 CHECK(
secp256k1_bulletproof_rangeproof_prove(both, scratch, gens, proof, &plen, value, min_value, blind_ptr, 1, &value_gen, 64, blind, blind, 32) == 1);
324 CHECK(
secp256k1_bulletproof_rangeproof_verify(none, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
326 CHECK(
secp256k1_bulletproof_rangeproof_verify(sign, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
328 CHECK(
secp256k1_bulletproof_rangeproof_verify(vrfy, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 1);
330 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 1);
333 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
335 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen - 1, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
337 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, 0, min_value, pcommit, 1, 63, &value_gen, blind, 32) == 0);
339 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 31) == 0);
341 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, NULL, 0) == 0);
343 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 2, 64, &value_gen, blind, 32) == 0);
345 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 4, 64, &value_gen, blind, 32) == 0);
348 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, NULL, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
350 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, NULL, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
352 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, NULL, plen, min_value, pcommit, 1, 64, &value_gen, blind, 32) == 0);
354 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, NULL, pcommit, 1, 64, &value_gen, blind, 32) == 0);
356 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, NULL, 1, 64, &value_gen, blind, 32) == 0);
358 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 0, 64, &value_gen, blind, 32) == 0);
360 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 65, &value_gen, blind, 32) == 0);
362 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 0, &value_gen, blind, 32) == 0);
364 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, NULL, blind, 32) == 0);
366 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, NULL, 32) == 0);
368 CHECK(
secp256k1_bulletproof_rangeproof_verify(both, scratch, gens, proof, plen, min_value, pcommit, 1, 64, &value_gen, blind, 0) == 0);
373 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(none, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
375 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(sign, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
377 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(vrfy, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 1);
379 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 1);
382 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, NULL, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
384 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, NULL, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
386 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, NULL, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
388 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 0, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
390 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, NULL, pcommit_arr, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
392 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, NULL, 1, 64, &value_gen, blind_ptr, &blindlen) == 0);
394 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, NULL, blind_ptr, &blindlen) == 0);
396 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, NULL, &blindlen) == 0);
398 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, blind_ptr, NULL) == 0);
400 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 64, &value_gen, NULL, NULL) == 0);
403 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 0, 64, &value_gen, blind_ptr, &blindlen) == 0);
405 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 65, &value_gen, blind_ptr, &blindlen) == 0);
407 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 63, &value_gen, blind_ptr, &blindlen) == 0);
409 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 1, 0, &value_gen, blind_ptr, &blindlen) == 0);
411 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 2, 64, &value_gen, blind_ptr, &blindlen) == 0);
413 CHECK(
secp256k1_bulletproof_rangeproof_verify_multi(both, scratch, gens, &proof_ptr, 1, plen, &mv_ptr, pcommit_arr, 4, 64, &value_gen, blind_ptr, &blindlen) == 0);
418 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, blind, 32) == 1);
420 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, NULL, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, blind, 32) == 0);
422 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, NULL, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, blind, 32) == 0);
424 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, NULL, proof, plen, min_value[0], pcommit, &value_gen, blind, blind, 32) == 0);
426 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, NULL, plen, min_value[0], pcommit, &value_gen, blind, blind, 32) == 0);
428 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, 0, min_value[0], pcommit, &value_gen, blind, blind, 32) == 0);
430 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, 0, pcommit, &value_gen, blind, blind, 32) == 0);
432 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], NULL, &value_gen, blind, blind, 32) == 0);
434 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, NULL, blind, blind, 32) == 0);
436 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, NULL, blind, 32) == 0);
438 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, NULL, 32) == 0);
440 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, blind, 0) == 0);
442 CHECK(
secp256k1_bulletproof_rangeproof_rewind(none, gens, &rewind_v, rewind_blind, proof, plen, min_value[0], pcommit, &value_gen, blind, NULL, 0) == 0);
448 CHECK(circ == NULL && ecount == 1);
450 CHECK(circ == NULL && ecount == 1);
452 CHECK(circ != NULL && ecount == 1);
457 CHECK(circ == NULL && ecount == 1);
459 CHECK(circ == NULL && ecount == 2);
462 CHECK(circ != NULL && ecount == 2);
465 CHECK(assn == NULL && ecount == 2);
467 CHECK(assn == NULL && ecount == 3);
469 CHECK(assn != NULL && ecount == 3);
472 CHECK(
secp256k1_bulletproof_circuit_prove(none, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, blind, 32) == 0);
474 CHECK(
secp256k1_bulletproof_circuit_prove(sign, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, blind, 32) == 0);
476 CHECK(
secp256k1_bulletproof_circuit_prove(vrfy, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, blind, 32) == 1);
478 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, blind, 32) == 1);
480 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, NULL, 32) == 0);
482 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, NULL, 0) == 1);
485 CHECK(
secp256k1_bulletproof_circuit_prove(both, NULL, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, NULL, 0) == 0);
487 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, NULL, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, NULL, 0) == 0);
489 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, NULL, proof, &plen, assn, NULL, 0, blind, &value_gen, NULL, 0) == 0);
491 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, NULL, &plen, assn, NULL, 0, blind, &value_gen, NULL, 0) == 0);
493 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, NULL, assn, NULL, 0, blind, &value_gen, NULL, 0) == 0);
495 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, NULL, NULL, 0, blind, &value_gen, NULL, 0) == 0);
497 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, NULL, &value_gen, NULL, 0) == 0);
499 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, NULL, NULL, 0) == 0);
502 CHECK(
secp256k1_bulletproof_circuit_prove(both, scratch, gens, circ, proof, &plen, assn, NULL, 0, blind, &value_gen, blind, 32) == 1);
505 CHECK(
secp256k1_bulletproof_circuit_verify(none, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 0);
507 CHECK(
secp256k1_bulletproof_circuit_verify(sign, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 0);
509 CHECK(
secp256k1_bulletproof_circuit_verify(vrfy, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 1);
511 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 1);
514 CHECK(
secp256k1_bulletproof_circuit_verify(both, NULL, gens, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 0);
516 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, NULL, circ, proof, plen, NULL, 0, &value_gen, blind, 32) == 0);
518 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, NULL, proof, plen, NULL, 0, &value_gen, blind, 32) == 0);
520 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, NULL, plen, NULL, 0, &value_gen, blind, 32) == 0);
522 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, 0, NULL, 0, &value_gen, blind, 32) == 0);
524 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, plen - 1, NULL, 0, &value_gen, blind, 32) == 0);
526 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, plen, NULL, 0, NULL, blind, 32) == 0);
528 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, NULL, 32) == 0);
530 CHECK(
secp256k1_bulletproof_circuit_verify(both, scratch, gens, circ, proof, plen, NULL, 0, &value_gen, NULL, 0) == 0);
533 CHECK(
secp256k1_bulletproof_circuit_verify_multi(none, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
535 CHECK(
secp256k1_bulletproof_circuit_verify_multi(sign, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
537 CHECK(
secp256k1_bulletproof_circuit_verify_multi(vrfy, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 1);
539 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 1);
542 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, NULL, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
544 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, NULL, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
546 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, NULL, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
548 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, NULL, 1, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
551 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 0, plen, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 1);
553 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, 0, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
555 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen - 1, NULL, NULL, &value_gen, blind_ptr, &blindlen) == 0);
557 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, NULL, blind_ptr, &blindlen) == 0);
559 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, NULL, &blindlen) == 0);
561 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, blind_ptr, NULL) == 0);
563 CHECK(
secp256k1_bulletproof_circuit_verify_multi(both, scratch, gens, &constcirc, &proof_ptr, 1, plen, NULL, NULL, &value_gen, NULL, NULL) == 0);
572 secp256k1_scratch_destroy(scratch);
579 #define MAX_WIDTH (1ul << 20)
590 if (idx < ecctx->n) {
595 *sc = ecctx->
b[idx - ecctx->
n];
596 *pt = ecctx->
h[idx - ecctx->
n];
613 secp256k1_scalar_set_int(&ecctx->
offs, 1);
614 if (idx < 2 * ecctx->n) {
616 secp256k1_scalar_set_int(&idxsc, idx);
617 secp256k1_scalar_mul(sc, &ecctx->
skew_sc, &idxsc);
623 secp256k1_scalar_set_int(sc, 1);
627 secp256k1_scalar_mul(sc, sc, randomizer);
640 const int is_g = idx % 2 == 0;
644 *sc = cbctx->
a_arr[idx / 2];
646 *sc = cbctx->
b_arr[idx / 2];
657 unsigned char commit[32] =
"hash of P, c, etc. all that jazz";
663 unsigned char proof[2000];
664 size_t plen =
sizeof(proof);
668 for (j = 0; j < n; j++) {
673 abgh_data.
a_arr = a_arr;
674 abgh_data.
b_arr = b_arr;
678 secp256k1_scalar_clear(&offs_ctx.
skew_sc);
681 secp256k1_scalar_set_int(&one, 1);
682 CHECK(secp256k1_bulletproof_inner_product_prove_impl(&ctx->ecmult_ctx, scratch, proof, &plen, gens, &one, n, secp256k1_bulletproof_ip_test_abgh_callback, (
void *) &abgh_data, commit) == 1);
684 innp_ctx.
proof = proof;
686 secp256k1_scalar_set_int(&innp_ctx.
yinv, 1);
688 innp_ctx.
rangeproof_cb = test_bulletproof_offset_vfy_callback;
696 ecmult_data.
a = a_arr;
697 ecmult_data.
b = b_arr;
698 ecmult_data.
g = gens->
gens;
699 ecmult_data.
h = gens->
gens + gens->
n/2;
700 CHECK(secp256k1_ecmult_multi_var(&ctx->ecmult_ctx, scratch, &pj, &zero, test_bulletproof_ecmult_callback, (
void*) &ecmult_data, 2 * n));
701 secp256k1_ge_set_gej(&offs_ctx.
p, &pj);
706 secp256k1_scalar_clear(&innp_ctx.
p_offs);
707 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
712 secp256k1_ecmult(&ctx->ecmult_ctx, &tmpj, &tmpj2, &innp_ctx.
p_offs, &zero);
713 secp256k1_gej_add_var(&pj, &pj, &tmpj, NULL);
714 secp256k1_ge_set_gej(&offs_ctx.
p, &pj);
718 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 0);
720 secp256k1_scalar_negate(&innp_ctx.
p_offs, &innp_ctx.
p_offs);
723 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
726 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
729 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
732 secp256k1_gej_set_ge(&tmpj2, &offs_ctx.
ext_pt);
733 secp256k1_ecmult(&ctx->ecmult_ctx, &tmpj, &tmpj2, &offs_ctx.
ext_sc, &zero);
734 secp256k1_gej_neg(&tmpj, &tmpj);
735 secp256k1_gej_add_ge_var(&tmpj, &tmpj, &offs_ctx.
p, NULL);
736 secp256k1_ge_set_gej(&offs_ctx.
p, &tmpj);
739 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
742 secp256k1_gej_set_infinity(&tmpj2);
743 for (j = 0; j < n; j++) {
746 for (k = 0; k < j; k++) {
747 secp256k1_gej_add_ge_var(&tmpj2, &tmpj2, &gens->
gens[j], NULL);
748 secp256k1_gej_add_ge_var(&tmpj2, &tmpj2, &gens->
gens[j + gens->
n/2], NULL);
750 for (k = 0; k < n; k++) {
751 secp256k1_gej_add_ge_var(&tmpj2, &tmpj2, &gens->
gens[j + gens->
n/2], NULL);
755 secp256k1_ecmult(&ctx->ecmult_ctx, &tmpj, &tmpj2, &offs_ctx.
skew_sc, &zero);
756 secp256k1_gej_add_ge_var(&tmpj, &tmpj, &offs_ctx.
p, NULL);
757 secp256k1_ge_set_gej(&offs_ctx.
p, &tmpj);
761 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, &innp_ctx, 1, plen, 1) == 1);
768 memcpy(&innp_ctxs[0], &innp_ctx,
sizeof(innp_ctx));
769 memcpy(&innp_ctxs[1], &innp_ctx,
sizeof(innp_ctx));
770 memcpy(&offs_ctxs[0], &offs_ctx,
sizeof(offs_ctx));
771 memcpy(&offs_ctxs[1], &offs_ctx,
sizeof(offs_ctx));
774 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, innp_ctxs, 2, plen, 1) == 1);
775 CHECK(secp256k1_bulletproof_inner_product_verify_impl(&ctx->ecmult_ctx, scratch, gens, n, innp_ctxs, 2, plen, 0) == 1);
780 secp256k1_scratch_destroy(scratch);
786 unsigned char proof[1024];
787 unsigned char proof2[1024];
788 unsigned char proof3[1024];
789 const unsigned char *proof_ptr[3];
790 size_t plen =
sizeof(proof);
792 uint64_t v_recovered;
799 unsigned char nonce[32] =
"my kingdom for some randomness!!";
803 if (v >> nbits > 0) {
809 proof_ptr[0] = proof;
810 proof_ptr[1] = proof2;
811 proof_ptr[2] = proof3;
818 secp256k1_pedersen_ecmult(&commitj, &blind, v, &value_gen[0], &gens->
blinding_gen[0]);
819 secp256k1_ge_set_gej(&commitp, &commitj);
820 secp256k1_pedersen_ecmult(&commitj, &blind, v, &value_gen[2], &gens->
blinding_gen[0]);
821 secp256k1_ge_set_gej(&commitp2, &commitj);
822 commitp_ptr[0] = commitp_ptr[1] = &commitp;
823 commitp_ptr[2] = &commitp2;
824 secp256k1_pedersen_commitment_save(&pcommit, &commitp);
826 CHECK(secp256k1_bulletproof_rangeproof_prove_impl(&ctx->ecmult_ctx, scratch, proof, &plen, nbits, &v, NULL, &blind,
827 &commitp, 1, &value_gen[0], gens, nonce, NULL, 0) == 1);
828 CHECK(plen == expected_size);
830 CHECK(secp256k1_bulletproof_rangeproof_prove_impl(&ctx->ecmult_ctx, scratch, proof2, &plen, nbits, &v, NULL, &blind,
831 &commitp, 1, &value_gen[1], gens, nonce, NULL, 0) == 1);
832 CHECK(plen == expected_size);
834 CHECK(secp256k1_bulletproof_rangeproof_prove_impl(&ctx->ecmult_ctx, scratch, proof3, &plen, nbits, &v, NULL, &blind,
835 &commitp2, 1, &value_gen[2], gens, nonce, NULL, 0) == 1);
836 CHECK(plen == expected_size);
839 CHECK(secp256k1_bulletproof_rangeproof_verify_impl(&ctx->ecmult_ctx, scratch, proof_ptr, 1, plen, nbits, NULL,
840 commitp_ptr, 1, value_gen, gens, NULL, 0) == 1);
842 CHECK(secp256k1_bulletproof_rangeproof_verify_impl(&ctx->ecmult_ctx, scratch, proof_ptr, 2, plen, nbits, NULL, commitp_ptr, 1, value_gen, gens, NULL, 0) == 1);
844 CHECK(secp256k1_bulletproof_rangeproof_verify_impl(&ctx->ecmult_ctx, scratch, proof_ptr, 3, plen, nbits, NULL, commitp_ptr, 1, value_gen, gens, NULL, 0) == 1);
847 CHECK(secp256k1_bulletproof_rangeproof_rewind_impl(&v_recovered, &blind_recovered, proof, plen, 0, &pcommit, &
secp256k1_generator_const_g, gens->
blinding_gen, nonce, NULL, 0) == 1);
848 CHECK(v_recovered == v);
849 CHECK(secp256k1_scalar_eq(&blind_recovered, &blind) == 1);
852 CHECK(secp256k1_bulletproof_rangeproof_rewind_impl(&v_recovered, &blind_recovered, proof, plen, 0, &pcommit, &
secp256k1_generator_const_g, gens->
blinding_gen, nonce, NULL, 0) == 0);
854 secp256k1_scratch_destroy(scratch);
858 unsigned char proof[1024];
861 const unsigned char *proof_ptr = proof;
862 size_t plen =
sizeof(proof);
864 uint64_t *v = (uint64_t *)checked_malloc(&both->
error_callback, n_commits *
sizeof(*v));
868 unsigned char commit[32] = {0};
874 for (i = 0; i < n_commits; i++) {
878 v[i] = 223 * (i + 1);
880 secp256k1_scalar_set_u64(&vs, v[i]);
883 secp256k1_ge_set_gej(&commitp[i], &commitj);
885 secp256k1_bulletproof_update_commit(commit, &commitp[i], &value_gen);
888 CHECK(secp256k1_bulletproof_rangeproof_prove_impl(&both->
ecmult_ctx, scratch, proof, &plen, nbits, v, NULL, blind, commitp, n_commits, &value_gen, gens, NULL, NULL, 0) == 1);
889 printf(
"plen = %d", plen);
891 CHECK(secp256k1_bulletproof_rangeproof_verify_impl(&ctx->ecmult_ctx, scratch1, &proof_ptr, 1, plen, nbits, NULL, &constptr, n_commits, &value_gen, gens, NULL, 0) == 1);
893 secp256k1_scratch_destroy(scratch);
894 secp256k1_scratch_destroy(scratch1);
901 unsigned char proof[1024];
903 const unsigned char *proof_ptr = proof;
904 size_t plen =
sizeof(proof);
906 uint64_t *v = (uint64_t *)checked_malloc(&both->
error_callback, n_commits *
sizeof(*v));
910 unsigned char commit[32] = {0};
911 unsigned char nonce[32] =
"mary, mary quite contrary how do";
917 for (i = 0; i < n_commits; i++) {
921 v[i] = 223 * (i + 1);
922 if (v[i] >> nbits > 0) {
925 printf(
"v[i] = %d", v[i]);
926 secp256k1_scalar_set_u64(&vs, v[i]);
928 secp256k1_pedersen_ecmult(&commitj, &blind[i], v[i], &value_gen, &gens->
blinding_gen[0]);
929 secp256k1_ge_set_gej(&commitp[i], &commitj);
931 secp256k1_bulletproof_update_commit(commit, &commitp[i], &value_gen);
934 CHECK(secp256k1_bulletproof_rangeproof_prove_impl(&both->
ecmult_ctx, scratch, proof, &plen, nbits, v, NULL, blind, commitp, n_commits, &value_gen, gens, nonce, NULL, 0) == 1);
935 printf(
"plen = %d", plen);
936 CHECK(plen == expected_size);
938 CHECK(secp256k1_bulletproof_rangeproof_verify_impl(&ctx->ecmult_ctx, scratch1, &proof_ptr, 1, plen, nbits, NULL, &constptr, n_commits, &value_gen, gens, NULL, 0) == 1);
940 secp256k1_scratch_destroy(scratch);
941 secp256k1_scratch_destroy(scratch1);
949 unsigned char proof[2000];
950 const unsigned char nonce[32] =
"ive got a bit won't tell u which";
951 const unsigned char *proof_ptr = proof;
952 size_t plen =
sizeof(proof);
963 static const char pedersen_3_desc[] =
"8,0,3,11; "
966 "O3 + 43761614841181848836640060563436836929981077120207297347288494535014373124598*L4 + 32269103446714936439983769262136990710725469005847626272964912432556195438855*L0 + 53470148824566042419568143658779164645897136432324031591105781651996231383599*L1 = -29906057699896301565330867720293440045651680527210179749355355245466869592774; "
968 "O4 - O5 = -5790157963784981660191168841374597722972181776698071254377150704077242214507; "
969 "R5 - 25758063836554693196908199229504721621729641941971332474184303138909611379443*L0 + 11291233376911191389536694739885054786695386896193593308033244950342020590185*L1 + 3363265264840957283186157428945612617240329097799939360463518825408167634185*L4 = -29614996938732799633661547612064662376197030231215982466591901560589852461284; "
973 "O6 + R7 - 51516127673109386393816398459009443243459283883942664948368606277819222758886*L0 + 22582466753822382779073389479770109573390773792387186616066489900684041180370*L1 + 6726530529681914566372314857891225234480658195599878720927037650816335268370*L4 = -25204003405338345315301650454981416603166816758113955371299998112889962854657; "
974 "O6 - 25758063836554693196908199229504721621729641941971332474184303138909611379443*L0 + 11291233376911191389536694739885054786695386896193593308033244950342020590185*L1 + 3363265264840957283186157428945612617240329097799939360463518825408167634185*L4 = 10482191031782654019194619252232560984851404783271171686897023817875267510226;";
980 SECP256K1_SCALAR_CONST(0x8622f5f9, 0x83a711d6, 0x35530e80, 0x298ac2f1, 0x287824b2, 0xf76f6474, 0x7f4919d6, 0x2e300537),
981 SECP256K1_SCALAR_CONST(0x1fc757ec, 0xbddbbeb9, 0xd4f41473, 0xb24f6530, 0x743a1437, 0x46963ca9, 0x0a83f80c, 0x1ee5328b),
982 SECP256K1_SCALAR_CONST(0x1fc757ec, 0xbddbbeb9, 0xd4f41473, 0xb24f6530, 0x743a1437, 0x46963ca9, 0x0a83f80c, 0x1ee5328b),
983 SECP256K1_SCALAR_CONST(0x1fc757ec, 0xbddbbeb9, 0xd4f41473, 0xb24f6530, 0x743a1437, 0x46963ca9, 0x0a83f80c, 0x1ee5328b)
986 SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140),
987 SECP256K1_SCALAR_CONST(0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0xbaaedce6, 0xaf48a03b, 0xbfd25e8c, 0xd0364140),
991 SECP256K1_SCALAR_CONST(0x31c8eae3, 0xf71d7572, 0x260f2848, 0xe9f7209d, 0x7366b59e, 0x073e490d, 0x279d8c48, 0x656e329f),
992 SECP256K1_SCALAR_CONST(0x1fc757ec, 0xbddbbeb9, 0xd4f41473, 0xb24f6530, 0x743a1437, 0x46963ca9, 0x0a83f80c, 0x1ee5328b),
993 SECP256K1_SCALAR_CONST(0x245cbdd4, 0xef485258, 0xba62e0d9, 0x26e672d2, 0x83d1988a, 0x3c3a1e2f, 0x6639ec10, 0x39c6a2b0)
1000 SECP256K1_SCALAR_CONST(0x8622f5f9, 0x83a711d6, 0x35530e80, 0x298ac2f1, 0x287824b2, 0xf76f6474, 0x7f4919d6, 0x2e300537),
1001 SECP256K1_SCALAR_CONST(0x92f012f8, 0xd76c6bd9, 0x7cdaa7c4, 0x6a848512, 0xed249960, 0xc58efb11, 0x48945d26, 0x186dada2),
1002 SECP256K1_SCALAR_CONST(0x8a6f1f26, 0x6b9c02e6, 0x8cb97c20, 0xd04aab71, 0xf4024826, 0xeb84f19f, 0xa13641ee, 0xe3f3db55),
1003 SECP256K1_SCALAR_CONST(0xc4e18e86, 0x9b53aabc, 0x22891520, 0x299684a8, 0x75ad4a2e, 0xc4e1e6af, 0x2556146f, 0xb25f219e)
1006 const char inv_17_19_circ[] =
"2,1,0,5; L0 = 17; 2*L1 - L0 = 21; O0 = 1; O1 = 1; V0 - L0 = 100;";
1012 CHECK(simple != NULL);
1013 CHECK(pedersen_3 != NULL);
1014 CHECK(pedersen_3_bin != NULL);
1017 assn.
al = secp256k1_scratch_alloc(scratch, 1024 *
sizeof(*assn.
al));
1018 assn.
ar = secp256k1_scratch_alloc(scratch, 1024 *
sizeof(*assn.
al));
1019 assn.
ao = secp256k1_scratch_alloc(scratch, 1024 *
sizeof(*assn.
al));
1021 CHECK (simple != NULL);
1023 secp256k1_scalar_set_int(&challenge, 17);
1024 secp256k1_scalar_inverse(&answer, &challenge);
1025 secp256k1_scalar_set_int(&one, 1);
1028 assn.
al[0] = assn.
al[1] = challenge;
1029 assn.
ar[0] = assn.
ar[1] = answer;
1030 assn.
ao[0] = assn.
ao[1] = one;
1032 secp256k1_scalar_set_int(&commitv, 117);
1033 secp256k1_scalar_set_int(&challenge, 19);
1034 secp256k1_scalar_inverse(&answer, &challenge);
1035 assn.
al[1] = challenge;
1036 assn.
ar[1] = answer;
1043 secp256k1_pedersen_ecmult(&commitj, &one, 117, &value_gen, &gens->
blinding_gen[0]);
1044 secp256k1_ge_set_gej(&commitp, &commitj);
1045 commitp_ptr = &commitp;
1047 CHECK(secp256k1_bulletproof_relation66_prove_impl(
1060 CHECK(secp256k1_bulletproof_relation66_verify_impl(
1063 &proof_ptr, 1, plen,
1072 assn.
al = pedersen_3_al;
1073 assn.
ar = pedersen_3_ar;
1074 assn.
ao = pedersen_3_ao;
1077 CHECK(secp256k1_bulletproof_relation66_prove_impl(
1090 CHECK(secp256k1_bulletproof_relation66_verify_impl(
1093 &proof_ptr, 1, plen,
1101 secp256k1_pedersen_ecmult_scalar(&commitj, &one, &pedersen_3_assn->
v[0], &value_gen, &gens->
blinding_gen[0]);
1102 secp256k1_ge_set_gej(&commitp, &commitj);
1103 commitp_ptr = &commitp;
1105 CHECK(secp256k1_bulletproof_relation66_prove_impl(
1118 CHECK(secp256k1_bulletproof_relation66_verify_impl(
1121 &proof_ptr, 1, plen,
1122 &commitp_ptr, &pedersen_3_bin->
n_commits,
1133 secp256k1_scratch_deallocate_frame(scratch);
1134 secp256k1_scratch_destroy(scratch);
1141 test_bulletproof_api();
1150 printf(
"Testing bulletproof inner product\n");
1156 for (i = 0; i < (size_t) count; i++) {
1161 printf(
"Testing bulletproof range proof\n");
1163 printf(
"testing verify");
1171 printf(
"Testing bulletproof multi range proof\n");