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

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