]> AND Private Git Repository - Cipher_code.git/blob - OneRoundHash/oneroundhash.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
new
[Cipher_code.git] / OneRoundHash / oneroundhash.cpp
1 //gcc pixmap_io.c  -c 
2 //g++ -O3 one_round_new.cpp pixmap_io.o  -o one_round_new -std=c++11   
3
4 #include <iostream>
5 #include <list>
6 #include<math.h>
7 #include<stdlib.h>
8 #include<stdio.h>
9 #include<string.h>
10 #include <fstream>
11 #include <sys/time.h>
12 #include <glib.h>
13
14
15 /*#include <cryptopp/hex.h>
16 #include <cryptopp/sha.h>
17 #include <cryptopp/osrng.h>
18 #include <cryptopp/secblock.h>
19 */
20
21
22 extern "C" {
23   int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data);
24   void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height);
25 }
26
27
28 //using namespace CryptoPP;
29 using namespace std;
30
31
32 int key_size=256;
33 int nb_test=1;
34 int v1b=0;
35 int v2b1=0;
36 int v2b2=0;
37 int v2b3=0;
38
39
40
41
42 typedef __uint64_t mylong;
43
44
45 typedef unsigned char   uchar;
46
47
48 double TimeStart()
49 {
50   struct timeval tstart;
51   gettimeofday(&tstart,0);
52   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
53 }
54
55 double TimeStop(double t)
56 {
57   struct timeval tend;
58
59   gettimeofday(&tend,0);
60   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
61   return (t);
62 }
63
64
65
66
67 uint xorshift32(const uint t)
68 {
69   /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
70   uint x = t;
71   x ^= x << 13;
72   x ^= x >> 17;
73   x ^= x << 5;
74   return x;
75 }
76
77
78 mylong xorseed;
79
80 mylong xorshift64()
81 {
82         /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */
83         mylong x = xorseed;
84         x ^= x >> 12; // a
85         x ^= x << 25; // b
86         x ^= x >> 27; // c
87
88
89         return xorseed=x;
90 }
91
92 /*
93 __uint128_t g_lehmer64_state;
94
95 inline uint64_t splitmix64_stateless(uint64_t index) {
96   uint64_t z = (index + UINT64_C(0x9E3779B97F4A7C15));
97   z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9);
98   z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB);
99   return z ^ (z >> 31);
100 }
101
102
103 inline void lehmer64_seed(uint64_t seed) {
104   g_lehmer64_state = (((__uint128_t)splitmix64_stateless(seed)) << 64) +
105                      splitmix64_stateless(seed + 1);
106 }
107
108 inline uint64_t lehmer64() {
109   g_lehmer64_state *= UINT64_C(0xda942042e4dd58b5);
110   ;
111   return g_lehmer64_state >> 64;
112 }
113
114 */
115
116
117
118 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
119
120   for(int i=0;i<size_tab;i++) {
121     inv_perm_tabs[tab[i]] = i;
122   }
123
124 }
125
126 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
127
128   for(int i=0;i<size_tab;i++) {
129     inv_perm_tabs[tab[i]] = i;
130   }
131
132 }
133
134
135
136 void rc4key(uchar *key, uchar *sc, int size_DK) {
137
138   for(int i=0;i<256;i++) {
139     sc[i]=i;
140   }
141
142
143   uchar j0 = 0;
144   for(int i0=0; i0<256; i0++) {
145     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
146     uchar tmp = sc[i0];
147     sc[i0] = sc[j0 ];
148     sc[j0] = tmp;
149   }
150 }
151
152
153
154 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
155
156   //sc=1:len;
157
158
159   
160   for (int i=0;i<len;i++) {
161     sc[i]=i;
162   }
163   for (int it = 0; it < rp; it++) {
164     int j0 = 1;
165     for(int i0 = 0; i0<len; i0++) {
166       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
167       int tmp = sc[i0];
168       sc[i0] = sc[j0];
169       sc[j0] = tmp;
170     }
171
172   }
173 }
174
175 void prga(uchar *sc, int ldata, uchar *r) {
176   uchar i0=0;
177   uchar j0=0;
178
179   for (int it=0; it<ldata; it++) {
180     i0 = ((i0+1)%255);
181     j0 = (j0 + sc[i0])&0xFF;
182     uchar tmp = sc[i0];
183     sc[i0] = sc[j0];
184     sc[j0] = tmp;
185     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
186   }
187 }
188
189
190
191
192 template<int h>
193 void encrypt_authenticate_algorithm(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar* IV,uchar* MAC,mylong myrand) {
194   uchar X[h];
195   uchar Y[h];
196   uchar RM1[h];
197   uchar RM2[h];
198   uchar tmp[h];
199   mylong *rm1=(mylong*)RM1;
200   mylong *rm2=(mylong*)RM2;
201
202   for(int it=0;it<len;it++) {
203     int ind1=Pbox[it]*h;
204     int ind2=it*h;
205     
206     for(int a=0;a<(h>>3);a++) {
207       myrand=xorshift64();
208       rm1[a]=myrand;
209       myrand=xorshift64();
210       rm2[a]=myrand;
211     }  
212
213   
214
215     for(int a=0;a<h;a+=4) {
216       tmp[a]=Sbox1[seq_in[ind2+a]^RM1[a]];
217       tmp[a+1]=Sbox1[seq_in[ind2+a+1]^RM1[a+1]];
218       tmp[a+2]=Sbox1[seq_in[ind2+a+2]^RM1[a+2]];
219       tmp[a+3]=Sbox1[seq_in[ind2+a+3]^RM1[a+3]];
220     }
221     
222     for(int a=0;a<h;a+=4) {
223       X[a]=Sbox2[tmp[a]^RM2[a]];
224       X[a+1]=Sbox2[tmp[a+1]^RM2[a+1]];
225       X[a+2]=Sbox2[tmp[a+2]^RM2[a+2]];
226       X[a+3]=Sbox2[tmp[a+3]^RM2[a+3]];
227     }
228       
229     for(int a=0;a<h;a+=4) {
230       seq_out[ind1+a]=X[a];
231       seq_out[ind1+a+1]=X[a+1];
232       seq_out[ind1+a+2]=X[a+2];
233       seq_out[ind1+a+3]=X[a+3];
234     }
235
236     for(int a=0;a<h;a+=4) {
237       IV[a]=Sbox2[IV[a]^tmp[a]];
238       IV[a+1]=Sbox2[IV[a+1]^tmp[a+1]];
239       IV[a+2]=Sbox2[IV[a+2]^tmp[a+2]];
240       IV[a+3]=Sbox2[IV[a+3]^tmp[a+3]];
241     }
242
243   }
244   
245   for(int a=0;a<h;a+=4) {
246     MAC[a]=Sbox1[IV[a]];
247     MAC[a+1]=Sbox1[IV[a+1]];
248     MAC[a+2]=Sbox1[IV[a+2]];
249     MAC[a+3]=Sbox1[IV[a+3]];
250   }
251   
252 }
253
254 template<int h>
255 void decrypt_authenticate_algorithm(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2,uchar *Sbox1,uchar *Sbox2, uchar* IV, uchar* MAC,mylong myrand) {
256
257   uchar X[h];
258   uchar Y[h];
259   uchar RM1[h];
260   uchar RM2[h];
261   uchar tmp[h];
262   mylong *rm1=(mylong*)RM1;
263   mylong *rm2=(mylong*)RM2;
264
265   for(int it=0;it<len;it++) {
266     int ind2=Pbox[it]*h;
267     int ind1=it*h;
268
269     
270     for(int a=0;a<(h>>3);a++) {
271       myrand=xorshift64();
272       rm1[a]=myrand;
273       myrand=xorshift64();
274       rm2[a]=myrand;
275     }  
276
277     /*    for(int a=0;a<h;a+=4) {
278       X[a]=seq_in[ind2+a];
279       X[a+1]=seq_in[ind2+a+1];
280       X[a+2]=seq_in[ind2+a+2];
281       X[a+3]=seq_in[ind2+a+3];
282     }
283     */
284     for(int a=0;a<h;a+=4) {
285       tmp[a]=Inv_Sbox2[seq_in[ind2+a]]^RM2[a];
286       tmp[a+1]=Inv_Sbox2[seq_in[ind2+a+1]]^RM2[a+1];
287       tmp[a+2]=Inv_Sbox2[seq_in[ind2+a+2]]^RM2[a+2];
288       tmp[a+3]=Inv_Sbox2[seq_in[ind2+a+3]]^RM2[a+3];
289     }
290     
291     for(int a=0;a<h;a+=4) {
292       X[a]=Inv_Sbox1[tmp[a]]^RM1[a];
293       X[a+1]=Inv_Sbox1[tmp[a+1]]^RM1[a+1];
294       X[a+2]=Inv_Sbox1[tmp[a+2]]^RM1[a+2];
295       X[a+3]=Inv_Sbox1[tmp[a+3]]^RM1[a+3];
296     }
297       
298     for(int a=0;a<h;a+=4) {
299       seq_out[ind1+a]=X[a];
300       seq_out[ind1+a+1]=X[a+1];
301       seq_out[ind1+a+2]=X[a+2];
302       seq_out[ind1+a+3]=X[a+3];
303     }
304
305     for(int a=0;a<h;a+=4) {
306       IV[a]=Sbox2[IV[a]^tmp[a]];
307       IV[a+1]=Sbox2[IV[a+1]^tmp[a+1]];
308       IV[a+2]=Sbox2[IV[a+2]^tmp[a+2]];
309       IV[a+3]=Sbox2[IV[a+3]^tmp[a+3]];
310     }
311
312   }
313   
314   for(int a=0;a<h;a+=4) {
315     MAC[a]=Sbox1[IV[a]];
316     MAC[a+1]=Sbox1[IV[a+1]];
317     MAC[a+2]=Sbox1[IV[a+2]];
318     MAC[a+3]=Sbox1[IV[a+3]];
319     
320   }
321   
322 }
323
324
325
326 template<int h>
327 void encrypt_authenticate_algorithm_2Blocks(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar* IV1,uchar* IV2,uchar* MAC,mylong myrand) {
328   uchar X[h];
329   uchar Y[h];
330   uchar RM1[h];
331   uchar RM2[h];
332   uchar tmp1[h];
333   uchar tmp2[h];
334   mylong *rm1=(mylong*)RM1;
335   mylong *rm2=(mylong*)RM2;
336
337   for(int it=0;it<len/2;it++) {
338     int ind1=Pbox[it]*h;
339     int ind2=Pbox[it+len/2]*h;
340     
341     for(int a=0;a<(h>>3);a++) {
342       myrand=xorshift64();
343       rm1[a]=myrand;
344       myrand=xorshift64();
345       rm2[a]=myrand;
346     }  
347
348     for(int a=0;a<h;a+=4) {
349       X[a]=seq_in[ind1+a];
350       X[a+1]=seq_in[ind1+a+1];
351       X[a+2]=seq_in[ind1+a+2];
352       X[a+3]=seq_in[ind1+a+3];
353     }
354         
355     for(int a=0;a<h;a+=4) {
356       Y[a]=seq_in[ind2+a];
357       Y[a+1]=seq_in[ind2+a+1];
358       Y[a+2]=seq_in[ind2+a+2];
359       Y[a+3]=seq_in[ind2+a+3];
360     }
361         
362     for(int a=0;a<h;a+=4) {
363       tmp1[a]=Sbox1[X[a]^RM1[a]];
364       tmp1[a+1]=Sbox1[X[a+1]^RM1[a+1]];
365       tmp1[a+2]=Sbox1[X[a+2]^RM1[a+2]];
366       tmp1[a+3]=Sbox1[X[a+3]^RM1[a+3]];
367     }
368     
369     for(int a=0;a<h;a+=4) {
370       tmp2[a]=Sbox2[Y[a]^RM2[a]];
371       tmp2[a+1]=Sbox2[Y[a+1]^RM2[a+1]];
372       tmp2[a+2]=Sbox2[Y[a+2]^RM2[a+2]];
373       tmp2[a+3]=Sbox2[Y[a+3]^RM2[a+3]];
374     }
375         
376     for(int a=0;a<h;a+=4) {
377       X[a]=Sbox2[tmp1[a]^RM2[a]];
378       X[a+1]=Sbox2[tmp1[a+1]^RM2[a+1]];
379       X[a+2]=Sbox2[tmp1[a+2]^RM2[a+2]];
380       X[a+3]=Sbox2[tmp1[a+3]^RM2[a+3]];
381     }
382       
383     for(int a=0;a<h;a+=4) {
384       Y[a]=Sbox1[tmp2[a]^RM1[a]];
385       Y[a+1]=Sbox1[tmp2[a+1]^RM1[a+1]];
386       Y[a+2]=Sbox1[tmp2[a+2]^RM1[a+2]];
387       Y[a+3]=Sbox1[tmp2[a+3]^RM1[a+3]];
388     }  
389           
390           
391     for(int a=0;a<h;a+=4) {
392       seq_out[ind2+a]=Y[a];
393       seq_out[ind2+a+1]=Y[a+1];
394       seq_out[ind2+a+2]=Y[a+2];
395       seq_out[ind2+a+3]=Y[a+3];
396     }
397
398     for(int a=0;a<h;a+=4) {
399       seq_out[ind1+a]=X[a];
400       seq_out[ind1+a+1]=X[a+1];
401       seq_out[ind1+a+2]=X[a+2];
402       seq_out[ind1+a+3]=X[a+3];
403     }
404
405
406     for(int a=0;a<h;a+=4) {
407       IV2[a]=Sbox2[IV1[a]^tmp1[a]];
408       IV2[a+1]=Sbox2[IV1[a+1]^tmp1[a+1]];
409       IV2[a+2]=Sbox2[IV1[a+2]^tmp1[a+2]];
410       IV2[a+3]=Sbox2[IV1[a+3]^tmp1[a+3]];
411     }
412
413     for(int a=0;a<h;a+=4) {
414       IV1[a]=Sbox1[IV2[a]^tmp2[a]];
415       IV1[a+1]=Sbox1[IV2[a+1]^tmp2[a+1]];
416       IV1[a+2]=Sbox1[IV2[a+2]^tmp2[a+2]];
417       IV1[a+3]=Sbox1[IV2[a+3]^tmp2[a+3]];
418     }
419
420   }
421   for(int a=0;a<h;a+=4) {
422     MAC[a]=Sbox1[IV2[a]]^Sbox2[IV1[a]];
423     MAC[a+1]=Sbox1[IV2[a+1]]^Sbox2[IV1[a+1]];
424     MAC[a+2]=Sbox1[IV2[a+2]]^Sbox2[IV1[a+2]];
425     MAC[a+3]=Sbox1[IV2[a+3]]^Sbox2[IV1[a+3]];
426   }
427 }
428
429
430
431
432 template<int h>
433 void decrypt_authenticate_algorithm_2Blocks(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2, uchar *Sbox1, uchar *Sbox2, uchar* IV1,uchar* IV2,uchar* MAC,mylong myrand) {
434   uchar X[h];
435   uchar Y[h];
436   uchar RM1[h];
437   uchar RM2[h];
438   uchar tmp1[h];
439   uchar tmp2[h];
440   mylong *rm1=(mylong*)RM1;
441   mylong *rm2=(mylong*)RM2;
442
443   for(int it=0;it<len/2;it++) {
444     int ind1=Pbox[it]*h;
445     int ind2=Pbox[it+len/2]*h;
446     
447     for(int a=0;a<(h>>3);a++) {
448       myrand=xorshift64();
449       rm1[a]=myrand;
450       myrand=xorshift64();
451       rm2[a]=myrand;
452     }  
453
454     for(int a=0;a<h;a+=4) {
455       X[a]=seq_in[ind1+a];
456       X[a+1]=seq_in[ind1+a+1];
457       X[a+2]=seq_in[ind1+a+2];
458       X[a+3]=seq_in[ind1+a+3];
459     }
460         
461     for(int a=0;a<h;a+=4) {
462       Y[a]=seq_in[ind2+a];
463       Y[a+1]=seq_in[ind2+a+1];
464       Y[a+2]=seq_in[ind2+a+2];
465       Y[a+3]=seq_in[ind2+a+3];
466     }
467         
468     for(int a=0;a<h;a+=4) {
469       tmp1[a]=Inv_Sbox2[X[a]]^RM2[a];
470       tmp1[a+1]=Inv_Sbox2[X[a+1]]^RM2[a+1];
471       tmp1[a+2]=Inv_Sbox2[X[a+2]]^RM2[a+2];
472       tmp1[a+3]=Inv_Sbox2[X[a+3]]^RM2[a+3];
473     }
474       
475     for(int a=0;a<h;a+=4) {
476       tmp2[a]=Inv_Sbox1[Y[a]]^RM1[a];
477       tmp2[a+1]=Inv_Sbox1[Y[a+1]]^RM1[a+1];
478       tmp2[a+2]=Inv_Sbox1[Y[a+2]]^RM1[a+2];
479       tmp2[a+3]=Inv_Sbox1[Y[a+3]]^RM1[a+3];
480     }  
481           
482         
483     for(int a=0;a<h;a+=4) {
484       X[a]=Inv_Sbox1[tmp1[a]]^RM1[a];
485       X[a+1]=Inv_Sbox1[tmp1[a+1]]^RM1[a+1];
486       X[a+2]=Inv_Sbox1[tmp1[a+2]]^RM1[a+2];
487       X[a+3]=Inv_Sbox1[tmp1[a+3]]^RM1[a+3];
488     }
489     
490     for(int a=0;a<h;a+=4) {
491       Y[a]=Inv_Sbox2[tmp2[a]]^RM2[a];
492       Y[a+1]=Inv_Sbox2[tmp2[a+1]]^RM2[a+1];
493       Y[a+2]=Inv_Sbox2[tmp2[a+2]]^RM2[a+2];
494       Y[a+3]=Inv_Sbox2[tmp2[a+3]]^RM2[a+3];
495     }
496         
497     for(int a=0;a<h;a+=4) {
498       seq_out[ind2+a]=Y[a];
499       seq_out[ind2+a+1]=Y[a+1];
500       seq_out[ind2+a+2]=Y[a+2];
501       seq_out[ind2+a+3]=Y[a+3];
502     }
503
504     for(int a=0;a<h;a+=4) {
505       seq_out[ind1+a]=X[a];
506       seq_out[ind1+a+1]=X[a+1];
507       seq_out[ind1+a+2]=X[a+2];
508       seq_out[ind1+a+3]=X[a+3];
509     }
510
511
512     for(int a=0;a<h;a+=4) {
513       IV2[a]=Sbox2[IV1[a]^tmp1[a]];
514       IV2[a+1]=Sbox2[IV1[a+1]^tmp1[a+1]];
515       IV2[a+2]=Sbox2[IV1[a+2]^tmp1[a+2]];
516       IV2[a+3]=Sbox2[IV1[a+3]^tmp1[a+3]];
517     }
518
519     for(int a=0;a<h;a+=4) {
520       IV1[a]=Sbox1[IV2[a]^tmp2[a]];
521       IV1[a+1]=Sbox1[IV2[a+1]^tmp2[a+1]];
522       IV1[a+2]=Sbox1[IV2[a+2]^tmp2[a+2]];
523       IV1[a+3]=Sbox1[IV2[a+3]^tmp2[a+3]];
524     }
525
526   }
527     for(int a=0;a<h;a+=4) {
528       MAC[a]=Sbox1[IV2[a]]^Sbox2[IV1[a]];
529       MAC[a+1]=Sbox1[IV2[a+1]]^Sbox2[IV1[a+1]];
530       MAC[a+2]=Sbox1[IV2[a+2]]^Sbox2[IV1[a+2]];
531       MAC[a+3]=Sbox1[IV2[a+3]]^Sbox2[IV1[a+3]];
532   }
533 }
534
535
536
537
538 template<int h>
539 void encrypt_authenticate_algorithm_2Blocks_V2(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar* IV1,uchar* IV2,uchar* MAC,mylong myrand) {
540   uchar X[h];
541   uchar Y[h];
542   uchar RM1[h];
543   uchar RM2[h];
544   uchar tmp1[h];
545   uchar tmp2[h];
546   mylong *rm1=(mylong*)RM1;
547   mylong *rm2=(mylong*)RM2;
548
549   for(int it=0;it<len/2;it++) {
550     int ind1=Pbox[it]*h;
551     int ind2=Pbox[it+len/2]*h;
552     
553     for(int a=0;a<(h>>3);a++) {
554       myrand=xorshift64();
555       rm1[a]=myrand;
556       myrand=xorshift64();
557       rm2[a]=myrand;
558     }  
559
560     for(int a=0;a<h;a+=4) {
561       X[a]=seq_in[ind1+a];
562       X[a+1]=seq_in[ind1+a+1];
563       X[a+2]=seq_in[ind1+a+2];
564       X[a+3]=seq_in[ind1+a+3];
565     }
566         
567     for(int a=0;a<h;a+=4) {
568       Y[a]=seq_in[ind2+a];
569       Y[a+1]=seq_in[ind2+a+1];
570       Y[a+2]=seq_in[ind2+a+2];
571       Y[a+3]=seq_in[ind2+a+3];
572     }
573         
574     for(int a=0;a<h;a+=4) {
575       tmp1[a]=Sbox1[X[a]^RM1[a]]^Y[a];
576       tmp1[a+1]=Sbox1[X[a+1]^RM1[a+1]]^Y[a+1];
577       tmp1[a+2]=Sbox1[X[a+2]^RM1[a+2]]^Y[a+2];
578       tmp1[a+3]=Sbox1[X[a+3]^RM1[a+3]]^Y[a+3];
579     }
580     
581     for(int a=0;a<h;a+=4) {
582       tmp2[a]=Sbox2[Y[a]^RM2[a]];
583       tmp2[a+1]=Sbox2[Y[a+1]^RM2[a+1]];
584       tmp2[a+2]=Sbox2[Y[a+2]^RM2[a+2]];
585       tmp2[a+3]=Sbox2[Y[a+3]^RM2[a+3]];
586     }
587         
588     for(int a=0;a<h;a+=4) {
589       X[a]=Sbox2[tmp1[a]^RM2[a]];
590       X[a+1]=Sbox2[tmp1[a+1]^RM2[a+1]];
591       X[a+2]=Sbox2[tmp1[a+2]^RM2[a+2]];
592       X[a+3]=Sbox2[tmp1[a+3]^RM2[a+3]];
593     }
594       
595     for(int a=0;a<h;a+=4) {
596       Y[a]=Sbox1[tmp2[a]^RM1[a]];
597       Y[a+1]=Sbox1[tmp2[a+1]^RM1[a+1]];
598       Y[a+2]=Sbox1[tmp2[a+2]^RM1[a+2]];
599       Y[a+3]=Sbox1[tmp2[a+3]^RM1[a+3]];
600     }  
601           
602           
603     for(int a=0;a<h;a+=4) {
604       seq_out[ind2+a]=Y[a];
605       seq_out[ind2+a+1]=Y[a+1];
606       seq_out[ind2+a+2]=Y[a+2];
607       seq_out[ind2+a+3]=Y[a+3];
608     }
609
610     for(int a=0;a<h;a+=4) {
611       seq_out[ind1+a]=X[a];
612       seq_out[ind1+a+1]=X[a+1];
613       seq_out[ind1+a+2]=X[a+2];
614       seq_out[ind1+a+3]=X[a+3];
615     }
616
617
618     for(int a=0;a<h;a+=4) {
619       IV2[a]=Sbox2[IV1[a]^tmp1[a]];
620       IV2[a+1]=Sbox2[IV1[a+1]^tmp1[a+1]];
621       IV2[a+2]=Sbox2[IV1[a+2]^tmp1[a+2]];
622       IV2[a+3]=Sbox2[IV1[a+3]^tmp1[a+3]];
623     }
624
625     for(int a=0;a<h;a+=4) {
626       IV1[a]=Sbox1[IV2[a]^tmp2[a]];
627       IV1[a+1]=Sbox1[IV2[a+1]^tmp2[a+1]];
628       IV1[a+2]=Sbox1[IV2[a+2]^tmp2[a+2]];
629       IV1[a+3]=Sbox1[IV2[a+3]^tmp2[a+3]];
630     }
631
632   }
633   for(int a=0;a<h;a+=4) {
634       MAC[a]=Sbox1[IV2[a]]^Sbox2[IV1[a]];
635       MAC[a+1]=Sbox1[IV2[a+1]]^Sbox2[IV1[a+1]];
636       MAC[a+2]=Sbox1[IV2[a+2]]^Sbox2[IV1[a+2]];
637       MAC[a+3]=Sbox1[IV2[a+3]]^Sbox2[IV1[a+3]];
638   }
639 }
640
641
642
643
644
645 template<int h>
646 void decrypt_authenticate_algorithm_2Blocks_V2(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2, uchar *Sbox1, uchar *Sbox2, uchar* IV1,uchar* IV2, uchar* MAC,mylong myrand) {
647   uchar X[h];
648   uchar Y[h];
649   uchar RM1[h];
650   uchar RM2[h];
651   uchar tmp1[h];
652   uchar tmp2[h];
653   mylong *rm1=(mylong*)RM1;
654   mylong *rm2=(mylong*)RM2;
655
656   for(int it=0;it<len/2;it++) {
657     int ind1=Pbox[it]*h;
658     int ind2=Pbox[it+len/2]*h;
659     
660     for(int a=0;a<(h>>3);a++) {
661       myrand=xorshift64();
662       rm1[a]=myrand;
663       myrand=xorshift64();
664       rm2[a]=myrand;
665     }  
666
667     for(int a=0;a<h;a+=4) {
668       X[a]=seq_in[ind1+a];
669       X[a+1]=seq_in[ind1+a+1];
670       X[a+2]=seq_in[ind1+a+2];
671       X[a+3]=seq_in[ind1+a+3];
672     }
673         
674     for(int a=0;a<h;a+=4) {
675       Y[a]=seq_in[ind2+a];
676       Y[a+1]=seq_in[ind2+a+1];
677       Y[a+2]=seq_in[ind2+a+2];
678       Y[a+3]=seq_in[ind2+a+3];
679     }
680         
681
682     for(int a=0;a<h;a+=4) {
683       tmp2[a]=Inv_Sbox1[Y[a]]^RM1[a];
684       tmp2[a+1]=Inv_Sbox1[Y[a+1]]^RM1[a+1];
685       tmp2[a+2]=Inv_Sbox1[Y[a+2]]^RM1[a+2];
686       tmp2[a+3]=Inv_Sbox1[Y[a+3]]^RM1[a+3];
687     }  
688
689     for(int a=0;a<h;a+=4) {
690       tmp1[a]=Inv_Sbox2[X[a]]^RM2[a];
691       tmp1[a+1]=Inv_Sbox2[X[a+1]]^RM2[a+1];
692       tmp1[a+2]=Inv_Sbox2[X[a+2]]^RM2[a+2];
693       tmp1[a+3]=Inv_Sbox2[X[a+3]]^RM2[a+3];
694     }
695         
696     for(int a=0;a<h;a+=4) {
697       Y[a]=Inv_Sbox2[tmp2[a]]^RM2[a];
698       Y[a+1]=Inv_Sbox2[tmp2[a+1]]^RM2[a+1];
699       Y[a+2]=Inv_Sbox2[tmp2[a+2]]^RM2[a+2];
700       Y[a+3]=Inv_Sbox2[tmp2[a+3]]^RM2[a+3];
701     }
702         
703     for(int a=0;a<h;a+=4) {
704       X[a] =Inv_Sbox1[tmp1[a]^Y[a]]^RM1[a];
705       X[a+1] =Inv_Sbox1[tmp1[a+1]^Y[a+1]]^RM1[a+1];
706       X[a+2] =Inv_Sbox1[tmp1[a+2]^Y[a+2]]^RM1[a+2];
707       X[a+3] =Inv_Sbox1[tmp1[a+3]^Y[a+3]]^RM1[a+3];
708     }
709     
710           
711     for(int a=0;a<h;a+=4) {
712       seq_out[ind2+a]=Y[a];
713       seq_out[ind2+a+1]=Y[a+1];
714       seq_out[ind2+a+2]=Y[a+2];
715       seq_out[ind2+a+3]=Y[a+3];
716     }
717
718     for(int a=0;a<h;a+=4) {
719       seq_out[ind1+a]=X[a];
720       seq_out[ind1+a+1]=X[a+1];
721       seq_out[ind1+a+2]=X[a+2];
722       seq_out[ind1+a+3]=X[a+3];
723     }
724
725     for(int a=0;a<h;a+=4) {
726       IV2[a]=Sbox2[IV1[a]^tmp1[a]];
727       IV2[a+1]=Sbox2[IV1[a+1]^tmp1[a+1]];
728       IV2[a+2]=Sbox2[IV1[a+2]^tmp1[a+2]];
729       IV2[a+3]=Sbox2[IV1[a+3]^tmp1[a+3]];
730     }
731
732     for(int a=0;a<h;a+=4) {
733       IV1[a]=Sbox1[IV2[a]^tmp2[a]];
734       IV1[a+1]=Sbox1[IV2[a+1]^tmp2[a+1]];
735       IV1[a+2]=Sbox1[IV2[a+2]^tmp2[a+2]];
736       IV1[a+3]=Sbox1[IV2[a+3]^tmp2[a+3]];
737     }
738
739   }
740   for(int a=0;a<h;a+=4) {
741     MAC[a]=Sbox1[IV2[a]]^Sbox2[IV1[a]];
742     MAC[a+1]=Sbox1[IV2[a+1]]^Sbox2[IV1[a+1]];
743     MAC[a+2]=Sbox1[IV2[a+2]]^Sbox2[IV1[a+2]];
744     MAC[a+3]=Sbox1[IV2[a+3]]^Sbox2[IV1[a+3]];
745   }
746 }
747
748 template<int h>
749 void encrypt_authenticate_algorithm_2Blocks_V3(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Sbox1, uchar *Sbox2, uchar* IV,uchar* MAC,mylong myrand) {
750   uchar RM1[h];
751   uchar tmp1[h];
752   mylong *rm1=(mylong*)RM1;
753
754   for(int it=0;it<len/2;it++) {
755     int ind1=Pbox[it]*h;
756     int ind2=Pbox[it+len/2]*h;
757     
758     for(int a=0;a<(h>>3);a++) {
759       myrand=xorshift64();
760       rm1[a]=myrand;
761     }  
762
763     for(int a=0;a<h;a+=4) {
764       tmp1[a]=Sbox1[seq_in[ind1+a]^RM1[a]];
765       tmp1[a+1]=Sbox1[seq_in[ind1+a+1]^RM1[a+1]];
766       tmp1[a+2]=Sbox1[seq_in[ind1+a+2]^RM1[a+2]];
767       tmp1[a+3]=Sbox1[seq_in[ind1+a+3]^RM1[a+3]];
768     }
769     
770     for(int a=0;a<h;a+=4) {
771       seq_out[ind2+a]=Sbox2[seq_in[ind2+a]^tmp1[a]];
772       seq_out[ind2+a+1]=Sbox2[seq_in[ind2+a+1]^tmp1[a+1]];
773       seq_out[ind2+a+2]=Sbox2[seq_in[ind2+a+2]^tmp1[a+2]];
774       seq_out[ind2+a+3]=Sbox2[seq_in[ind2+a+3]^tmp1[a+3]];
775     }
776         
777
778     for(int a=0;a<h;a+=4) {
779       seq_out[ind1+a]=Sbox2[tmp1[a]];
780       seq_out[ind1+a+1]=Sbox2[tmp1[a+1]];
781       seq_out[ind1+a+2]=Sbox2[tmp1[a+2]];
782       seq_out[ind1+a+3]=Sbox2[tmp1[a+3]];
783     }
784
785     for(int a=0;a<h;a+=4) {
786       IV[a]=Sbox1[IV[a]^seq_out[ind2+a]]^tmp1[a];
787       IV[a+1]=Sbox1[IV[a+1]^seq_out[ind2+a+1]]^tmp1[a+1];
788       IV[a+2]=Sbox1[IV[a+2]^seq_out[ind2+a+2]]^tmp1[a+2];
789       IV[a+3]=Sbox1[IV[a+3]^seq_out[ind2+a+3]]^tmp1[a+3];
790     }
791
792   }
793     for(int a=0;a<h;a+=4) {
794       MAC[a]=Sbox2[IV[a]];
795       MAC[a+1]=Sbox2[IV[a+1]];
796       MAC[a+2]=Sbox2[IV[a+2]];
797       MAC[a+3]=Sbox2[IV[a+3]];
798   }
799 }
800
801
802 template<int h>
803 void decrypt_authenticate_algorithm_2Blocks_V3(uchar* seq_in, uchar *seq_out,  int len, uchar* RM, int *Pbox, int *PboxSRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2 ,uchar *Sbox1, uchar *Sbox2, uchar* IV,uchar* MAC,mylong myrand) {
804   uchar RM1[h];
805   uchar tmp1[h];
806   mylong *rm1=(mylong*)RM1;
807
808   for(int it=0;it<len/2;it++) {
809     int ind1=Pbox[it]*h;
810     int ind2=Pbox[it+len/2]*h;
811     
812     for(int a=0;a<(h>>3);a++) {
813       myrand=xorshift64();
814       rm1[a]=myrand;
815     }  
816
817     for(int a=0;a<h;a+=4) {
818       tmp1[a]=Inv_Sbox2[seq_in[ind1+a]];
819       tmp1[a+1]=Inv_Sbox2[seq_in[ind1+a+1]];
820       tmp1[a+2]=Inv_Sbox2[seq_in[ind1+a+2]];
821       tmp1[a+3]=Inv_Sbox2[seq_in[ind1+a+3]];
822     }
823
824     for(int a=0;a<h;a+=4) {
825       seq_out[ind2+a]=Inv_Sbox2[seq_in[ind2+a]]^tmp1[a];
826       seq_out[ind2+a+1]=Inv_Sbox2[seq_in[ind2+a+1]]^tmp1[a+1];
827       seq_out[ind2+a+2]=Inv_Sbox2[seq_in[ind2+a+2]]^tmp1[a+2];
828       seq_out[ind2+a+3]=Inv_Sbox2[seq_in[ind2+a+3]]^tmp1[a+3];
829     }
830         
831     for(int a=0;a<h;a+=4) {
832      seq_out[ind1+a]  =Inv_Sbox1[tmp1[a]]^RM1[a];
833      seq_out[ind1+a+1]=Inv_Sbox1[tmp1[a+1]]^RM1[a+1];
834      seq_out[ind1+a+2]=Inv_Sbox1[tmp1[a+2]]^RM1[a+2];
835      seq_out[ind1+a+3]=Inv_Sbox1[tmp1[a+3]]^RM1[a+3];
836     }
837     
838     for(int a=0;a<h;a+=4) {
839       IV[a]=Sbox1[IV[a]^seq_in[ind2+a]]^tmp1[a];
840       IV[a+1]=Sbox1[IV[a+1]^seq_in[ind2+a+1]]^tmp1[a+1];
841       IV[a+2]=Sbox1[IV[a+2]^seq_in[ind2+a+2]]^tmp1[a+2];
842       IV[a+3]=Sbox1[IV[a+3]^seq_in[ind2+a+3]]^tmp1[a+3];
843     }
844
845   }
846   for(int a=0;a<h;a+=4) {
847     MAC[a]=Sbox2[IV[a]];
848     MAC[a+1]=Sbox2[IV[a+1]];
849     MAC[a+2]=Sbox2[IV[a+2]];
850     MAC[a+3]=Sbox2[IV[a+3]];
851   }
852 }
853
854
855 int main(int argc, char** argv) {
856
857
858   int h=32;
859   int lena=0;
860   int size_buf=1;
861  
862
863   
864   for(int i=1; i<argc; i++){
865     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
866     if(strncmp(argv[i],"v1b",3)==0) v1b=1;       
867     if(strncmp(argv[i],"v2b1",4)==0) v2b1=1;
868     if(strncmp(argv[i],"v2b2",4)==0) v2b2 = 1;
869     if(strncmp(argv[i],"v2b3",4)==0) v2b3 = 1;
870     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
871     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
872     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
873   }
874
875 /*  printf("nb times %d\n",nb_test);
876   printf("cbcrm %d\n",cbcrm);
877   printf("cbcprng %d\n",cbcprng);
878   printf("ecbrm %d\n",ecbrm);
879   printf("ecbprng %d\n",ecbprng);
880   printf("h %d\n",h);
881   printf("lena %d\n",lena);
882   printf("size_buf %d\n",size_buf);
883 */
884   
885
886       
887   int seed=time(NULL);
888 //  cout<<seed<<endl;
889   srand48(seed);
890
891   uchar Secretkey[key_size];
892
893   uchar counter[key_size];
894
895   for(int i=0;i<key_size;i++) {
896     Secretkey[i]=lrand48()&0xFF;
897     counter[i]=lrand48()&0xFF;
898   }
899
900   
901   int size = 128;
902   uchar DK[size];
903
904
905
906
907   int width;
908   int height;
909
910   uchar *data_R, *data_G, *data_B;
911   int imsize;
912   uchar *buffer;
913
914
915
916
917   
918   if(lena==1) {
919     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
920 //    load_RGB_pixmap("8192.ppm", &width, &height, &data_R, &data_G, &data_B);
921     imsize=width*height*3;
922 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
923   }
924   else {
925     width=height=size_buf;
926     imsize=width*height*3;
927     //cout<<"imsize "<<imsize<<endl;
928     buffer=new uchar[imsize];
929     for(int i=0;i<imsize;i++) {
930       buffer[i]=lrand48();
931     }
932   }
933
934
935
936   cout<<"imsize "<<imsize<<endl;
937   
938   uchar* seq= new uchar[imsize];
939   uchar* seq2= new uchar[imsize];
940
941   int oneD=width*height;
942   if(lena) {
943     for(int i=0;i<oneD;i++) {
944       seq[i]=data_R[i];
945       seq[oneD+i]=data_G[i];
946       seq[2*oneD+i]=data_B[i];
947     }
948   }
949   else {
950     for(int i=0;i<oneD*3;i++) {
951       seq[i]=buffer[i];
952     }
953   }
954
955
956
957
958
959   int total_len=imsize;
960   int rp=1;
961   int len= total_len/h;
962
963
964   
965   uchar *mix=new uchar[256];
966
967
968
969     
970   for (int i = 0; i < 256 ; i++) {
971     mix[i]=Secretkey[i]^counter[i];
972     
973   }
974   gchar  *sha512;
975
976   sha512 = g_compute_checksum_for_string(G_CHECKSUM_SHA512, (const char*) mix, 256);
977 //  g_print("%s\n", sha512);
978  
979
980
981
982
983
984
985
986   
987 //  cout<<"hash "<<endl;
988   for (int i = 0; i < 128 ; i++) {
989 //    DK[i]=digest[i];
990     DK[i]=sha512[i];
991   }
992   g_free(sha512);
993
994
995   int *Pbox=new int[len];
996   int *PboxSRM=new int[len/2];
997   int *PboxSRM2=new int[len/2];
998   uchar Sbox1[256];
999   uchar Sbox2[256];  
1000   uchar Inv_Sbox1[256];
1001   uchar Inv_Sbox2[256];
1002   uchar sc[256];  
1003   uchar RM[h*h*2+256];
1004   uchar IV1[h];
1005   uchar IV2[h];
1006   uchar MAC[h];
1007
1008
1009   
1010   mylong myrand=0;
1011  
1012
1013   double time_encrypt=0;
1014   double time_decrypt=0;
1015   
1016
1017   double t=TimeStart();  
1018
1019   for(int i=0;i<h;i++) {
1020     IV1[i]=i;
1021     IV2[i]=i;
1022     MAC[i]=i;
1023   }
1024     
1025
1026   
1027   for(int i=0;i<nb_test;i++) {
1028
1029     rc4key(DK, Sbox1, 8);
1030   
1031   
1032     rc4key(&DK[8], Sbox2, 8);
1033     
1034     rc4key(&DK[16], sc, 16);
1035     prga(sc, h*h*2+256, RM);
1036     
1037
1038
1039
1040   
1041     rc4keyperm(&DK[72], len, rp, Pbox, 16);
1042     
1043     
1044     rc4keyperm(&DK[88], len/2, rp, PboxSRM2, 16);
1045     
1046     for(int i=0;i<len/2;i++) {
1047       PboxSRM[i]=PboxSRM2[i]&(h-1);
1048     }
1049     
1050 /*
1051   for(int i=0;i<h*2;i++) {
1052     for(int j=0;j<h;j++)
1053       cout<<(int)RM[i*h+j]<<" ";
1054     cout<<endl;
1055   }
1056 */
1057   }
1058
1059   double time_init=0;
1060   time_init+=TimeStop(t);
1061   cout<<"Time initializaton nb times "<<nb_test<<"   = "<<time_init<<endl;
1062
1063
1064
1065   myrand=0;
1066   for(int i=0;i<64;i++) {
1067     myrand|=DK[i]&1;
1068     myrand<<=1;
1069   }
1070
1071  
1072
1073
1074
1075   
1076   
1077   inverse_tables(Sbox1,256,Inv_Sbox1);
1078   inverse_tables(Sbox2,256,Inv_Sbox2);
1079
1080
1081   xorseed=myrand;
1082 //  lehmer64_seed(myrand);
1083   time_encrypt=0;
1084   t=TimeStart();
1085
1086   int i;
1087   switch(h) {
1088
1089   case 16: 
1090     for(i=0;i<nb_test;i++)
1091     {
1092       if(v1b)
1093         encrypt_authenticate_algorithm<16>(seq, seq2, len, RM, Pbox, PboxSRM, Sbox1, Sbox2, IV1, MAC, myrand);
1094       if(v2b1)
1095         encrypt_authenticate_algorithm_2Blocks<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1096       if(v2b2)
1097         encrypt_authenticate_algorithm_2Blocks_V2<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1098       if(v2b3)
1099         encrypt_authenticate_algorithm_2Blocks_V3<16>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,MAC,myrand);
1100     }
1101     break;
1102
1103     
1104   case 32: 
1105     for(i=0;i<nb_test;i++)
1106     {
1107       if(v1b)
1108         encrypt_authenticate_algorithm<32>(seq, seq2, len, RM, Pbox, PboxSRM, Sbox1, Sbox2, IV1, MAC, myrand);
1109       if(v2b1)
1110         encrypt_authenticate_algorithm_2Blocks<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1111       if(v2b2)
1112         encrypt_authenticate_algorithm_2Blocks_V2<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1113       if(v2b3)
1114         encrypt_authenticate_algorithm_2Blocks_V3<32>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,MAC,myrand);
1115     }
1116     break;
1117
1118   case 64: 
1119     for(i=0;i<nb_test;i++)
1120     {
1121       if(v1b)
1122         encrypt_authenticate_algorithm<64>(seq, seq2, len, RM, Pbox, PboxSRM, Sbox1, Sbox2, IV1, MAC, myrand);
1123       if(v2b1)
1124         encrypt_authenticate_algorithm_2Blocks<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1125       if(v2b2)
1126         encrypt_authenticate_algorithm_2Blocks_V2<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1127       if(v2b3)
1128         encrypt_authenticate_algorithm_2Blocks_V3<64>(seq, seq2,len,RM,Pbox,PboxSRM,Sbox1,Sbox2,IV1,MAC,myrand);
1129     }
1130     break;
1131
1132
1133
1134   }
1135
1136
1137   time_encrypt+=TimeStop(t);
1138   cout<<"Time encrypt "<<time_encrypt<<endl;
1139   cout<<(double)imsize*nb_test/time_encrypt<<"\t";
1140
1141   /*  for(int i=0;i<h;i++)
1142     printf("%d ",MAC[i]);
1143   printf("\n");
1144   */
1145
1146   if(lena) {
1147     for(int i=0;i<oneD;i++) {
1148       data_R[i]=seq2[i];
1149       data_G[i]=seq2[oneD+i];
1150       data_B[i]=seq2[2*oneD+i];
1151     }
1152     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
1153   }
1154
1155   for(int i=0;i<h;i++) {
1156     IV1[i]=i;
1157     IV2[i]=i;
1158     MAC[i]=i;
1159   }
1160
1161   
1162   xorseed=myrand;
1163   // lehmer64_seed(myrand);
1164   time_decrypt=0;
1165   t=TimeStart();
1166   switch(h) {
1167   case 16:
1168     for(i=0;i<nb_test;i++) {
1169       if(v1b)
1170         decrypt_authenticate_algorithm<16>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1171       if(v2b1)
1172         decrypt_authenticate_algorithm_2Blocks<16>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1173       if(v2b2)
1174         decrypt_authenticate_algorithm_2Blocks_V2<16>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1175       if(v2b3)
1176         decrypt_authenticate_algorithm_2Blocks_V3<16>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1177     }
1178     break;
1179
1180   case 32:
1181     for(i=0;i<nb_test;i++) {
1182       if(v1b)
1183         decrypt_authenticate_algorithm<32>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1184       if(v2b1)
1185         decrypt_authenticate_algorithm_2Blocks<32>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1186       if(v2b2)
1187         decrypt_authenticate_algorithm_2Blocks_V2<32>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1188       if(v2b3)
1189         decrypt_authenticate_algorithm_2Blocks_V3<32>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1190     }
1191     break;
1192
1193   case 64:
1194     for(i=0;i<nb_test;i++) {
1195       if(v1b)
1196         decrypt_authenticate_algorithm<64>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1197       if(v2b1)
1198         decrypt_authenticate_algorithm_2Blocks<64>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1199       if(v2b2)
1200         decrypt_authenticate_algorithm_2Blocks_V2<64>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,IV2,MAC,myrand);
1201       if(v2b3)
1202         decrypt_authenticate_algorithm_2Blocks_V3<64>(seq2, seq,len,RM,Pbox,PboxSRM,Inv_Sbox1,Inv_Sbox2,Sbox1,Sbox2,IV1,MAC,myrand);
1203     }
1204     break;
1205
1206
1207
1208
1209   }
1210
1211
1212
1213   
1214   time_decrypt+=TimeStop(t);
1215 //  cout<<"Time decrypt "<<time_decrypt<<endl;
1216   cout<<(double)imsize*nb_test/time_decrypt<<"\t";
1217   /*  for(int i=0;i<h;i++)
1218     printf("%d ",MAC[i]);
1219   printf("\n");
1220   */
1221   
1222   if(lena) {
1223     for(int i=0;i<oneD;i++) {
1224       data_R[i]=seq[i];
1225       data_G[i]=seq[oneD+i];
1226       data_B[i]=seq[2*oneD+i];
1227     }
1228     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
1229   }
1230   else {
1231     bool equal=true;
1232     for(int i=0;i<imsize;i++) {
1233       //cout<<(int)buffer[i]<<endl;
1234       if(buffer[i]!=seq[i]) {
1235         equal=false;
1236       }
1237     }
1238     //cout<<"RESULT CORRECT: "<<equal<<endl;
1239   }
1240   
1241
1242   return 0;
1243 }