modpgrp.cpp
Go to the documentation of this file.
1 
12 #include "modpgrp.hpp"
13 #include "../field/modfield.hpp"
14 
15 using namespace arithm;
16 
17 
18 ModPGrp::ModPGrp(mpz_class ord, mpz_class add,
19  mpz_class gen, uint8_t encoding) :
20  PSubGroup(new ModField(add), ord, gen)
21 {
22  code = encoding;
23  addOrder = add;
24 }
25 
26 
28  PSubGroup(new ModField(bt->getChild(0)->toInteger()),
29  bt->getChild(1)->toInteger(),
30  bt->getChild(2)->toInteger())
31 {
32  if (!bt->isNode())
33  {
34  std::cout<<"ERROR: in ModPGrp(bt), bt is not a node. "
35  <<"\nbt=";
36  bt->prettyPrint("");
37  std::cout<<std::endl;
38  exit(1);
39  }
40  addOrder = bt->getChild(0)->toInteger();
41  code = bt->getChild(3)->toInteger().get_ui();
42 }
43 
44 
46 {
47  unsigned int length = getLeafSize();
49  res->addChild(new verifierUtils::Leaf(addOrder,length));
50  res->addChild(new verifierUtils::Leaf(multOrder,length));
51  res->addChild(new verifierUtils::Leaf(generator,length));
52  res->addChild(new verifierUtils::Leaf(code,4));
53  return res;
54 }
55 
56 
58  unsigned int n0)
59 {
60  ArrayOfElmts result;
61  unsigned int np = mpz_sizeinbase(addOrder.get_mpz_t(),2);
62  unsigned int tiLength = (np+nr)/8; // The byte length of the
63  // t_i:s
64  mpz_class ti(0);
65  mpz_class base(2),
66  modulo(0);
67  mpz_pow_ui(modulo.get_mpz_t(),
68  base.get_mpz_t(),
69  np+nr);
70  for (unsigned int i=0; i<n0; i++)
71  {
72  ti = 0;
73  for (unsigned int j=0; j<=tiLength; j++)
74  ti = ti*0x100 + prg->getNextRandByte();
75  ti = (ti % modulo);
76  // don't use ->exponentiation as 'ti' may well
77  // not be in 'field'
78  mpz_powm(ti.get_mpz_t(),
79  ti.get_mpz_t(),
80  coOrder.get_mpz_t(),
81  addOrder.get_mpz_t());
82  result.addElmt(getElmt(ti));
83  }
84  return result;
85 }
86 
87 
88 // ---------------------------------- encoding
89 
90 
91 // void ModPGrpElmt::encode0(std::vector<uint8_t> message)
92 // {
93 // if (message.size() > 3)
94 // {
95 // std::cout<<"ERROR: in ModPGrpElmt.encode0, message to "
96 // "encode too big for encoding type 0 (size: "
97 // <<message.size()<<"). Aborting."<<std::endl;
98 // exit(1);
99 // }
100 // else
101 // {
102 // cryptoTools::SHAx * H = new cryptoTools::SHA256();
103 // RingElmt * a = baseField->getGenerator();
104 // bool found = false;
105 // // Finding an element in the group that fits
106 // while (!found)
107 // {
108 // H->hash(a->toByteTree()->toVector());
109 // // testing the validity of the element
110 // if (
111 // (H->getHash()[0] % 4 == message.size())
112 // &&(H->getHash()[1] == message[0])
113 // &&(H->getHash()[2] == message[1])
114 // &&(H->getHash()[3] == message[2])
115 // )
116 // {
117 // representative = a->getRepresentative();
118 // found = true;
119 // }
120 // else
121 // a = baseField->multiplication(a,a);
122 // }
123 // }
124 // }
125 
126 
127 // void ModPGrpElmt::encode1(std::vector<uint8_t> message)
128 // {
129 // unsigned int b = (baseField->getAdditiveOrderByteSize()-2)/8 - 4;
130 // if (message.size() > b)
131 // {
132 // std::cout<<"ERROR: in ModPGrpElmt.encode1, message to "
133 // "encode too big for encoding type 1 (size: "
134 // <<message.size()<<"). Aborting."<<std::endl;
135 // exit(1);
136 // }
137 // else
138 // {
139 // uint32_t bm = message.size();
140 // std::vector<uint8_t> mPrime(b,0);
141 // if (message.size() == 0)
142 // mPrime[0] = 1;
143 // else
144 // for (unsigned int i=0; i<bm; i++)
145 // mPrime[i] = message[i];
146 // mpz_class k=bm;
147 // for (unsigned int i=0; i<mPrime.size(); i++)
148 // k = k*0x100 + mPrime[i];
149 // representative = (baseField->isInField(k))?
150 // k : baseField->getAdditiveOrder() - k;
151 // }
152 // }
153 
154 
155 
156 // void ModPGrpElmt::encode2(std::vector<uint8_t> message)
157 // {
158 // unsigned int n = baseField->getAdditiveOrderByteSize();
159 // mpz_class tBis = (baseField->getAdditiveOrder()-1)/baseField->getMultiplicativeOrder();
160 // unsigned int t = tBis.get_ui();
161 // unsigned int b = n/8 - (t/8+1) - 4;
162 // unsigned int bm= message.size();
163 // if (message.size() > b)
164 // {
165 // std::cout<<"ERROR: in ModPGrpElmt.encode2, message to "
166 // "encode too big for encoding type 2 (size: "
167 // <<message.size()<<"). Aborting."<<std::endl;
168 // exit(1);
169 // }
170 // else
171 // {
172 // mpz_class k = bm;
173 // for (unsigned int i=0; i<bm; i++)
174 // k = k*0x100 + message[i];
175 // for (unsigned int i=0; i<b-bm; i++)
176 // k = k*0x100;
177 // mpz_class pow2i = 2;
178 // mpz_pow_ui(pow2i.get_mpz_t(), pow2i.get_mpz_t(), 8*(b+4));
179 // unsigned int i=0;
180 // while (!baseField->isInField(k))
181 // k = k + i*pow2i;
182 // representative = k;
183 // }
184 // }
185 
186 
187 
188 // void ModPGrpElmt::encode(std::vector<uint8_t> message)
189 // {
190 // switch (baseField->getEncodingType()) {
191 // case 0:
192 // return encode0(message);
193 // case 1:
194 // return encode1(message);
195 // case 2:
196 // return encode2(message);
197 // default:
198 // {
199 // std::cout<<"ERROR: in ModPGrp.encode(), encoding type "
200 // "non (or badly) initialised (e="
201 // <<baseField->getEncodingType()<<")"<<std::endl;
202 // exit(1);
203 // }
204 // }
205 // }
206 
207 
208 
209 
210 // // ==================================================================
211 // // ================================================== DECODING ======
212 
213 // std::vector<uint8_t> ModPGrpElmt::decode()
214 // {
215 // switch (baseField->getEncodingType()) {
216 // case 0:
217 // return decode0();
218 // case 1:
219 // return decode1();
220 // case 2:
221 // return decode2();
222 // default:
223 // {
224 // std::cout<<"ERROR: in ModPGrp, encoding type non"
225 // <<" (or badly) initialised (e="
226 // <<baseField->getEncodingType()<<")"<<std::endl;
227 // exit(1);
228 // }
229 // }
230 // }
231 
232 
233 // std::vector<uint8_t> ModPGrpElmt::decode0()
234 // {
235 // cryptoTools::SHAx * H = new cryptoTools::SHA256();
236 // H->hash(toByteTree()->toVector());
237 // std::vector<uint8_t> hash = H->getHash();
238 // uint8_t l = hash[0] % 4;
239 // std::vector<uint8_t> message(hash.begin()+1, hash.end()+l+1);
240 // return message;
241 // }
242 
243 
244 // std::vector<uint8_t> ModPGrpElmt::decode1()
245 // {
246 // mpz_class k = (representative < baseField->getAdditiveOrder())?
247 // representative :
248 // baseField->getAdditiveOrder() - representative;
249 // unsigned int b = (baseField->getAdditiveOrderByteSize()-2)/8 - 4,
250 // l = 0;
251 // mpz_mod_2exp(k.get_mpz_t(),k.get_mpz_t(),8*(b+4));
252 // std::vector<uint8_t> bytes = verifierUtils::largeNum2byteVector(k);
253 // for (unsigned int i=0; i<bytes.size()-b; i++)
254 // l = l*0x100 + bytes[i];
255 // if ((l<0) || (l>b))
256 // l = 0;
257 // bytes.assign(bytes.begin()+bytes.size()-b,bytes.end());
258 // return bytes;
259 // }
260 
261 
262 // std::vector<uint8_t> ModPGrpElmt::decode2()
263 // {
264 // // computing b
265 // unsigned int n = baseField->getAdditiveOrderByteSize();
266 // mpz_class tBis = (baseField->getAdditiveOrder()-1)/baseField->getMultiplicativeOrder();
267 // unsigned int t = tBis.get_ui();
268 // unsigned int b = n/8 - (t/8+1) - 4;
269 // mpz_class pow2i = 2;
270 // mpz_pow_ui(pow2i.get_mpz_t(), pow2i.get_mpz_t(), 8*(b+4));
271 // mpz_class k = representative % pow2i;
272 // std::vector<uint8_t> bytes = verifierUtils::largeNum2byteVector(k);
273 // unsigned int l = 0;
274 // for (unsigned int i=0; i<bytes.size()-b; i++)
275 // l = l*0x100 + bytes[i];
276 // if ((l<0) || (l>b))
277 // l = 0;
278 // bytes.assign(bytes.begin()+bytes.size()-b,bytes.end());
279 // return bytes;
280 // }