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

     1  /*
     2   * func_pro.cpp
     3   *
     4   *  Created on: 05.07.2012
     5   *      Author: stephaniebayer
     6   */
     7  
     8  #include "func_pro.h"
     9  #include "Cipher_elg.h"
    10  #include "G_q.h"
    11  #include "Mod_p.h"
    12  #include "Functions.h"
    13  #include "ElGammal.h"
    14  #include "multi_expo.h"
    15  #include <stdio.h>
    16  #include <time.h>
    17  #include <vector>
    18  #include <fstream>
    19  
    20  #include "FakeZZ.h"
    21  NTL_CLIENT
    22  
    23  extern G_q G;
    24  extern G_q H;
    25  /*extern ElGammal El;
    26  extern double time_rw_p;
    27  extern double time_cm;
    28  extern long mu;
    29  extern long mu_h;
    30  extern long m_r;*/
    31  
    32  func_pro::func_pro() {}
    33  
    34  func_pro::~func_pro() {}
    35  
    36  
    37  //Generates a matrix, containing the values 1 to N ordered
    38  void func_pro::set_X(vector<vector<ZZ>*>* X, long m,  long n){
    39  	long i,j, val;
    40  	vector<ZZ>* r = 0;
    41  	val =1;
    42  	for (i=0; i<m; i++ ){
    43  		r = new vector<ZZ>(n);
    44  		for(j=0; j<n; j++){
    45  			r->at(j)=val;
    46  			val++;
    47  		}
    48  		X->at(i)=r;
    49  	}
    50  
    51  }
    52  
    53  //Permutes the matrix X regarding the permutation pi, to set the matrix A
    54  void func_pro::set_A(vector<vector<ZZ>*>* A,  vector<vector<vector<long>* >* >* pi, long m, long n){
    55  	long i,j,  row, col;
    56  	vector<vector<ZZ>* >* X=0;
    57  	//Creates the matrixs X, containing 1 to N
    58  	X= new vector<vector<ZZ>* >(m);
    59  	set_X(X, m,n);
    60  
    61  	string name = "example.txt";
    62  /*	ofstream ost;
    63  	ost.open(name.c_str(),ios::app);
    64  	ost<<"matrix A "<<endl;*/
    65  	vector<ZZ>* r;
    66  	for (i=0; i<m; i++ ){
    67  		r = new vector<ZZ>(n);
    68  		for(j=0; j<n; j++){
    69  			row = pi->at(i)->at(j)->at(0);
    70  			col = pi->at(i)->at(j)->at(1);
    71  			r->at(j)=X->at(row)->at(col);
    72  		//	ost<<r->at(j)<<" ";
    73  		}
    74  	//	ost<<endl;
    75  		A->at(i)=r;
    76  	}
    77  	Functions::delete_vector(X);
    78  
    79  }
    80  
    81  void func_pro::set_x2(vector<vector<ZZ>* >* chal_x2, ZZ x2, long m, long n){
    82  	vector<ZZ>* r= 0;
    83  	ZZ temp;
    84  	long i,j;
    85  	ZZ ord = G.get_ord();
    86  
    87  	string name = "example.txt";
    88  /*	ofstream ost;
    89  	ost.open(name.c_str(),ios::app);
    90  	ost<<"matrix X, challenges to power "<<endl;*/
    91  	temp = to_ZZ(1);
    92  	for (i = 0; i<m; i++){
    93  		r = new vector<ZZ>(n);
    94  		for(j = 0; j<n;j++){
    95  			MulMod(temp, temp,x2,ord);
    96  			r->at(j)=temp;
    97  		//	ost<<temp<<" ";
    98  		}
    99  		//ost<<endl;
   100  		chal_x2->at(i) = r;
   101  	}
   102  
   103  }
   104  
   105  void func_pro::set_B_op(vector<vector<ZZ>* >* B, vector<vector<vector<long>* >* >* basis_B,
   106   vector<vector<ZZ>* >* chal_x2,vector<vector<vector<long>* >*>* pi, long omega_mulex){
   107  	long i,j;
   108  	long row, col;
   109  	vector<ZZ>* r =0;
   110  	vector<vector<long>* >* basis_vec = 0;
   111  	long num_b =NumBits(G.get_ord());
   112  	long m = B->size();
   113  	long n = pi->at(0)->size();
   114  
   115  	//permute the exponents in s using the permutation  pi
   116  	for (i=0; i<m; i++ ){
   117  		r = new vector<ZZ>(n);
   118  
   119  		basis_vec =  new vector<vector<long>* >(n);
   120  		for(j=0; j<n; j++){
   121  			row = pi->at(i)->at(j)->at(0);
   122  			col = pi->at(i)->at(j)->at(1);
   123  			r->at(j)=chal_x2->at(row)->at(col);
   124  			basis_vec->at(j) = multi_expo::to_basis(r->at(j), num_b, omega_mulex);
   125  		}
   126  		B->at(i) = r;
   127  		basis_B->at(i)=basis_vec;
   128  	}
   129  
   130  }
   131  
   132  void func_pro::set_B(vector<vector<ZZ>* >* B, vector<vector<ZZ>* >* chal_x2, 
   133   vector<vector<vector<long>* >*>* pi){
   134  	long i,j;
   135  	long row, col;
   136  	vector<ZZ>* r =0;
   137  	long m = B->size();
   138  	long n = pi->at(0)->size();
   139  
   140  	//permute the exponents in s using the permutation  pi
   141  	string name = "example.txt";
   142  /*	ofstream ost;
   143  	ost.open(name.c_str(),ios::app);
   144  	ost<<"matrix B, permuted challenges "<<endl;*/
   145  	for (i=0; i<m; i++ ){
   146  		r = new vector<ZZ>(n);
   147  
   148  		for(j=0; j<n; j++){
   149  			row = pi->at(i)->at(j)->at(0);
   150  			col = pi->at(i)->at(j)->at(1);
   151  			r->at(j)=chal_x2->at(row)->at(col);
   152  		//	ost<<r->at(j)<<" ";
   153  		}
   154  	//	ost<<endl;
   155  		B->at(i) = r;
   156  	}
   157  
   158  }
   159  
   160  void func_pro::set_D(vector<vector<ZZ>* >* D, vector<vector<ZZ>* >* A, vector<vector<ZZ>* >* B, ZZ chal_z4, ZZ chal_y4){
   161  	long i, j;
   162  	vector<ZZ>* row;
   163  	ZZ temp, temp_1;
   164  	ZZ ord = G.get_ord();
   165  	long m = A->size();
   166  	long n = A->at(0)->size();
   167  
   168  	string name = "example.txt";
   169  /*	ofstream ost;
   170  	ost.open(name.c_str(),ios::app);
   171  	ost<<"set vector D = yA_ij +B_ij "<<endl;*/
   172  	for (i= 0; i<m; i++){
   173  		row = new vector<ZZ>(n);
   174  		for (j = 0; j<n; j++){
   175  			MulMod(temp, chal_y4,A->at(i)->at(j),ord);
   176  			SubMod(temp_1, B->at(i)->at(j), chal_z4,ord);
   177  			AddMod(row->at(j),temp ,temp_1, ord);
   178  		//	ost<<temp<<" ";
   179  		}
   180  		//ost<<endl;
   181  		D->at(i)= row;
   182  	}
   183  
   184  	Functions::delete_vector(A);
   185  }
   186  
   187  void func_pro::set_D_h(vector<vector<ZZ>* >* D_h, vector<vector<ZZ>* >* D){
   188  	long i;
   189  	vector<ZZ>* row;
   190  	long m = D_h->size();
   191  	long n = D->at(0)->size();
   192  	row = new vector<ZZ>(n);
   193  	string name = "example.txt";
   194  /*	ofstream ost;
   195  	ost.open(name.c_str(),ios::app);
   196  	ost<<"Hadamard products over D, 1 row = D_0, D_0�D_1,... "<<endl;*/
   197  	for(i=0; i<n; i++){
   198  		row->at(i)=D->at(0)->at(i);
   199  	//	ost<<row->at(i)<<" ";
   200  	}
   201  	D_h->at(0)=row;
   202  	for( i=1; i<m;i++){
   203  		row = new vector<ZZ>(n);
   204  		Functions::Hadamard(row, D_h->at(i-1),D->at(i));
   205  		D_h->at(i)=row;
   206  	//	ost<<endl;
   207  	/*	for(j=0; j<n; j++){
   208  			ost<<D_h->at(i)->at(j)<<" ";
   209  		}*/
   210  	}
   211  //	ost<<endl;
   212  
   213  }
   214  
   215  void func_pro::commit_B0_op(vector<ZZ>* B_0, vector<vector<long>* >* basis_B0, ZZ &r_B0, Mod_p &c_B0, long omega_mulex, Pedersen& ped){
   216  	long i,num_b;
   217  	ZZ ord= H.get_ord();
   218  	long n = B_0->size();
   219  
   220  	num_b = NumBits(ord);
   221  	r_B0  =  RandomBnd(ord);
   222  	for (i = 0; i<n; i++){
   223  		B_0 ->at(i) = RandomBnd(ord);
   224  		basis_B0->at(i)= multi_expo::to_basis(B_0->at(i), num_b, omega_mulex);
   225  	}
   226  
   227  	c_B0 = ped.commit_opt(B_0, r_B0);
   228  
   229  }
   230  
   231  void func_pro::set_Rb(vector<vector<ZZ>* >* B, vector<vector<ZZ>*>* R, ZZ &R_b){
   232  	long i,j;
   233  	ZZ temp;
   234  	ZZ ord = H.get_ord();
   235  	long m = B->size();
   236  	long n = B->at(0)->size();
   237  
   238  	string name = "example.txt";
   239  /*	ofstream ost;
   240  	ost.open(name.c_str(),ios::app);
   241  	ost<<"R_b =sum sum r_ij*B_ij  ";*/
   242  	R_b = 0;
   243  	for (i = 0; i<m; i++){
   244  		for (j = 0; j<n; j++){
   245  			MulMod(temp, B->at(i)->at(j),R->at(i)->at(j), ord);
   246  			AddMod(R_b,R_b, temp ,ord);
   247  		}
   248  	}
   249  	//ost<<R_b<<endl;
   250  }
   251  
   252  
   253  void func_pro::commit_a_op(vector<ZZ>* a, vector<ZZ>* r_a, vector<Mod_p>* c_a, Pedersen& ped){
   254  	long i,l;
   255  	ZZ ord = H.get_ord();
   256  	long m = a->size()/2;
   257  
   258  	for(i= 0; i<m; i++){
   259  		a->at(i) = RandomBnd(ord);
   260  		r_a->at(i) = RandomBnd(ord);
   261  		c_a->at(i) = ped.commit_sw(a->at(i),r_a->at(i));
   262  	}
   263  	a->at(m) = to_ZZ(0);
   264  	r_a->at(m) = to_ZZ(0);
   265  	c_a->at(m) = ped.commit_sw(a->at(m),r_a->at(m));
   266  	l= 2*m;
   267  	for(i= m+1; i<l; i++){
   268  		a->at(i) = RandomBnd(ord);
   269  		r_a->at(i) = RandomBnd(ord);
   270  		c_a->at(i) = ped.commit_sw(a->at(i),r_a->at(i));
   271  	}
   272  }
   273  
   274  void func_pro::set_D_s(vector<vector<ZZ>* >* D_s, vector<vector<ZZ>* >* D_h, vector<vector<ZZ>* >* D, vector<ZZ>* chal, ZZ & r_Dl_bar){
   275  	long i, j, l;
   276  	ZZ temp;
   277  	ZZ ord = H.get_ord();
   278  	vector<ZZ>* row=0;
   279  	vector<ZZ>* Ds_temp=0;
   280  	long m = D_h->size();
   281  	long n = D_h->at(0)->size();
   282  	l=m-1;
   283  /*	string name = "example.txt";
   284  	ofstream ost;
   285  	ost.open(name.c_str(),ios::app);*/
   286  	for(i=0; i<l; i++){
   287  		temp=chal->at(i);
   288  		row = new vector<ZZ>(n);
   289  		for(j=0; j<n; j++){
   290  			MulMod(row->at(j),temp, D_h->at(i)->at(j), ord );
   291  		//	ost<<row->at(j)<<" ";
   292  		}
   293  		D_s->at(i)=row;
   294  		//ost<<endl;
   295  	}
   296  	Ds_temp = new vector<ZZ>(n);
   297  	for(i=0; i<n;i++){
   298  		Ds_temp->at(i)=0;
   299  	}
   300  	for(i=0; i<l; i++){
   301  		temp = chal->at(i);
   302  		for(j=0; j<n; j++){
   303  			MulMod(r_Dl_bar,temp, D_h->at(i+1)->at(j),ord);
   304  			AddMod(Ds_temp->at(j),Ds_temp->at(j),r_Dl_bar,ord);
   305  		//	ost<<Ds_temp->at(j)<<" ";
   306  		}
   307  	}
   308  	//l=m-1
   309  	D_s->at(l)=Ds_temp;
   310  	//ost<<endl;
   311  
   312  	row = new vector<ZZ>(n);
   313  	for(i=0; i<n; i++){
   314  		row->at(i)=RandomBnd(ord);
   315  		//ost<<row->at(i)<<" ";
   316  		D->at(0)->at(i) = RandomBnd(ord);
   317  	}
   318  	D_s->at(m)=row;
   319  //	ost<<endl;
   320  /*	ost<<"D(0) ist "<<endl;
   321  	for(i=0; i<n; i++){
   322  		ost<<D->at(0)->at(i)<<" ";
   323  	}
   324  	ost<<endl;*/
   325  }
   326  
   327  void func_pro::commit_Dl_op(vector<Mod_p>* c_Dl, vector<ZZ>* Dl, vector<ZZ>* r_Dl, vector<vector<ZZ>* >* D, vector<vector<ZZ>* >* D_s, vector<ZZ>* chal, Pedersen& ped){
   328  	long i,j,l, len;
   329  	ZZ temp;
   330  	ZZ ord = H.get_ord();
   331  	long m = D->size()-1;
   332  
   333  	//Calculate the D_l's
   334  	len = 2*m+1;
   335  	for (l=0; l<len; l++){
   336  		temp =0;
   337  		for (i = 0; i<=m; i++){
   338  			j = m+i-l;
   339  			if ((j>=0) & (j<=m)){
   340  				AddMod(temp,temp,Functions::bilinearMap(D->at(i), D_s->at(j), chal), ord);
   341  			}
   342  		}
   343  		Dl->at(l) = temp;
   344  	}
   345  
   346  	//Commits to the Dls
   347  	for (i=0; i<len;i++){
   348  		r_Dl->at(i) =  RandomBnd(ord);
   349  	}
   350  	r_Dl->at(m+1)=0;
   351  
   352  	for(l = 0; l<len; l++){
   353  		c_Dl->at(l)= ped.commit_sw(Dl->at(l),r_Dl->at(l));
   354  	}
   355  
   356  }
   357  
   358  void func_pro::commit_d_op(vector<ZZ>* d, ZZ &r_d, Mod_p& c_d, Pedersen& ped){
   359  	long i;
   360  	ZZ ord = H.get_ord();
   361  	long n=d->size();
   362  
   363  	for(i=0; i<n; i++){
   364  		d->at(i)=RandomBnd(ord);
   365  	}
   366  
   367  	Functions::commit_op(d, r_d, c_d, ped);
   368  }
   369  
   370  void func_pro::commit_Delta_op(vector<ZZ>* Delta, vector<ZZ>* d, ZZ &r_Delta, Mod_p &c_Delta, Pedersen& ped){
   371  	long i,l;
   372  	ZZ temp;
   373  	ZZ ord = H.get_ord();
   374  	vector<ZZ>* Delta_temp;
   375  	long n = Delta->size();
   376  
   377  	for(i=0; i<n; i++){
   378  		Delta->at(i)=RandomBnd(ord);
   379  	}
   380  	Delta->at(0)=d->at(0);
   381  	Delta->at(n-1)=0;
   382  
   383  	l=n-1;
   384  	Delta_temp= new vector<ZZ>(n-1);
   385  	for(i=0; i<l; i++){
   386  		MulMod(temp, Delta->at(i), d->at(i+1),ord);
   387  		NegateMod(Delta_temp->at(i), temp, ord);
   388  	}
   389  
   390  	Functions::commit_op(Delta_temp, r_Delta, c_Delta, ped);
   391  
   392  	delete Delta_temp;
   393  }
   394  
   395  void func_pro::commit_d_h_op(vector<vector<ZZ>* >* D_h, vector<ZZ>* d_h, vector<ZZ>* d, vector<ZZ>* Delta, ZZ & r_d_h, Mod_p &c_d_h, Pedersen& ped){
   396  	long i,l;
   397  	ZZ temp, temp_1;
   398  	ZZ ord = G.get_ord();
   399  	long m = D_h->size();
   400  	long n = d_h->size();
   401  
   402  	//setting the vectors to prove the product
   403  	d_h->at(0) = D_h->at(m-1)->at(0);
   404  	for(i=1;i<n;i++){
   405  		MulMod(d_h->at(i), d_h->at(i-1), D_h->at(m-1)->at(i), ord);
   406  	}
   407  
   408  	l=n-1;
   409  	vector<ZZ>* d_h_temp = new vector<ZZ>(l);
   410  	for(i=0; i<l; i++){
   411  		MulMod(temp, d_h->at(i), d->at(i+1), ord);
   412  		MulMod(temp_1, D_h->at(m-1)->at(i+1),Delta->at(i),ord);
   413  		SubMod(temp_1, Delta->at(i+1), temp_1, ord);
   414  		SubMod(d_h_temp->at(i), temp_1, temp, ord);
   415  	}
   416  
   417  	Functions::commit_op(d_h_temp, r_d_h, c_d_h, ped);
   418  
   419  	delete d_h_temp;
   420  }
   421  
   422  void func_pro::calculate_B_bar(vector<ZZ>* B_0, vector<vector<ZZ>* >* B, vector<ZZ>* chal, vector<ZZ>* B_bar){
   423  	long i,j;
   424  	ZZ temp, temp_1;
   425  	ZZ ord = G.get_ord();
   426  	long m = B->size();
   427  	long n = B_0->size();
   428  /*	string name = "example.txt";
   429  	ofstream ost;
   430  	ost.open(name.c_str(),ios::app);
   431  ost<<"B_bar ";*/
   432  	for (j = 0; j<n; j++){
   433  		temp= B_0->at(j);
   434  		for (i = 0; i<m; i++){
   435  			 MulMod(temp_1, B->at(i)->at(j),chal->at(i), ord);
   436  			AddMod(temp, temp ,temp_1, ord);
   437  		}
   438  		B_bar->at(j) = temp;
   439  		//		ost<<temp<<" ";
   440  	}
   441  	//	ost<<endl;
   442  }
   443  
   444  void func_pro::calculate_r_B_bar(vector<ZZ>* r_B, vector<ZZ>* chal, ZZ r_B0, ZZ &r_B_bar){
   445  	long i;
   446  	ZZ temp;
   447  	ZZ ord = H.get_ord();
   448  	long m = r_B->size();
   449  	r_B_bar = r_B0;
   450  
   451  /*	string name = "example.txt";
   452  	ofstream ost;
   453  	ost.open(name.c_str(),ios::app);
   454  	ost<<"r_B_bar ";*/
   455  	for (i = 0; i<m; i++){
   456  		MulMod(temp, r_B->at(i), chal->at(i), ord);
   457  		AddMod( r_B_bar, r_B_bar , temp, ord);
   458  	}
   459  	//	ost<<r_B_bar<<endl;
   460  }
   461  
   462  void func_pro::calculate_a_bar(vector<ZZ>* a, vector<ZZ>* chal, ZZ & a_bar){
   463  	long i;
   464  	ZZ temp;
   465  	ZZ ord = G.get_ord();
   466  	long m = a->size();
   467  
   468  /*	string name = "example.txt";
   469  	ofstream ost;
   470  	ost.open(name.c_str(),ios::app);
   471  	ost<<"c_bar ";*/
   472  	a_bar = a->at(0);
   473  	for (i = 1; i<m; i++){
   474  		MulMod(temp, a->at(i),chal->at(i-1), ord);
   475  		AddMod(a_bar,a_bar, temp, ord);
   476  	}
   477  //	ost<<a_bar<<endl;
   478  }
   479  
   480  void func_pro::calculate_r_a_bar(vector<ZZ>* r_a, vector<ZZ>* chal, ZZ & r_a_bar){
   481  	long i;
   482  	ZZ temp;
   483  	ZZ ord = G.get_ord();
   484  	long m = r_a->size();
   485  
   486  	r_a_bar= r_a->at(0);
   487  	for (i = 1; i<m; i++){
   488  		MulMod(temp, r_a->at(i),chal->at(i-1), ord);
   489  		AddMod(r_a_bar,r_a_bar,temp, ord);
   490  	}
   491  /*	string name = "example.txt";
   492  	ofstream ost;
   493  	ost.open(name.c_str(),ios::app);
   494  	ost<<"r_a_bar "<<r_a_bar<<endl;*/
   495  }
   496  
   497  void func_pro::calculate_rho_a_bar(vector<ZZ>* rho_a, vector<ZZ>* chal, ZZ & rho_a_bar){
   498  	long i;
   499  	ZZ temp;
   500  	ZZ ord = G.get_ord();
   501  	long m = rho_a->size();
   502  
   503  	rho_a_bar = rho_a->at(0);
   504  	for (i = 1; i<m; i++){
   505  		MulMod (temp,rho_a->at(i),chal->at(i-1),ord);
   506  		AddMod(rho_a_bar, rho_a_bar, temp, ord);
   507  	}
   508  /*	string name = "example.txt";
   509  	ofstream ost;
   510  	ost.open(name.c_str(),ios::app);
   511  	ost<<"r_a_bar "<<rho_a_bar<<endl;*/
   512  }
   513  
   514  
   515  void func_pro::calculate_D_h_bar(vector<ZZ>* D_h_bar, vector<vector<ZZ>* >* D_h, vector<ZZ>* chal){
   516  	long i,j;
   517  	ZZ temp, temp_1;
   518  	ZZ ord = G.get_ord();
   519  	long m = D_h->size();
   520  	long n = D_h_bar->size();
   521  /*	string name = "example.txt";
   522  	ofstream ost;
   523  	ost.open(name.c_str(),ios::app);
   524  ost<<"D_h_bar ";*/
   525  	for (j = 0; j<n;j++){
   526  		D_h_bar->at(j) =  D_h->at(0)->at(j);
   527  	}
   528  	for(i = 1; i<m; i++){
   529  		temp= chal->at(i-1);
   530  		for (j = 0; j<n;j++){
   531  			MulMod(temp_1,temp,D_h->at(i)->at(j),ord);
   532  			AddMod(D_h_bar->at(j), D_h_bar->at(j),temp_1, ord);
   533  		}
   534  	}/*
   535  	for(i=0; i<n; i++){
   536  		ost<<D_h_bar->at(i)<<" ";
   537  	}
   538  	ost<<endl;*/
   539  }
   540  
   541  void func_pro::calculate_r_Dh_bar(vector<ZZ>* r_D_h, vector<ZZ>* chal, ZZ & r_Dh_bar ){
   542  	long i;
   543  	ZZ temp;
   544  	ZZ ord = G.get_ord();
   545  	long m = r_D_h->size();
   546  
   547  	r_Dh_bar= r_D_h->at(0);
   548  	for (i = 1;i<m;i++){
   549  		MulMod(temp,chal->at(i-1),r_D_h->at(i),ord);
   550  		AddMod(r_Dh_bar,r_Dh_bar, temp,ord);
   551  	}
   552  /*	string name = "example.txt";
   553  	ofstream ost;
   554  	ost.open(name.c_str(),ios::app);
   555  	ost<<"r_Dh_bar "<<r_Dh_bar<<endl;*/
   556  }
   557  
   558  void func_pro::calculate_dbar_rdbar(vector<vector<ZZ>* >* D_h, vector<ZZ>* chal, vector<ZZ>* d_bar, vector<ZZ>* d, vector<ZZ>* r_D_h, ZZ r_d, ZZ & r_d_bar){
   559  	long i;
   560  	ZZ temp, temp_1;
   561  	ZZ ord = G.get_ord();
   562  	long m = D_h->size();
   563  	long n = d_bar->size();
   564  
   565  /*	string name = "example.txt";
   566  	ofstream ost;
   567  	ost.open(name.c_str(),ios::app);*/
   568  	temp_1 = chal->at(0);
   569  	//	ost<<"d_bar ";
   570  	for(i=0; i<n; i++){
   571  		MulMod(temp, temp_1, D_h->at(m-1)->at(i), ord);
   572  		AddMod(d_bar->at(i), temp, d->at(i), ord);
   573  		//		ost<<d_bar->at(i)<<" ";
   574  	}
   575  	//ost<<endl;
   576  	MulMod(temp, temp_1, r_D_h->at(m-1), ord);
   577  	AddMod(r_d_bar, temp, r_d,ord);
   578  	//ost<<"r_d_bar "<<r_d_bar<<endl;
   579  }
   580  
   581  void func_pro::calculate_Deltabar_rDeltabar(vector<ZZ>* d_h, vector<ZZ>* chal, vector<ZZ>* Delta_bar, vector<ZZ>* Delta, ZZ r_d_h, ZZ r_Delta, ZZ & r_Delta_bar){
   582  	long i;
   583  	ZZ temp, temp_1;
   584  	ZZ ord = G.get_ord();
   585  	long n = Delta_bar->size();
   586  
   587  /*	string name = "example.txt";
   588  	ofstream ost;
   589  	ost.open(name.c_str(),ios::app);*/
   590  	temp_1 = chal->at(0);
   591  	//ost<<"Delta_bar ";
   592  	for(i = 0; i<n; i++){
   593  		MulMod(temp, temp_1, d_h->at(i), ord);
   594  		AddMod(Delta_bar->at(i),temp, Delta->at(i), ord);
   595  		//	ost<<Delta_bar->at(i)<<" ";
   596  	}
   597  
   598  	//	ost<<endl;
   599  	MulMod(temp, temp_1, r_d_h,ord);
   600  	AddMod(r_Delta_bar, temp, r_Delta, ord);
   601  	//	ost<<"r_delta_bar "<<r_Delta_bar<<endl;
   602  }
   603  
   604  void func_pro::calculate_A_bar(vector<vector<ZZ>* >* D, vector<ZZ>* A_bar, vector<ZZ>* chal){
   605  	long i,j;
   606  	ZZ ord = G.get_ord();
   607  	ZZ temp, temp_1;
   608  	long m = D->size()-1;
   609  	long n = A_bar->size();
   610  
   611  /*	string name = "example.txt";
   612  	ofstream ost;
   613  	ost.open(name.c_str(),ios::app);
   614  	ost<<"A_bar ";*/
   615  	for (i = 0; i<n;i++){
   616  		A_bar->at(i)= D->at(0)->at(i);
   617  	}
   618  	for (i= 1; i<=m; i++){
   619  		temp=chal->at(i-1);
   620  		for (j = 0; j<n;j++){
   621  			MulMod(temp_1,D->at(i)->at(j),temp,ord);
   622  			AddMod(A_bar->at(j), A_bar->at(j) ,temp_1,ord);
   623  		}
   624  	}
   625  /*	for(i=0; i<n; i++){
   626  		ost<<A_bar->at(i)<<" ";
   627  	}
   628  	ost<<endl;*/
   629  }
   630  
   631  void func_pro::calculate_D_s_bar(vector<vector<ZZ>* >* D_s, vector<ZZ>* D_s_bar, vector<ZZ>* chal){
   632  	long i,j;
   633  	ZZ ord = G.get_ord();
   634  	ZZ temp, temp_1;
   635  	long m = D_s->size()-1;
   636  	long n = D_s_bar->size();
   637  
   638  	temp = chal->at(m-1);
   639  	for (i = 0; i<n;i++){
   640  		MulMod(D_s_bar->at(i), D_s->at(0)->at(i),temp,ord);
   641  	}
   642  	for (i= 1; i< m; i++){
   643  		temp=chal->at(m-i-1);
   644  		for (j = 0; j<n;j++){
   645  			 MulMod( temp_1, D_s->at(i)->at(j),temp,ord);
   646  			 AddMod(D_s_bar->at(j), D_s_bar->at(j),temp_1,ord);
   647  		}
   648  	}
   649  /*	string name = "example.txt";
   650  	ofstream ost;
   651  	ost.open(name.c_str(),ios::app);
   652  	ost<<"D_s_bar ";*/
   653  	for (i = 0; i<n; i++){
   654  		AddMod(D_s_bar->at(i),D_s_bar->at(i),D_s->at(m)->at(i),ord);
   655  		//		ost<<D_s_bar->at(i)<<" ";
   656  	}
   657  	//	ost<<endl;
   658  }
   659  
   660  void func_pro::calculate_r_A_bar(ZZ r_D0, vector<ZZ>* r_A, vector<ZZ>* r_B, vector<ZZ>* chal, ZZ r_z, ZZ chal_y4, ZZ & r_A_bar){
   661  	long i;
   662  	ZZ ord = G.get_ord();
   663  	ZZ temp, temp_1;
   664  	long m = r_A->size()-1;
   665  
   666  	r_A_bar=r_D0;
   667  	for (i = 1; i<m;i++){
   668  		MulMod(temp,chal_y4,r_A->at(i),ord);
   669  		SubMod(temp_1,r_B->at(i),r_z,ord);
   670  		AddMod(temp,temp,temp_1 ,ord );
   671  		MulMod(temp,temp , chal->at(i-1),ord);
   672  		AddMod(r_A_bar, r_A_bar,temp,ord);
   673  	}
   674  	MulMod(temp,r_A->at(m),chal->at(m-1),ord);
   675  	AddMod(r_A_bar,r_A_bar ,temp,ord);
   676  /*	string name = "example.txt";
   677  	ofstream ost;
   678  	ost.open(name.c_str(),ios::app);
   679  	ost<<"r_A_bar "<<r_A_bar<<endl;*/
   680  }
   681  
   682  void func_pro::calculate_r_Ds_bar(vector<ZZ>* r_D_h,  vector<ZZ>* chal_1, vector<ZZ>* chal_2, ZZ & r_Ds_bar, ZZ r_Dm){
   683  	long i,l;
   684  	ZZ ord = G.get_ord();
   685  	ZZ temp, temp_1;
   686  	long m = r_D_h->size();
   687  	vector<ZZ>* r_D_s = new vector<ZZ>(m);
   688  
   689  	l=m-1;
   690  	for(i=0; i<l; i++){
   691  		MulMod(r_D_s->at(i),r_D_h->at(i),chal_1->at(i),ord);
   692  	}
   693  	temp_1=0;
   694  	for(i=0; i<l; i++){
   695  		MulMod(temp, chal_1->at(i), r_D_h->at(i+1),ord);
   696  		AddMod(temp_1,temp_1,temp,ord);
   697  	}
   698  	r_D_s->at(l)=temp_1;
   699  
   700  	MulMod(r_Ds_bar,r_D_s->at(0),chal_2->at(l),ord);
   701  	for (i = 1; i<m;i++){
   702  		MulMod(temp, r_D_s->at(i) , chal_2->at(m-i-1),ord);
   703  		AddMod(r_Ds_bar, r_Ds_bar,temp,ord);
   704  	}
   705  	AddMod (r_Ds_bar, r_Ds_bar, r_Dm,ord);
   706  /*	string name = "example.txt";
   707  	ofstream ost;
   708  	ost.open(name.c_str(),ios::app);
   709  ost<<"r_Ds_bar "<<r_Ds_bar<<endl;*/
   710  	delete r_D_s;
   711  }
   712  
   713  void func_pro::calculate_r_Dl_bar(vector<ZZ>* r_C, vector<ZZ>* chal, ZZ &r_Dl_bar){
   714  	long i;
   715  	ZZ ord = G.get_ord();
   716  	ZZ temp;
   717  	long m = r_C->size();
   718  
   719  	r_Dl_bar = r_C->at(0);
   720  	for (i = 1; i<m;i++){
   721  		MulMod(temp,r_C->at(i) , chal->at(i-1),ord);
   722  		AddMod(r_Dl_bar, r_Dl_bar,temp,ord);
   723  	}
   724  /*	string name = "example.txt";
   725  	ofstream ost;
   726  	ost.open(name.c_str(),ios::app);
   727  	ost<<"r_Dl_bar"<<r_Dl_bar<<endl;*/
   728  }