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 }