github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/StadiumForWaterCarver/src/Pedersen.cpp (about)

     1  /*
     2   * Pedersen.cpp
     3   *
     4   *  Created on: 04.10.2010
     5   *      Author: stephaniebayer
     6   */
     7  #include "Pedersen.h"
     8  #include "G_q.h"
     9  #include "FakeZZ.h"
    10  NTL_CLIENT
    11  
    12  #include "Mod_p.h"
    13  #include "multi_expo.h"
    14  #include <stdio.h>
    15  #include <time.h>
    16  #include <vector>
    17  #include <fstream>
    18  #include <sstream>
    19  
    20  extern G_q G;
    21  
    22  void Pedersen::print_commitment(long i) const {
    23  	cout << "random for commitment = " << gen->at(i) << endl;
    24  }
    25  
    26  string Pedersen::get_public_vector() const {
    27  	string ret;
    28  	stringstream ss(ret);
    29  	for (unsigned int i = 0; i < gen->size(); i++) {
    30  		ss << gen->at(i) << endl;
    31  	}
    32  
    33  	return ss.str();
    34  }
    35  
    36  extern string publicRandoms;
    37  
    38  void Pedersen::set_public_vector(istringstream& f, long n, int o1, int o2, int o3) {
    39      if (publicRandoms.length() > 0) {
    40          f = istringstream(publicRandoms);
    41      }
    42      string line;
    43  	
    44  	if (gen != nullptr)	{ 
    45  		gen->clear();
    46  		delete gen;
    47  	}
    48  	gen = new vector<Mod_p>(n+1);
    49  
    50  	Mod_p temp;
    51  	long i = 0;
    52      while (std::getline(f, line)) {
    53  		istringstream gstr(line);
    54          gstr >> gen->at(i);
    55  		i++;
    56  		if (i > n) {
    57              break;
    58  		}
    59      }
    60  	set_omega(o1, o2, o3);
    61  }
    62  
    63  Pedersen::Pedersen() : gen(nullptr) {
    64  // TODO remove containing stack -- this is never called
    65  }
    66  
    67  //Generates an instance of Pedersen with group H, which is able to commit up to n elements
    68  Pedersen::Pedersen(long n) { //, G_q H){
    69      if (publicRandoms.length() > 0) {
    70          gen = new vector<Mod_p>(n+1);
    71          istringstream f(publicRandoms);
    72          string line;
    73          long i = 0;
    74          while (std::getline(f, line)) {
    75              istringstream gstr(line);
    76              gstr >> gen->at(i);
    77              i++;
    78              if (i > n) {
    79                  break;
    80              }
    81          }
    82          gen_prec = 0;
    83          return;
    84      }
    85  	long i;
    86  	bool b;
    87  	ZZ ran;
    88  	Mod_p temp;
    89  
    90  	//G = H;
    91  	gen = new vector<Mod_p>(n+1);
    92  	for (i =0; i <=n; i++)
    93  	{
    94  		b = true;
    95  		while(b){
    96  			ran = RandomBnd(G.get_ord());
    97  
    98  #if USE_REAL_POINTS
    99                          ZZ mod = G.get_mod();
   100                          CurvePoint x;
   101                          basepoint_scalarmult(x, ran);
   102                          temp = Mod_p(x, mod);
   103  #else
   104  			temp = G.get_gen().expo(to_ZZ(ran));
   105  #endif
   106  			if (G.is_generator(temp))
   107  			{
   108  				(*gen).at(i)=temp;
   109  				b = false;
   110  			}
   111  		}
   112  	}
   113      gen_prec = 0;
   114  }
   115  
   116  Pedersen::Pedersen(Mod_p* g, int n) {
   117  	gen_prec = 0;
   118  	if (NULL == g) {
   119  		gen = nullptr;
   120  	}
   121  	gen = new vector<Mod_p>(n);
   122  	int i = 0;
   123  	for (i = 0; i < n ; i++) {
   124  		if (G.is_generator(g[i])) {
   125  			(*gen)[i] = g[i];
   126  		} else {
   127  			std::cout << "Error in Pedersen(Mod_p* g), invalid gen." << std::endl;
   128  			gen = nullptr;
   129  			return;
   130  		}
   131  	}
   132  }
   133  
   134  
   135  Pedersen::~Pedersen() {
   136  	if (gen != nullptr) {
   137  		gen->clear();
   138  		delete gen;
   139  	}
   140          if (gen_prec != 0) {
   141            delete gen_prec->at(0);
   142            delete gen_prec->at(1);
   143            delete gen_prec;
   144          }
   145  }
   146  
   147  //returns the group of the instance
   148  G_q Pedersen::get_group() const{
   149  
   150  	return G;
   151  }
   152  
   153  void Pedersen:: set_omega(int o1, int o2, int o3){
   154  
   155  	omega_expo = o1;
   156  	omega_ll = o2;
   157  	omega_sw = o3;
   158  	gen_prec = precomp(gen->at(0).get_val(), gen->at(1).get_val());
   159  }
   160  
   161  //returns the number of generators used, it is possible to commit up to size()-1 values
   162  long Pedersen::get_length() const{
   163  	return gen->size();
   164  }
   165  
   166  //returns a list of all generators
   167  vector<Mod_p>* Pedersen::get_gen()const{
   168  	return gen;
   169  }
   170  
   171  //Calculates the commitment to  t using randomness r
   172  Mod_p Pedersen::commit(ZZ t,  ZZ ran){
   173  
   174  	CurvePoint temp,temp_1;
   175  	ZZ mod = G.get_mod();
   176  //	cout<< "Ped commit, mod = " << mod << "t = " <<t<<" ,ran = " <<ran<< endl;
   177  //	cout<< "Ped commit, val 0  = " << gen->at(0).get_val() << endl;
   178  //	cout<< "Ped commit, val 1  = " << gen->at(1).get_val() << endl;
   179  	PowerMod(temp,gen->at(0).get_val(),ran, mod);
   180  	PowerMod(temp_1,gen->at(1).get_val(),t,mod);
   181  	MulMod(temp , temp,temp_1,mod);
   182  
   183  	return Mod_p(temp, mod);
   184  }
   185  
   186  //Calculates the commitment to the values in t using randomness r
   187  Mod_p Pedersen::commit_opt(const vector<ZZ>*  t, ZZ ran){
   188  	CurvePoint temp;
   189  	Mod_p temp_1;
   190  	long length = t->size();
   191  
   192  	if (length > (long) gen->size()) {
   193  		cout << "too many elements to commit to. Max = " << gen->size() << " Requested: " << t->size() << endl;
   194  		throw runtime_error(string("too many elements to commit to"));
   195  	}
   196  	else
   197  	{
   198  			multi_expo::expo_mult(temp, t, ran, omega_expo, gen);
   199  	}
   200  
   201  	return Mod_p(temp, G.get_mod());
   202  }
   203  
   204  
   205  //Calculates the commitment to  t using randomness r
   206  Mod_p Pedersen::commit_sw(ZZ t, ZZ ran){
   207  
   208  	CurvePoint temp;
   209  	multi_expo::multi_expo_sw(temp, ran, t, omega_sw, gen_prec);
   210  	return Mod_p(temp, G.get_mod());
   211  }
   212  
   213  void Pedersen::operator =(const Pedersen& el){
   214  	G = el.get_group();
   215  	gen = el.get_gen();
   216  }
   217  
   218  long Pedersen::to_long(vector<int>* bit_r){
   219  
   220  	long  t, length;
   221  	long i;
   222  
   223  	length =bit_r->size();
   224  	t=0;
   225  	for(i = 0; i<length; i++ ){
   226  		t = t+bit_r->at(i)*(1L << i);
   227  	}
   228  	return t;
   229  }
   230  
   231  void Pedersen::to_long(long& t, vector<int>* bit_r){
   232  
   233  	long   length;
   234  	long i;
   235  
   236  	length =bit_r->size();
   237  	t=0;
   238  	for(i = 0; i<length; i++ ){
   239  		t = t+bit_r->at(i)*(1L << i);
   240  	}
   241  }
   242  
   243  vector<vector<CurvePoint>* >* Pedersen::precomp(CurvePoint g, CurvePoint h){
   244  	vector<vector<CurvePoint>* >* pre;
   245  	vector<CurvePoint>* t_1;
   246  	vector<CurvePoint>* t_2;
   247  	CurvePoint temp_1, temp_2;
   248  	ZZ mod = G.get_mod();
   249  	long i,t;
   250  
   251  	pre = new vector<vector<CurvePoint> *>(2);
   252          t = 1L << (omega_sw-1);
   253  	t_1 = new vector<CurvePoint>(t);
   254  	t_2 = new vector<CurvePoint>(t);
   255  
   256  	temp_1 = sqr(g);
   257  	temp_2 = sqr(h);
   258  	t_1->at(0)= g;
   259  	t_2->at(0)= h;
   260  	for(i = 1; i<t; i++){
   261  		t_1->at(i)= MulMod(t_1->at(i-1),temp_1,mod);
   262  		t_2->at(i)= MulMod(t_2->at(i-1),temp_2,mod);
   263  	}
   264  
   265  	pre->at(0)= t_1;
   266  	pre->at(1)= t_2;
   267  	return pre;
   268  }