Add utility functions required in norm argument
This commit is contained in:
parent
420353d7da
commit
412f8f66a0
@ -2,6 +2,7 @@ include_HEADERS += include/secp256k1_bulletproofs.h
|
|||||||
noinst_HEADERS += src/modules/bulletproofs/bulletproofs_util.h
|
noinst_HEADERS += src/modules/bulletproofs/bulletproofs_util.h
|
||||||
noinst_HEADERS += src/modules/bulletproofs/main_impl.h
|
noinst_HEADERS += src/modules/bulletproofs/main_impl.h
|
||||||
noinst_HEADERS += src/modules/bulletproofs/bulletproofs_pp_transcript_impl.h
|
noinst_HEADERS += src/modules/bulletproofs/bulletproofs_pp_transcript_impl.h
|
||||||
|
noinst_HEADERS += src/modules/bulletproofs/bulletproofs_pp_norm_product_impl.h
|
||||||
noinst_HEADERS += src/modules/bulletproofs/tests_impl.h
|
noinst_HEADERS += src/modules/bulletproofs/tests_impl.h
|
||||||
|
|
||||||
if USE_BENCHMARK
|
if USE_BENCHMARK
|
||||||
|
81
src/modules/bulletproofs/bulletproofs_pp_norm_product_impl.h
Normal file
81
src/modules/bulletproofs/bulletproofs_pp_norm_product_impl.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2020 Andrew Poelstra *
|
||||||
|
* Distributed under the MIT software license, see the accompanying *
|
||||||
|
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#ifndef _SECP256K1_MODULE_BULLETPROOFS_PP_NORM_PRODUCT_
|
||||||
|
#define _SECP256K1_MODULE_BULLETPROOFS_PP_NORM_PRODUCT_
|
||||||
|
|
||||||
|
#include "group.h"
|
||||||
|
#include "scalar.h"
|
||||||
|
#include "ecmult.h"
|
||||||
|
#include "ecmult_gen.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
|
#include "modules/bulletproofs/main.h"
|
||||||
|
#include "modules/bulletproofs/bulletproofs_util.h"
|
||||||
|
|
||||||
|
/* Computes the inner product of two vectors of scalars
|
||||||
|
* with elements starting from offset a and offset b
|
||||||
|
* skipping elements according to specified step.
|
||||||
|
* Returns: Sum_{i=0..len-1}(a[offset_a + i*step] * b[offset_b + i*step]) */
|
||||||
|
static int secp256k1_scalar_inner_product(
|
||||||
|
secp256k1_scalar* res,
|
||||||
|
const secp256k1_scalar* a_vec,
|
||||||
|
const size_t a_offset,
|
||||||
|
const secp256k1_scalar* b_vec,
|
||||||
|
const size_t b_offset,
|
||||||
|
const size_t step,
|
||||||
|
const size_t len
|
||||||
|
) {
|
||||||
|
size_t i;
|
||||||
|
secp256k1_scalar_set_int(res, 0);
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
secp256k1_scalar term;
|
||||||
|
secp256k1_scalar_mul(&term, &a_vec[a_offset + step*i], &b_vec[b_offset + step*i]);
|
||||||
|
secp256k1_scalar_add(res, res, &term);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Computes the q-weighted inner product of two vectors of scalars
|
||||||
|
* for elements starting from offset a and offset b respectively with the
|
||||||
|
* given step.
|
||||||
|
* Returns: Sum_{i=0..len-1}(a[offset_a + step*i] * b[offset_b2 + step*i]*q^(i+1)) */
|
||||||
|
static int secp256k1_weighted_scalar_inner_product(
|
||||||
|
secp256k1_scalar* res,
|
||||||
|
const secp256k1_scalar* a_vec,
|
||||||
|
const size_t a_offset,
|
||||||
|
const secp256k1_scalar* b_vec,
|
||||||
|
const size_t b_offset,
|
||||||
|
const size_t step,
|
||||||
|
const size_t len,
|
||||||
|
const secp256k1_scalar* q
|
||||||
|
) {
|
||||||
|
secp256k1_scalar q_pow;
|
||||||
|
size_t i;
|
||||||
|
secp256k1_scalar_set_int(res, 0);
|
||||||
|
q_pow = *q;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
secp256k1_scalar term;
|
||||||
|
secp256k1_scalar_mul(&term, &a_vec[a_offset + step*i], &b_vec[b_offset + step*i]);
|
||||||
|
secp256k1_scalar_mul(&term, &term, &q_pow);
|
||||||
|
secp256k1_scalar_mul(&q_pow, &q_pow, q);
|
||||||
|
secp256k1_scalar_add(res, res, &term);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Compute the powers of r as r, r^2, r^4 ... r^(2^(n-1)) */
|
||||||
|
static void secp256k1_bulletproofs_powers_of_r(secp256k1_scalar *powers, const secp256k1_scalar *r, size_t n) {
|
||||||
|
size_t i;
|
||||||
|
if (n == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
powers[0] = *r;
|
||||||
|
for (i = 1; i < n; i++) {
|
||||||
|
secp256k1_scalar_sqr(&powers[i], &powers[i - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
13
src/modules/bulletproofs/main.h
Normal file
13
src/modules/bulletproofs/main.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef SECP256K1_MODULE_BULLETPROOFS_MAIN_H
|
||||||
|
#define SECP256K1_MODULE_BULLETPROOFS_MAIN_H
|
||||||
|
|
||||||
|
/* this type must be completed before any of the modules/bulletproofs includes */
|
||||||
|
struct secp256k1_bulletproofs_generators {
|
||||||
|
size_t n;
|
||||||
|
/* n total generators; includes both G_i and H_i */
|
||||||
|
/* For BP++, the generators are G_i from [0..(n - 8)] and the last 8 values
|
||||||
|
are generators are for H_i */
|
||||||
|
secp256k1_ge* gens;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -7,18 +7,13 @@
|
|||||||
#ifndef _SECP256K1_MODULE_BULLETPROOFS_MAIN_
|
#ifndef _SECP256K1_MODULE_BULLETPROOFS_MAIN_
|
||||||
#define _SECP256K1_MODULE_BULLETPROOFS_MAIN_
|
#define _SECP256K1_MODULE_BULLETPROOFS_MAIN_
|
||||||
|
|
||||||
/* this type must be completed before any of the modules/bulletproofs includes */
|
|
||||||
struct secp256k1_bulletproofs_generators {
|
|
||||||
size_t n;
|
|
||||||
/* n total generators; includes both G_i and H_i */
|
|
||||||
secp256k1_ge* gens;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include "include/secp256k1_bulletproofs.h"
|
#include "include/secp256k1_bulletproofs.h"
|
||||||
#include "include/secp256k1_generator.h"
|
#include "include/secp256k1_generator.h"
|
||||||
#include "modules/generator/main_impl.h" /* for generator_{load, save} */
|
#include "modules/generator/main_impl.h" /* for generator_{load, save} */
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "modules/bulletproofs/main.h"
|
||||||
|
#include "modules/bulletproofs/bulletproofs_pp_norm_product_impl.h"
|
||||||
|
|
||||||
secp256k1_bulletproofs_generators *secp256k1_bulletproofs_generators_create(const secp256k1_context *ctx, size_t n) {
|
secp256k1_bulletproofs_generators *secp256k1_bulletproofs_generators_create(const secp256k1_context *ctx, size_t n) {
|
||||||
secp256k1_bulletproofs_generators *ret;
|
secp256k1_bulletproofs_generators *ret;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "include/secp256k1_bulletproofs.h"
|
#include "include/secp256k1_bulletproofs.h"
|
||||||
|
#include "bulletproofs_pp_norm_product_impl.h"
|
||||||
#include "bulletproofs_util.h"
|
#include "bulletproofs_util.h"
|
||||||
#include "bulletproofs_pp_transcript_impl.h"
|
#include "bulletproofs_pp_transcript_impl.h"
|
||||||
|
|
||||||
@ -149,8 +150,46 @@ void test_log_exp(void) {
|
|||||||
CHECK(secp256k1_bulletproofs_pp_log2(257) == 8);
|
CHECK(secp256k1_bulletproofs_pp_log2(257) == 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_norm_util_helpers(void) {
|
||||||
|
secp256k1_scalar a_vec[4], b_vec[4], r_pows[4], res, res2, q, r;
|
||||||
|
int i;
|
||||||
|
/* a = {1, 2, 3, 4} b = {5, 6, 7, 8}, q = 4, r = 2 */
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
secp256k1_scalar_set_int(&a_vec[i], i + 1);
|
||||||
|
secp256k1_scalar_set_int(&b_vec[i], i + 5);
|
||||||
|
}
|
||||||
|
secp256k1_scalar_set_int(&q, 4);
|
||||||
|
secp256k1_scalar_set_int(&r, 2);
|
||||||
|
secp256k1_scalar_inner_product(&res, a_vec, 0, b_vec, 0, 1, 4);
|
||||||
|
secp256k1_scalar_set_int(&res2, 70);
|
||||||
|
CHECK(secp256k1_scalar_eq(&res2, &res) == 1);
|
||||||
|
|
||||||
|
secp256k1_scalar_inner_product(&res, a_vec, 0, b_vec, 1, 2, 2);
|
||||||
|
secp256k1_scalar_set_int(&res2, 30);
|
||||||
|
CHECK(secp256k1_scalar_eq(&res2, &res) == 1);
|
||||||
|
|
||||||
|
secp256k1_scalar_inner_product(&res, a_vec, 1, b_vec, 0, 2, 2);
|
||||||
|
secp256k1_scalar_set_int(&res2, 38);
|
||||||
|
CHECK(secp256k1_scalar_eq(&res2, &res) == 1);
|
||||||
|
|
||||||
|
secp256k1_scalar_inner_product(&res, a_vec, 1, b_vec, 1, 2, 2);
|
||||||
|
secp256k1_scalar_set_int(&res2, 44);
|
||||||
|
CHECK(secp256k1_scalar_eq(&res2, &res) == 1);
|
||||||
|
|
||||||
|
secp256k1_weighted_scalar_inner_product(&res, a_vec, 0, a_vec, 0, 1, 4, &q);
|
||||||
|
secp256k1_scalar_set_int(&res2, 4740); /*i*i*4^(i+1) */
|
||||||
|
CHECK(secp256k1_scalar_eq(&res2, &res) == 1);
|
||||||
|
|
||||||
|
secp256k1_bulletproofs_powers_of_r(r_pows, &r, 4);
|
||||||
|
secp256k1_scalar_set_int(&res, 2); CHECK(secp256k1_scalar_eq(&res, &r_pows[0]));
|
||||||
|
secp256k1_scalar_set_int(&res, 4); CHECK(secp256k1_scalar_eq(&res, &r_pows[1]));
|
||||||
|
secp256k1_scalar_set_int(&res, 16); CHECK(secp256k1_scalar_eq(&res, &r_pows[2]));
|
||||||
|
secp256k1_scalar_set_int(&res, 256); CHECK(secp256k1_scalar_eq(&res, &r_pows[3]));
|
||||||
|
}
|
||||||
|
|
||||||
void run_bulletproofs_tests(void) {
|
void run_bulletproofs_tests(void) {
|
||||||
test_log_exp();
|
test_log_exp();
|
||||||
|
test_norm_util_helpers();
|
||||||
test_bulletproofs_generators_api();
|
test_bulletproofs_generators_api();
|
||||||
test_bulletproofs_generators_fixed();
|
test_bulletproofs_generators_fixed();
|
||||||
test_bulletproofs_pp_tagged_hash();
|
test_bulletproofs_pp_tagged_hash();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user