github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/StadiumForWaterCarver/src/func_ver.cpp (about) 1 /* 2 * func_ver.cpp 3 * 4 * Created on: 04.07.2012 5 * Author: stephaniebayer 6 */ 7 8 #include "func_ver.h" 9 #include<vector> 10 #include "Cipher_elg.h" 11 #include "G_q.h" 12 #include "Mod_p.h" 13 #include "ElGammal.h" 14 #include "multi_expo.h" 15 #include <fstream> 16 17 #include <time.h> 18 #include "FakeZZ.h" 19 #include "CurvePoint.h" 20 NTL_CLIENT 21 22 #include <assert.h> 23 24 extern G_q G; 25 extern G_q H; 26 extern Pedersen Ped; 27 //extern ElGammal El; 28 29 func_ver::func_ver() {} 30 31 func_ver::~func_ver() {} 32 33 void func_ver::check_Dh_op(vector<Mod_p>* c_Dh, vector<ZZ>* chal, vector<ZZ>* D_h_bar, ZZ r_Dh_bar, long win_LL, Pedersen& ped, bool& b){ 34 Mod_p t_Dh, co_Dh; 35 36 multi_expo::multi_expo_LL(t_Dh,c_Dh, chal, win_LL); 37 co_Dh = ped.commit_opt(D_h_bar,r_Dh_bar); 38 39 //cout<<"D_h "<<t_Dh<<" "<<co_Dh<<endl; 40 b = (t_Dh == co_Dh); 41 } 42 43 44 void func_ver::check_D_op(Mod_p c_D0, Mod_p c_z, vector<Mod_p>* c_A, vector<Mod_p>* c_B, vector<ZZ>* chal_1, ZZ chal_2, vector<ZZ>* A_bar, ZZ r_A_bar, long n, Pedersen& ped, bool& b){ 45 int i; 46 Mod_p t_D, co_D, temp, inv; 47 long m = c_A->size()-1; 48 ZZ ord = H.get_ord(); 49 vector<ZZ>* v_1 = new vector<ZZ>(n); 50 51 t_D = c_D0; 52 Mod_p::inv(inv, c_z); 53 for (i=1; i<m;i++){ 54 Mod_p::expo(temp,c_A->at(i),chal_2); 55 Mod_p::mult(temp, temp,c_B->at(i)); 56 Mod_p::mult(temp,temp,inv); 57 Mod_p::expo(temp, temp, chal_1->at(i-1)); 58 Mod_p::mult(t_D,t_D,temp); 59 } 60 for(i=0; i<n;i++){ 61 NegateMod(v_1->at(i),to_ZZ(1),ord); 62 } 63 temp=ped.commit_opt(v_1,to_ZZ(0)); 64 Mod_p::expo(temp, temp, chal_1->at(m-1)); 65 Mod_p::mult(t_D,t_D,temp); 66 co_D = ped.commit_opt(A_bar, r_A_bar); 67 //cout<<"D "<<t_D<<" "<<co_D<<endl; 68 delete v_1; 69 b = (t_D == co_D); 70 } 71 72 73 void func_ver::check_Ds_op(vector<Mod_p>* c_Ds, vector<Mod_p>* c_Dh, Mod_p c_Dm, vector<ZZ>* chal_1, vector<ZZ>* chal_2, vector<ZZ>* Ds_bar, ZZ r_Ds_bar, Pedersen& ped, bool& b){ 74 long i,l; 75 long m= c_Ds->size()-1; 76 Mod_p t_Ds, co_Ds, temp, temp_1; 77 78 l=m-1; 79 for(i=0; i<l; i++){ 80 Mod_p::expo(c_Ds->at(i),c_Dh->at(i), chal_1->at(i)); 81 } 82 if(m>1){ 83 Mod_p::expo(temp, c_Dh->at(1), chal_1->at(0)); 84 for(i=1;i<l; i++){ 85 Mod_p::expo(temp_1,c_Dh->at(i+1), chal_1->at(i)); 86 Mod_p::mult(temp,temp,temp_1); 87 } 88 c_Ds->at(l)=temp; 89 } 90 else{ 91 // TODO this is never called right? 92 assert(false); 93 // c_Ds->at(l)=Mod_p(1,G.get_mod()); 94 } 95 96 c_Ds->at(m)=c_Dm; 97 Mod_p::expo(t_Ds, c_Ds->at(0),chal_2->at(m-1)); 98 for(i=1; i<m; i++){ 99 Mod_p::expo(temp, c_Ds->at(i), chal_2->at(m-1-i)); 100 Mod_p::mult(t_Ds, t_Ds,temp); 101 } 102 Mod_p::mult(t_Ds,t_Ds,c_Ds->at(m)); 103 co_Ds = ped.commit_opt(Ds_bar, r_Ds_bar); 104 //cout<<"Ds "<<t_Ds<<" "<<co_Ds<<endl; 105 b = (t_Ds == co_Ds); 106 } 107 108 void func_ver::check_Dl_op(vector<Mod_p>* c_Dl, vector<ZZ>* chal, vector<ZZ>* A_bar, vector<ZZ>* Ds_bar, vector<ZZ>* chal_1, ZZ r_Dl_bar, Pedersen& ped, bool& b){ 109 long i; 110 Mod_p t_Dl, co_Dl, temp; 111 ZZ temp_1; 112 long l = c_Dl->size(); 113 long pos = (l-1)/2+1; 114 ZZ mod = G.get_mod(); 115 116 t_Dl = c_Dl->at(0); 117 for(i=1; i<l; i++){ 118 Mod_p::expo(temp, c_Dl->at(i),chal->at(i-1)); 119 //Mod_p::mult(t_Dl,t_Dl, temp); 120 t_Dl = t_Dl*temp; 121 } 122 temp_1=Functions::bilinearMap(A_bar,Ds_bar,chal_1); 123 co_Dl =ped.commit_sw(temp_1,r_Dl_bar); 124 //cout<<"Dl "<<t_Dl<<" "<<co_Dl<<endl; 125 126 temp= Mod_p(curve_zeropoint(), mod); 127 b = ((t_Dl==co_Dl) & (c_Dl->at(pos)==temp)); 128 } 129 130 131 void func_ver::check_d_op(vector<Mod_p>* c_Dh, Mod_p c_d, vector<ZZ>* chal, vector<ZZ>* d_bar, ZZ r_d_bar, Pedersen& ped, bool& b){ 132 Mod_p t_d, co_d, temp; 133 long m = c_Dh->size(); 134 Mod_p::expo(temp, c_Dh->at(m-1), chal->at(0)); 135 Mod_p::mult(t_d, temp, c_d); 136 co_d = ped.commit_opt(d_bar, r_d_bar); 137 //cout<<"d "<<t_d<<" "<<co_d<<endl; 138 b = (t_d==co_d); 139 } 140 141 142 void func_ver::check_Delta_op(Mod_p c_dh, Mod_p c_Delta, vector<ZZ>* chal, vector<ZZ>* Delta_bar, vector<ZZ>* d_bar, ZZ r_Delta_bar, ZZ chal_1, ZZ chal_2, ZZ chal_3, Pedersen& ped, bool& b){ 143 long i,j; 144 Mod_p t_Delta, co_Delta, temp; 145 ZZ t_1, t_2, t_3, prod, chal_temp; 146 ZZ ord = H.get_ord(); 147 long m = (chal->size()-1)/2; 148 long n = Delta_bar->size(); 149 vector<ZZ>* Delta_temp=0; 150 151 Mod_p::expo(temp, c_dh, chal->at(0)); 152 Mod_p::mult(t_Delta, temp, c_Delta); 153 154 Delta_temp = new vector<ZZ>(n-1); 155 t_3= chal->at(0); 156 for(i=0; i<n-1; i++){ 157 MulMod(t_1, Delta_bar->at(i), d_bar->at(i+1), ord); 158 MulMod(t_2, t_3, Delta_bar->at(i+1),ord); 159 SubMod(Delta_temp->at(i), t_2, t_1, ord); 160 } 161 162 co_Delta = ped.commit_opt(Delta_temp, r_Delta_bar); 163 164 delete Delta_temp; 165 //cout<<"Delta "<<t_Delta<<" "<<co_Delta<<endl; 166 167 prod = to_ZZ(1); 168 chal_temp =to_ZZ(1); 169 for(i=1; i<=m; i++){ 170 for(j=1; j<=n; j++){ 171 MulMod(chal_temp, chal_temp, chal_1,ord); 172 SubMod(t_1, chal_temp, chal_2,ord); 173 t_3 = n*(i-1)+j; 174 MulMod(t_3,t_3, chal_3, ord); 175 AddMod(t_1,t_1, t_3, ord); 176 MulMod(prod,prod, t_1, ord); 177 } 178 } 179 MulMod(prod, prod, chal->at(0), ord); 180 181 //cout<<"prod "<<prod<<" "<<Delta_bar->at(n-1)<<endl; 182 //cout<<d_bar->at(0)<<" "<<Delta_bar->at(0)<<endl; 183 b = false; 184 if(t_Delta ==co_Delta) 185 if((prod ==Delta_bar->at(n-1)) & (d_bar->at(0)==Delta_bar->at(0))){ 186 b = true; 187 //return 1; 188 } 189 190 //return 0; 191 } 192 193 void func_ver::fill_vector(vector<ZZ>* t){ 194 ZZ temp; 195 ZZ ord = H.get_ord(); 196 temp = RandomBnd(ord); 197 return fill_vector(t, temp); 198 } 199 200 void func_ver::fill_vector(vector<ZZ>* t, ZZ& challenge) { 201 long i,l; 202 ZZ ord = H.get_ord(); 203 l= t->size(); 204 t->at(0)=challenge; 205 for(i=1; i<l; i++){ 206 MulMod(t->at(i),t->at(i-1),challenge, ord); 207 } 208 } 209 210 void func_ver::fill_x8(vector<ZZ>* chal_x8, vector<vector<long>* >* basis_chal_x8, vector<ZZ>* mul_chal_x8, long omega, ZZ& chal){ 211 long i, l; 212 //ZZ chal; 213 ZZ ord = H.get_ord(); 214 long num_b= NumBits(ord); 215 216 l= chal_x8->size(); 217 //chal = RandomBnd(ord); 218 219 chal_x8->at(0)= chal; 220 basis_chal_x8->at(0) = multi_expo::to_basis(to_ZZ(1),num_b, omega); 221 basis_chal_x8->at(1) = multi_expo::to_basis(chal_x8->at(0),num_b, omega); 222 223 mul_chal_x8->at(0) =1; 224 mul_chal_x8->at(1) =chal_x8->at(0); 225 226 for (i = 1; i<l; i++){ 227 MulMod(chal_x8->at(i),chal, chal_x8->at(i-1), ord); 228 basis_chal_x8->at(i+1) = multi_expo::to_basis(chal_x8->at(i),num_b, omega); 229 mul_chal_x8->at(i+1) = chal_x8->at(i); 230 } 231 }