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

Private GIT Repository
Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/Cipher_code
[Cipher_code.git] / OneRoundIoT / OneRound / one_round_par2.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 <omp.h>
13
14 /*#include <cryptopp/hex.h>
15   #include <cryptopp/sha.h>
16   #include <cryptopp/osrng.h>
17   #include <cryptopp/secblock.h>
18 */
19
20
21 extern "C" {
22   int load_RGB_pixmap(char *filename, int *width, int *height, unsigned char**R_data, unsigned char**G_data, unsigned char**B_data);
23   void store_RGB_pixmap(char *filename, unsigned char *R_data, unsigned char *G_data, unsigned char *B_data, int width, int height);
24 }
25
26
27 //using namespace CryptoPP;
28 using namespace std;
29
30
31 int key_size=256;
32 int nb_test=1;
33 int ctr=0;
34
35
36
37
38
39
40
41 typedef unsigned char   uchar;
42
43
44 double TimeStart()
45 {
46   struct timeval tstart;
47   gettimeofday(&tstart,0);
48   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
49 }
50
51 double TimeStop(double t)
52 {
53   struct timeval tend;
54
55   gettimeofday(&tend,0);
56   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
57   return (t);
58 }
59
60
61
62
63
64
65 void inverse_tables(uchar *tab, int size_tab,uchar *inv_perm_tabs) {
66
67   for(int i=0;i<size_tab;i++) {
68     inv_perm_tabs[tab[i]] = i;
69   }
70
71 }
72
73 void inverse_tables_int(int *tab, int size_tab,int *inv_perm_tabs) {
74
75   for(int i=0;i<size_tab;i++) {
76     inv_perm_tabs[tab[i]] = i;
77   }
78
79 }
80
81
82
83 void rc4key(uchar *key, uchar *sc, int size_DK) {
84
85   for(int i=0;i<256;i++) {
86     sc[i]=i;
87   }
88
89
90   uchar j0 = 0;
91   for(int i0=0; i0<256; i0++) {
92     j0 = (j0 + sc[i0] + key[i0%size_DK] )&0xFF;
93     uchar tmp = sc[i0];
94     sc[i0] = sc[j0 ];
95     sc[j0] = tmp;
96   }
97 }
98
99
100
101 void rc4keyperm(uchar *key,int len, int rp,int *sc, int size_DK) {
102
103   //sc=1:len;
104
105
106   
107   for (int i=0;i<len;i++) {
108     sc[i]=i;
109   }
110   for (int it = 0; it < rp; it++) {
111     int j0 = 1;
112     for(int i0 = 0; i0<len; i0++) {
113       j0 = (j0 + sc[i0] + sc[j0] + key[i0%size_DK] )% len;
114       int tmp = sc[i0];
115       sc[i0] = sc[j0];
116       sc[j0] = tmp;
117     }
118
119   }
120 }
121
122 void prga(uchar *sc, int ldata, uchar *r) {
123   uchar i0=0;
124   uchar j0=0;
125
126   for (int it=0; it<ldata; it++) {
127     i0 = ((i0+1)&0xFE); //%255);
128     j0 = (j0 + sc[i0])&0xFF;
129     uchar tmp = sc[i0];
130     sc[i0] = sc[j0];
131     sc[j0] = tmp;
132     r[it]=sc[(sc[i0]+sc[j0])&0xFF];
133   }
134 }
135
136 void rotate(uchar *RM1, uchar *RM2, int size, int n)
137 {
138   int i;
139   for (i = 0; i< size-n; i++)
140     RM2[i+n] = RM1[i];
141
142   for (i = 0; i< n; i++)
143     RM2[i] = RM1[size-n-1+i];
144 }
145
146
147 template<int h2>
148 void encrypt_ctr(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int enc, int num) {
149
150
151
152
153   int loc_len=len/num;
154   
155 #pragma omp parallel for
156   for(int p=0;p<num;p++) {
157
158     int id=omp_get_thread_num();
159     uchar fX[h2];
160     uchar RM2[h2];
161     
162     for(int a=0;a<h2;a++) {
163       RM2[a]=RM1[id*h2+a];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
164     }
165
166
167     uchar X[h2];
168
169
170     for(int a=0;a<h2;a+=4) {
171      X[a]=Sbox1[a&0xFF];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
172      X[a+1]=Sbox1[(a+1)&0xFF];
173      X[a+2]=Sbox1[(a+2)&0xFF];
174      X[a+3]=Sbox1[(a+3)&0xFF];           
175    }
176
177     
178     int offset=p*loc_len;
179
180     
181     for(int it=offset;it<offset+loc_len;it++) {
182       int ind1,ind2;
183
184
185       //cout<<id<<" "<<it<<endl;
186     
187       if(enc) {
188         ind1=it*h2;
189         ind2=Pbox[it]*h2;
190       }
191       else {
192         ind2=it*h2;
193         ind1=Pbox[it]*h2;
194       }
195   
196
197       for(int a=0;a<h2;a+=4) {
198         X[a]=X[Sbox1[a]];
199         X[a+1]=X[Sbox1[a+1]];
200         X[a+2]=X[Sbox1[a+2]];
201         X[a+3]=X[Sbox1[a+3]];
202       }
203
204      
205       
206       for(int a=0;a<h2;a+=4) {
207         fX[a]=X[a]^RM2[a];
208         fX[a+1]=X[a+1]^RM2[a+1];
209         fX[a+2]=X[a+2]^RM2[a+2];
210         fX[a+3]=X[a+3]^RM2[a+3];
211       }
212     
213     
214     
215       /*for(int a=0;a<h2;a+=4) {
216         fX[a]=Sbox2[fX[a]];
217         fX[a+1]=Sbox2[fX[a+1]];
218         fX[a+2]=Sbox2[fX[a+2]];
219         fX[a+3]=Sbox2[fX[a+3]];
220         }*/
221
222 //    rotate(RM1, &RM2[id*h2], h2, Pbox[it]%h2);
223     
224     
225     
226      
227
228
229     
230       for(int a=0;a<h2;a+=4) {
231         fX[a]=fX[a]^seq_in[ind2+a];
232         fX[a+1]=fX[a+1]^seq_in[ind2+a+1];
233         fX[a+2]=fX[a+2]^seq_in[ind2+a+2];
234         fX[a+3]=fX[a+3]^seq_in[ind2+a+3];
235       }
236
237  
238       for(int a=0;a<h2;a+=4) {
239         seq_out[ind1+a]=fX[a];
240         seq_out[ind1+a+1]=fX[a+1];
241         seq_out[ind1+a+2]=fX[a+2];
242         seq_out[ind1+a+3]=fX[a+3];
243       }
244
245
246
247       for(int a=0;a<h2;a+=4) {
248         RM2[a]=RM2[PboxRM[a]];
249         RM2[a+1]=RM2[PboxRM[a+1]];
250         RM2[a+2]=RM2[PboxRM[a+2]];
251         RM2[a+3]=RM2[PboxRM[a+3]];
252       }
253
254       
255       /*for(int a=0;a<h2;a+=4) {
256         RM1[id*h2+a]=RM1[id*h2+PboxRM[a]];
257         RM1[id*h2+a+1]=RM1[id*h2+PboxRM[a+1]];
258         RM1[id*h2+a+2]=RM1[id*h2+PboxRM[a+2]];
259         RM1[id*h2+a+3]=RM1[id*h2+PboxRM[a+3]];
260         }
261       */
262
263     
264     }
265   }
266
267 }
268
269
270
271
272 template<int h2>
273 void encrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Sbox1, uchar *Sbox2, int debug, int num) {
274
275
276 /*  uchar *X=new uchar[h2];
277     uchar *fX=new uchar[h2];
278     unsigned int *lX=(unsigned int*)X;
279     unsigned int *lseq_in=(unsigned int*)seq_in;
280 */
281
282 //  unsigned int *lX=(unsigned int*)X;
283 //  unsigned int *lseq_in=(unsigned int*)seq_in;
284
285
286   int loc_len=len/num;
287   
288 #pragma omp parallel for
289   for(int p=0;p<num;p++) {
290
291     int id=omp_get_thread_num();
292
293     uchar fX[h2];
294
295     
296     uchar RM2[h2];
297     for(int a=0;a<h2;a++) {
298       RM2[a]=RM1[id*h2+a];           
299     }
300
301   
302     int offset=p*loc_len;
303
304     
305     for(int it=offset;it<offset+loc_len;it++) {
306
307   
308
309       int ind1=it*h2;
310       int ind2=Pbox[it]*h2;
311
312  
313       for(int a=0;a<h2;a+=4) {
314         fX[a]=seq_in[ind2+a];
315         fX[a+1]=seq_in[ind2+a+1];
316         fX[a+2]=seq_in[ind2+a+2];
317         fX[a+3]=seq_in[ind2+a+3];
318       }
319
320
321       for(int a=0;a<h2;a+=4){
322         fX[a]=Sbox1[fX[a]];
323         fX[a+1]=Sbox1[fX[a+1]];
324         fX[a+2]=Sbox1[fX[a+2]];
325         fX[a+3]=Sbox1[fX[a+3]];
326       }
327
328
329       for(int a=0;a<h2;a+=4) {
330         fX[a]=fX[a]^RM2[a];
331         fX[a+1]=fX[a+1]^RM2[a+1];
332         fX[a+2]=fX[a+2]^RM2[a+2];
333         fX[a+3]=fX[a+3]^RM2[a+3];
334       }
335
336
337
338
339       for(int a=0;a<h2;a+=4) {
340         seq_out[ind1+a]=Sbox2[fX[a]];
341         seq_out[ind1+a+1]=Sbox2[fX[a+1]];
342         seq_out[ind1+a+2]=Sbox2[fX[a+2]];
343         seq_out[ind1+a+3]=Sbox2[fX[a+3]];
344       }
345
346
347     for(int a=0;a<h2;a+=4) {
348         RM2[a]=RM2[PboxRM[a]];
349         RM2[a+1]=RM2[PboxRM[a+1]];
350         RM2[a+2]=RM2[PboxRM[a+2]];
351         RM2[a+3]=RM2[PboxRM[a+3]];
352       }
353       
354
355
356
357     }
358     
359   }
360 }
361
362
363
364
365 template<int h2>
366 void decrypt(uchar* seq_in, uchar *seq_out, int len,uchar* RM1,int *Pbox, int *PboxRM, uchar *Inv_Sbox1, uchar *Inv_Sbox2, int debug, int num) {
367
368
369   /*uchar *fX=new uchar[h2];
370     uchar *Inv_Sbox1=new uchar[256];
371     uchar *Inv_Sbox2=new uchar[256];
372   */
373
374
375
376
377
378   int loc_len=len/num;
379   
380 #pragma omp parallel for
381   for(int p=0;p<num;p++) {
382
383     int id=omp_get_thread_num();
384     uchar RM2[h2];
385     for(int a=0;a<h2;a++) {
386       RM2[a]=RM1[id*h2+a];           //Warning according to the size of h2, we can be outsize of Sbox1[a]
387     }
388     uchar fX[h2];
389   
390     int offset=p*loc_len;
391
392     
393     for(int it=offset;it<offset+loc_len;it++) {
394
395
396       int ind1=it*h2;
397       int ind2=Pbox[it]*h2;
398
399
400
401
402       for(int a=0;a<h2;a+=4) {
403         fX[a]=seq_in[ind1+a];
404         fX[a+1]=seq_in[ind1+a+1];
405         fX[a+2]=seq_in[ind1+a+2];
406         fX[a+3]=seq_in[ind1+a+3];
407             
408       }
409       for(int a=0;a<h2;a+=4) {
410         fX[a]=Inv_Sbox2[fX[a]];
411         fX[a+1]=Inv_Sbox2[fX[a+1]];
412         fX[a+2]=Inv_Sbox2[fX[a+2]];
413         fX[a+3]=Inv_Sbox2[fX[a+3]];
414       }
415
416
417
418       for(int a=0;a<h2;a+=4) {
419         fX[a]=fX[a]^RM2[a];
420         fX[a+1]=fX[a+1]^RM2[a+1];
421         fX[a+2]=fX[a+2]^RM2[a+2];
422         fX[a+3]=fX[a+3]^RM2[a+3];      
423       }
424
425     
426       for(int a=0;a<h2;a+=4) {
427         seq_out[ind2+a]=Inv_Sbox1[fX[a]];
428         seq_out[ind2+a+1]=Inv_Sbox1[fX[a+1]];
429         seq_out[ind2+a+2]=Inv_Sbox1[fX[a+2]];
430         seq_out[ind2+a+3]=Inv_Sbox1[fX[a+3]];
431       }
432       for(int a=0;a<h2;a+=4) {
433         RM2[a]=RM2[PboxRM[a]];
434         RM2[a+1]=RM2[PboxRM[a+1]];
435         RM2[a+2]=RM2[PboxRM[a+2]];
436         RM2[a+3]=RM2[PboxRM[a+3]];
437         }
438
439      
440     }
441
442
443   }
444 }
445
446
447
448 int main(int argc, char** argv) {
449
450
451   int h=32;
452   int lena=0;
453   int size_buf=1;
454
455
456   
457   for(int i=1; i<argc; i++){
458     if(strncmp(argv[i],"nb",2)==0)    nb_test = atoi(&(argv[i][2]));    //nb of test         
459     if(strncmp(argv[i],"ctr",3)==0) ctr = atoi(&(argv[i][3]));          //CTR ? 1  otherwise CBC like
460     if(strncmp(argv[i],"h",1)==0) h = atoi(&(argv[i][1]));          //size of block
461     if(strncmp(argv[i],"sizebuf",7)==0) size_buf = atoi(&(argv[i][7]));          //SIZE of the buffer
462     if(strncmp(argv[i],"lena",4)==0) lena = atoi(&(argv[i][4]));          //Use Lena or buffer
463   }
464
465 /*  printf("nb times %d\n",nb_test);
466     printf("ctr %d\n",ctr);
467     printf("h %d\n",h);
468     printf("lena %d\n",lena);
469     printf("size_buf %d\n",size_buf);
470 */
471   int h2=h*h;
472   
473
474       
475   int seed=time(NULL);
476 //  cout<<seed<<endl;
477   srand48(seed);
478
479   uchar Secretkey[key_size];
480
481   uchar counter[key_size];
482
483   for(int i=0;i<key_size;i++) {
484     Secretkey[i]=lrand48()&0xFF;
485     counter[i]=lrand48()&0xFF;
486   }
487
488   
489   int size = 64;
490   uchar DK[size];
491
492
493
494
495   int width;
496   int height;
497
498   uchar *data_R, *data_G, *data_B;
499   int imsize;
500   uchar *buffer;
501   
502   if(lena==1) {
503     load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
504     imsize=width*height*3;
505 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
506   }
507   else {
508     width=height=size_buf;
509     imsize=width*height;
510     buffer=new uchar[imsize];
511     for(int i=0;i<imsize;i++) {
512       buffer[i]=lrand48();
513     }
514   }
515
516
517
518   
519   
520   uchar* seq= new uchar[imsize];
521   uchar* seq2= new uchar[imsize];
522
523   int oneD=width*height;
524   if(lena) {
525     for(int i=0;i<oneD;i++) {
526       seq[i]=data_R[i];
527       seq[oneD+i]=data_G[i];
528       seq[2*oneD+i]=data_B[i];
529     }
530   }
531   else {
532     for(int i=0;i<oneD;i++) {
533       seq[i]=buffer[i];
534     }
535   }
536
537
538
539   
540
541   int total_len=imsize;
542   int rp=1;
543   int len= total_len/h2;
544
545
546   
547   uchar *mix=new uchar[256];
548
549
550
551     
552   for (int i = 0; i < 256 ; i++) {
553     mix[i]=Secretkey[i]^counter[i];
554   }
555
556   
557 //  cout<<"hash "<<endl;
558   for (int i = 0; i < 64 ; i++) {
559 //    DK[i]=digest[i];
560     DK[i]=mix[i];
561   }
562
563
564
565   
566   uchar Sbox1[256];
567   rc4key(DK, Sbox1, 16);
568
569   uchar Sbox2[256];
570   rc4key(&DK[16], Sbox2, 16);
571   uchar Inv_Sbox1[256];
572   uchar Inv_Sbox2[256];
573   inverse_tables(Sbox1,256,Inv_Sbox1);
574   inverse_tables(Sbox2,256,Inv_Sbox2);
575
576
577
578   
579   uchar sc[256];
580   rc4key(&DK[32], sc, 16);
581
582   int num=omp_get_max_threads();
583   cout<<"num "<<num<<endl;
584   
585   
586
587
588   
589   
590     
591   
592
593
594   uchar RM1[num*(h * h)];
595   uchar RM2[num*(h * h)];
596   /*for(int i=0;i<num;i++) {
597     
598     rc4key(&DK[48+i*16], sc, 16);
599     prga(sc, h2, &RM1[h2*i]);
600     for(int a=0;a<h2;a++) {
601       cout<<(int)RM1[h2*i+a]<<" ";
602     }
603     cout<<endl<<endl;
604   }*/
605
606   rc4key(&DK[48], sc, 16);
607   prga(sc, h2*num, RM1);
608
609   rc4key(&DK[64], sc, 16);
610   prga(sc, h2, RM2);
611
612
613
614
615   
616 //  cout<<len<<endl;
617   int *Pbox=new int[len];
618
619
620   
621   int *PboxRM=new int[h2];
622
623   rc4keyperm(&DK[48+16*num], len, rp, Pbox, 16);
624
625
626   rc4keyperm(RM2, h2, rp, PboxRM, h2);
627
628   for(int i=0;i<num*h2;i++) {
629     RM2[i]=RM1[i];
630   }
631  
632   double time=0;
633   double t=TimeStart();
634
635   int i;
636   switch(h) {
637   case 4: 
638     for(i=0;i<nb_test;i++)
639     {
640       if(ctr)
641         encrypt_ctr<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
642       else
643         encrypt<4*4>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
644       
645     }
646     break;
647   case 8: 
648     for(i=0;i<nb_test;i++)
649     {
650       if(ctr)
651         encrypt_ctr<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
652       else
653         encrypt<8*8>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
654       
655     }
656     break;
657   case 16: 
658     for(i=0;i<nb_test;i++)
659     {
660       if(ctr)
661         encrypt_ctr<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
662       else
663         encrypt<16*16>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
664       
665     }
666     break;
667   case 32: 
668     for(i=0;i<nb_test;i++)
669     {
670       if(ctr)
671         encrypt_ctr<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
672       else
673         encrypt<32*32>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
674       
675     }
676     break;
677   case 64: 
678     for(i=0;i<nb_test;i++)
679     {
680       if(ctr)
681         encrypt_ctr<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
682       else
683         encrypt<64*64>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
684       
685     }
686     break;
687   case 128: 
688     for(i=0;i<nb_test;i++)
689     {
690       if(ctr)
691         encrypt_ctr<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,1,num);
692       else
693         encrypt<128*128>(seq, seq2,len,RM1,Pbox,PboxRM,Sbox1,Sbox2,0,num);
694       
695     }
696     break;
697   }
698   time+=TimeStop(t);
699   cout<<"Time encrypt "<<time<<endl;
700
701
702   if(lena) {
703     for(int i=0;i<oneD;i++) {
704       data_R[i]=seq2[i];
705       data_G[i]=seq2[oneD+i];
706       data_B[i]=seq2[2*oneD+i];
707     }
708     store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);
709   }
710   
711
712
713
714   for(int i=0;i<imsize;i++) {
715     seq[i]=0;
716   }
717
718   
719   time=0;
720   t=TimeStart();
721   switch(h) {
722   case 4:
723     for(i=0;i<nb_test;i++) {
724       if(ctr)
725         encrypt_ctr<4*4>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
726       else
727         decrypt<4*4>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
728     }
729     break;
730   case 8:
731     for(i=0;i<nb_test;i++) {
732       if(ctr)
733         encrypt_ctr<8*8>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
734       else
735         decrypt<8*8>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
736     }
737     break;
738   case 16:
739     for(i=0;i<nb_test;i++) {
740       if(ctr)
741         encrypt_ctr<16*16>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
742       else
743         decrypt<16*16>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
744     }
745     break;
746   case 32:
747     for(i=0;i<nb_test;i++) {
748       if(ctr)
749         encrypt_ctr<32*32>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
750       else
751         decrypt<32*32>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
752     }
753     break;
754   case 64:
755     for(i=0;i<nb_test;i++) {
756       if(ctr)
757         encrypt_ctr<64*64>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
758       else
759         decrypt<64*64>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
760     }
761     break;
762   case 128:
763     for(i=0;i<nb_test;i++) {
764       if(ctr)
765         encrypt_ctr<128*128>(seq2, seq,len,RM2,Pbox,PboxRM,Sbox1,Sbox2,0,num);
766       else
767         decrypt<128*128>(seq2,seq,len,RM2,Pbox,PboxRM,Inv_Sbox1,Inv_Sbox2,0,num);
768     }
769     break;  
770
771     
772   }
773
774   time+=TimeStop(t);
775   cout<<"Time decrypt "<<time<<endl;
776
777   if(lena) {
778     for(int i=0;i<oneD;i++) {
779       data_R[i]=seq[i];
780       data_G[i]=seq[oneD+i];
781       data_B[i]=seq[2*oneD+i];
782     }
783     store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);
784   }
785   else {
786     bool equal=true;
787     for(int i=0;i<imsize;i++) {
788       //cout<<"sol"<<(int)buffer[i]<<" "<<(int)seq[i]<<" "<<endl;
789       if(buffer[i]!=seq[i]) {
790         equal=false;
791       }
792     }
793     cout<<"RESULT CORRECT: "<<equal<<endl;
794   }
795   
796
797
798   return 0;
799 }