]> AND Private Git Repository - Cipher_code.git/commitdiff
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ida_gf64
authorcouturie <you@example.com>
Sun, 27 May 2018 14:18:30 +0000 (16:18 +0200)
committercouturie <you@example.com>
Sun, 27 May 2018 14:18:30 +0000 (16:18 +0200)
Arduino/sketch_AES/sketch_AES.ino
IDA/Makefile
IDA/ida.cpp
IDA/ida_gf64.cpp [new file with mode: 0644]
IDA/lena_small.png [deleted file]
IDA/lena_small2.png [deleted file]
SboxAES/IOT/main.c

index dcd8883398bd03b8945a8e010f2eec7dbd9e3645..998f7635422bcf52fbf8d14a1ee805820f7dd87e 100644 (file)
@@ -6,7 +6,7 @@
 AES aes ;
 
 byte *key = (unsigned char*)"0123456789010123";
-const int size_mesg=16;
+const int size_mesg=64;
 
 
 
index a2afb98ae22849980c681fa90f6d8e3f6cb2dd88..8d7d81130138a21843bdfbdbabb3b9abd2ef9c59 100644 (file)
@@ -11,5 +11,9 @@ test_mat2: test_mat2.cpp
 ida: ida.cpp
        g++ -std=c++11 $(CPP_FLAGS)  -o $@ $<   $(LIBS)
 
+
+ida_gf64: ida_gf64.cpp
+       g++  -o $@ $<  -std=c++11 -O3 -lm  -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -g -O3 -Wall   -I/home/couturie/ajeter/jerasure/include  /home/couturie/ajeter/jerasure/src/.libs/jerasure.o /home/couturie/ajeter/jerasure/src/.libs/galois.o -lgf_complete -fpermissive
+
 clean:
-       rm test_mat2 ida
+       rm test_mat2 ida ida_gf64
index dd7791a10a33057aaca2b3a20098ae28e6afbf3e..e854c3a3143044b44c4ec9ab59ca893770586466 100644 (file)
@@ -1,6 +1,3 @@
-// g++ -std=c++11 -O4 -msse2 -msse3 -msse4 -fopenmp  -O3   test_mat2.cpp -o test_mat2   -I /home/couturie/tools/armadillo-6.200.5/include/ -lc   -lm -lpthread -lgfortran -DMAX_STACK_ALLOC=2048 -Wall -m64 -DF_INTERFACE_GFORT -fPIC -DSMP_SERVER -DNO_WARMUP -DMAX_CPU_NUMBER=8  -DNO_AFFINITY   -UCOMPLEX -DDOUBLE -I/home/couturie/tools/openblas/include -I/home/couturie/Downloads/OpenBLAS-0.2.15/  /home/couturie/tools/openblas/lib/libopenblas_haswellp-r0.2.15.a
-
-
 
 #include <armadillo>
 #include <stdlib.h>
@@ -158,13 +155,16 @@ convert_vec250_to_vec256(vector<uint8_t> vec250){
 Mat<byte> readFullFile(int n, int k, long& sizeFile, int &lc) {
 
 //  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
-  ifstream stream("/home/couturie/Downloads/CARCARIASS.zip", ios::in | ios::binary | ios::ate);
-//  ifstream stream("lena_small2.png", ios::in | ios::binary | ios::ate);
+  ifstream stream("lena_small2.png", ios::in | ios::binary | ios::ate);
+//  ifstream stream("/home/couturie/Downloads/CARCARIASS.zip", ios::in | ios::binary | ios::ate);
+
   sizeFile=stream.tellg();
   cout<<sizeFile<<endl;
   stream.seekg(0, ios::beg);
 
 
+
+//Used to convert the size (in long) in 8 bytes  
   uint8_t mysize[8];
   
 
@@ -176,6 +176,7 @@ Mat<byte> readFullFile(int n, int k, long& sizeFile, int &lc) {
     tmpSize>>=8;
   }
 
+//we rebuild the size in order to check that the routine is correct  
   cout<<"rebuild"<<endl;
   long res=0;
   for(int i=8-1;i>=0;i--) {
@@ -193,6 +194,14 @@ Mat<byte> readFullFile(int n, int k, long& sizeFile, int &lc) {
 //  for(int i=0;i<8;i++)
 //    contents.insert(i,mysize[i]);
   contents.insert (contents.begin(), mysize, mysize+8);
+
+  cout<<"start of the vector"<<endl;
+  for(int i=0;i<8;i++)
+    cout<<(int)contents[i]<<" ";
+  cout<<endl;
+
+
+  
   cout<<"res contents "<<contents.size()<<endl;
   vector<uint8_t> contents2=convert_vec256_to_vec250(contents);
   cout<<"res contents2 "<<contents2.size()<<endl;
@@ -218,8 +227,8 @@ if (std::equal(contents.begin(), contents.begin() + contents.size(), contents3.b
     cout << "success" << endl;
   */
 
-lc=ceil(contents2.size()/k);
-  cout<<lc<<endl;
+  lc=ceil(contents2.size()/k);
+  cout<<"size lc "<<lc<<endl;
   Mat<byte> matData(&contents2[0],1,contents2.size());
 
 
@@ -242,12 +251,9 @@ int main( int argc, char *argv[] ) {
 
 
 
-  int full=0;
   
   int n=8;
   int k=4;
-  int Tb=64;
-  int l=10;//399*Tb;
 
 
   
@@ -292,15 +298,21 @@ int main( int argc, char *argv[] ) {
   cout<<"tatat"<<endl;
   Mat<byte> C3;
 
+
+  int off=0;
   
   //read k files among n
-  for(int i=0;i<k;i++) {
+
+  int l=0;
+//  for(int i=k-1;i>=0;i--) {
+  for(int i=0+off;i<k+off;i++) {
     stringstream ss;
     ss <<"lena_"<<i<<".png";
     string str = ss.str();
-
+    cout<<str<<endl;
     Row<byte> d2=readFile(str.c_str());
-    C3.insert_rows(i,d2);
+    C3.insert_rows(l,d2);
+    l++;
   }
 
     
@@ -311,6 +323,7 @@ int main( int argc, char *argv[] ) {
   Mat<int> Cs=conv_to<Mat<int>>::from(C3);
 
   cout<<size(Cs)<<" "<<size(C3)<<endl;
+  cout<<"S "<<" "<<S<<endl;
 
 
   
@@ -332,7 +345,6 @@ int main( int argc, char *argv[] ) {
 
   mat Gsi=round(inv(Gs)*det(Gs)*r);
   Gsi=mod(Gsi,mm);
-  Gsi=mod(Gsi,mm);
 
   cout<<Gsi<<endl;
   
@@ -340,9 +352,9 @@ int main( int argc, char *argv[] ) {
   mat SS2=mod(temp,mm);
   Mat<byte> S2=conv_to<Mat<byte>>::from(SS2);
   S2=mod(S2,mm);
-//  cout<<S2<<endl;
-//  cout<<"max"<<endl;
-//  cout<<max(S2-S,1)<<endl;
+  cout<<"S2 "<<S2<<endl;
+  cout<<"max"<<endl;
+  cout<<max(S2-S,1)<<endl;
 
 
 
@@ -352,6 +364,13 @@ int main( int argc, char *argv[] ) {
 
   vector<uint8_t> res =conv_to< vector<uint8_t> >::from(S2.row(0));
   cout<<"res size "<<res.size()<<endl;
+
+  cout<<"start of file"<<endl;
+  for(int i=0;i<8;i++)
+    cout<<(int)res[i]<<" ";
+  cout<<endl;
+
+  
   vector<uint8_t> res2=convert_vec250_to_vec256(res);
   cout<<"res2 size "<<res2.size()<<endl;
 
diff --git a/IDA/ida_gf64.cpp b/IDA/ida_gf64.cpp
new file mode 100644 (file)
index 0000000..a18a06f
--- /dev/null
@@ -0,0 +1,538 @@
+
+
+#include <iostream>
+#include <fstream>
+#include <chrono>
+#include <sstream>
+#include <ctime>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>    // std::random_shuffle
+#include <vector>       // std::vector
+extern "C" {
+  #include "jerasure.h"
+}
+
+typedef unsigned long mylong;
+#define LLUI (long long unsigned int)
+
+
+using namespace std;
+
+
+void display(mylong *mat, int r, int c) {
+ for(int i=0;i<r;i++) {
+    for(int j=0;j<c;j++) {
+      printf("%016llu ",LLUI mat[i*c+j]);
+    }
+    printf("\n");
+  }
+ printf("\n");
+}
+
+mylong *matrix_multiply(gf_t *gf, mylong *m1, mylong *m2, int r1, int c1, int r2, int c2, int w)
+{
+  mylong *product;
+  int i, j, k;
+
+  product = (mylong *) malloc(sizeof(mylong)*r1*c2);
+  for (i = 0; i < r1*c2; i++) product[i] = 0;
+
+  for (i = 0; i < r1; i++) {
+    for (j = 0; j < c2; j++) {
+      for (k = 0; k < r2; k++) {
+        product[i*c2+j] ^= gf->multiply.w64(gf,m1[i*c1+k], m2[k*c2+j]);
+      }
+    }
+  }
+  return product;
+}
+
+
+
+int invert_matrix(gf_t *gf, mylong *mat, mylong *inv, int rows)
+{
+  int cols, i, j, k, x, rs2;
+  int row_start;
+  mylong tmp, inverse;
+  cols = rows;
+
+  k = 0;
+  for (i = 0; i < rows; i++) {
+    for (j = 0; j < cols; j++) {
+      inv[k] = (i == j) ? 1 : 0;
+      k++;
+    }
+  }
+//  display(inv, rows, rows);
+//  printf("\n");
+  
+  /* First -- convert into upper triangular  */
+  for (i = 0; i < cols; i++) {
+    row_start = cols*i;
+
+    /* Swap rows if we ave a zero i,i element.  If we can't swap, then the
+       matrix was not invertible  */
+
+    if (mat[row_start+i] == 0) {
+      for (j = i+1; j < rows && mat[cols*j+i] == 0; j++) ;
+      if (j == rows) return -1;
+      rs2 = j*cols;
+      for (k = 0; k < cols; k++) {
+        tmp = mat[row_start+k];
+        mat[row_start+k] = mat[rs2+k];
+        mat[rs2+k] = tmp;
+        tmp = inv[row_start+k];
+        inv[row_start+k] = inv[rs2+k];
+        inv[rs2+k] = tmp;
+      }
+    }
+    /* Multiply the row by 1/element i,i  */
+    tmp = mat[row_start+i];
+    if (tmp != 1) {
+      inverse = gf->divide.w64(gf,1, tmp);
+      for (j = 0; j < cols; j++) {
+        mat[row_start+j] = gf->multiply.w64(gf,mat[row_start+j], inverse);
+        inv[row_start+j] = gf->multiply.w64(gf,inv[row_start+j], inverse);
+      }
+    }
+
+    /* Now for each j>i, add A_ji*Ai to Aj  */
+    k = row_start+i;
+    for (j = i+1; j != cols; j++) {
+      k += cols;
+      if (mat[k] != 0) {
+        if (mat[k] == 1) {
+          rs2 = cols*j;
+          for (x = 0; x < cols; x++) {
+            mat[rs2+x] ^= mat[row_start+x];
+            inv[rs2+x] ^= inv[row_start+x];
+          }
+        } else {
+          tmp = mat[k];
+          rs2 = cols*j;
+          for (x = 0; x < cols; x++) {
+            mat[rs2+x] ^= gf->multiply.w64(gf,tmp, mat[row_start+x]);
+            inv[rs2+x] ^= gf->multiply.w64(gf,tmp, inv[row_start+x]);
+          }
+        }
+      }
+    }
+  }
+
+  /* Now the matrix is upper triangular.  Start at the top and multiply down  */
+
+  for (i = rows-1; i >= 0; i--) {
+    row_start = i*cols;
+    for (j = 0; j < i; j++) {
+      rs2 = j*cols;
+      if (mat[rs2+i] != 0) {
+        tmp = mat[rs2+i];
+        mat[rs2+i] = 0;
+        for (k = 0; k < cols; k++) {
+          inv[rs2+k] ^= gf->multiply.w64(gf,tmp, inv[row_start+k]);
+        }
+      }
+    }
+  }
+
+/*  printf("mat\n");
+  display(mat, rows, rows);
+  printf("\n");
+   printf("inv\n");
+  display(inv, rows, rows);
+  printf("\n");
+*/
+  return 0;
+}
+
+
+
+
+int invertible_matrix(gf_t *gf, int *mat, int rows, int w)
+{
+  int cols, i, j, k, x, rs2;
+  int row_start;
+  mylong tmp, inverse;
+  cols = rows;
+
+  /* First -- convert into upper triangular  */
+  for (i = 0; i < cols; i++) {
+    row_start = cols*i;
+
+    /* Swap rows if we ave a zero i,i element.  If we can't swap, then the 
+       matrix was not invertible  */
+
+    if (mat[row_start+i] == 0) { 
+      for (j = i+1; j < rows && mat[cols*j+i] == 0; j++) ;
+      if (j == rows) return 0;
+      rs2 = j*cols;
+      for (k = 0; k < cols; k++) {
+        tmp = mat[row_start+k];
+        mat[row_start+k] = mat[rs2+k];
+        mat[rs2+k] = tmp;
+      }
+    }
+    /* Multiply the row by 1/element i,i  */
+    tmp = mat[row_start+i];
+    if (tmp != 1) {
+      inverse =  gf->divide.w64(gf,1, tmp);
+      for (j = 0; j < cols; j++) { 
+        mat[row_start+j] =  gf->multiply.w64(gf,mat[row_start+j], inverse);
+      }
+    }
+
+    /* Now for each j>i, add A_ji*Ai to Aj  */
+    k = row_start+i;
+    for (j = i+1; j != cols; j++) {
+      k += cols;
+      if (mat[k] != 0) {
+        if (mat[k] == 1) {
+          rs2 = cols*j;
+          for (x = 0; x < cols; x++) {
+            mat[rs2+x] ^= mat[row_start+x];
+          }
+        } else {
+          tmp = mat[k];
+          rs2 = cols*j;
+          for (x = 0; x < cols; x++) {
+            mat[rs2+x] ^=  gf->multiply.w64(gf,tmp,mat[row_start+x]);
+          }
+        }
+      }
+    }
+  }
+  return 1;
+}
+
+
+
+
+
+mylong*  readFullFile(int n, int t, mylong& sizeFile, mylong & padded_size) {
+
+//  ifstream stream("lena.png", ios::in | ios::binary | ios::ate);
+//  ifstream stream("lena_small.png", ios::in | ios::binary | ios::ate);
+  ifstream stream("/home/couturie/Downloads/CARCARIASS.zip", ios::in | ios::binary | ios::ate);
+
+  sizeFile=stream.tellg();
+  std::cout << sizeFile << std::endl;
+  stream.seekg(0, ios::beg);
+
+
+
+  
+  
+
+  vector<uint8_t> contents((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
+    
+
+
+  
+
+  
+  //make padding, we need to pad to be divisible by 8*t, we
+  if((sizeFile+8)%(8*t)!=0) {
+    cout<<(int)(sizeFile/(8*t))<<endl;
+    
+    int remainder=(8*t)*(1+(int)((sizeFile+8)/(8*t)))-sizeFile-8;
+    cout << "remainder " << remainder << endl;
+    uint8_t vec[remainder];
+    for(int i=0;i<remainder;i++)
+      vec[i]=0;
+    //add remainder elements at the end
+    contents.insert(contents.end(),vec,vec+remainder);
+    //add 8 elements at the beginning for the size
+    contents.insert(contents.begin(),vec,vec+8);
+  }
+  
+
+  
+  cout << "res contents " << contents.size() << endl;  
+
+//  for(int i=0;i<contents.size();i++)
+//    cout << (int)contents[i] << " ";
+  cout << endl;
+
+  uint8_t *p_contents=&contents[0];
+//  mylong *p_contents2=reinterpret_cast<mylong*>(p_contents);
+
+  padded_size=contents.size()/8;
+  
+  mylong *p_contents2=new mylong[padded_size];
+  memcpy(p_contents2,p_contents,sizeof(mylong)*padded_size);
+        //mylong *p_contents2=(mylong*)p_contents;
+
+  p_contents2[0]=sizeFile;
+
+  
+
+  
+/*  for(int i=0;i<padded_size;i++)
+    cout << p_contents2[i] << " ";
+  cout << endl;
+*/
+  /* long res=0;
+  for(int i=8-1;i>=0;i--) {
+    res<<=8;
+    res+=p_contents[i];
+  }
+
+  cout << "convert val " << (long)res << endl;
+
+  res=0;
+  for(int i=16-1;i>=8;i--) {
+    res<<=8;
+    res+=p_contents[i];
+  }
+
+  cout << "convert val " << (long)res << endl;
+  */
+
+  return p_contents2;
+}
+
+
+void saveFile(uint8_t *data, const char *fileName,long size_file) {
+  cout<<"size file "<<size_file<<endl;
+  FILE* pFile = fopen (fileName, "wb");
+  fwrite (data , sizeof(uint8_t), size_file, pFile);
+
+  fclose (pFile);
+}
+
+
+void readFile(uint8_t *data, const char *fileName,long size_file) {
+  cout<<"size file "<<size_file<<endl;
+  FILE* pFile = fopen (fileName, "rb");
+
+  fseek(pFile, 0L, SEEK_END);
+  int sz = ftell(pFile);
+  rewind(pFile);
+  if(sz!=size_file) {
+    cout << "error : size of this chunk is not correct !! " << endl;
+    exit(0);
+  }
+  fread (data , sizeof(uint8_t), size_file, pFile);  
+
+  fclose (pFile);
+}
+
+
+void saveFile8(mylong *data, const char *fileName,long size_file) {
+
+  cout<<"size file 8 "<<size_file<<endl;
+      display(data,1,1);    
+    FILE* pFile = fopen (fileName, "wb");
+
+
+
+    fwrite (data , sizeof(mylong), size_file, pFile);
+    fclose (pFile);
+
+
+    
+}
+
+
+int main(int argc, char **argv)
+{
+  unsigned int  w;
+  int invert;
+  mylong *matS;
+  mylong *matG;
+  mylong *matC;
+  mylong *inverse;
+  mylong *identity;
+
+
+  int size=5000000;
+  int t=4;
+  int n=8;
+
+
+  w=64;
+  gf_t gf;
+  gf_init_easy(&gf, w);  
+
+  mylong padded_size;
+  mylong sizeFile;
+  matS=readFullFile(n,t,sizeFile,padded_size);
+
+  cout<<padded_size*8<<endl;
+  
+/* for(int i=0;i<padded_size;i++)
+    cout << matS[i] << " ";
+  cout << endl;
+*/
+  
+  int len=padded_size/t;
+//  int len=size/t;
+  cout<<" len "<<len<<" "<<padded_size<<endl;
+
+  // matS = malloc(sizeof(mylong)*t*len);
+  matG = malloc(sizeof(mylong)*t*n);
+
+
+
+
+  srand48(time(0));
+  std::srand ( unsigned ( std::time(0) ) );
+  
+/*
+  for(int i=0;i<t;i++) { 
+    for(int j=0;j<len;j++) {
+      matS[i*len+j]=lrand48()<<32|lrand48();
+    }
+  }
+  */
+
+  for(int i=0;i<n;i++) { 
+    for(int j=0;j<t;j++) {
+      matG[i*t+j]=lrand48()<<32|lrand48();
+    }
+  }
+
+
+
+  printf("Matrix S:\n");
+//  display(matS, len, t);
+  display(matS, t, t);
+
+  printf("Matrix G:\n");
+  display(matG, n, t);
+
+
+  auto start = std::chrono::system_clock::now();
+  matC=matrix_multiply(&gf, matG, matS, n, t, t, len, w);
+  auto end = std::chrono::system_clock::now();
+  std::chrono::duration<double> elapsed_seconds = end-start;
+  std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
+
+//  display(matC,t,t);
+
+  
+  //Save trunks
+  for(int i=0;i<n;i++) {
+    stringstream ss;
+    ss <<"lena_"<<i<<".png";
+    string str = ss.str();
+    saveFile((uint8_t*)&matC[i*len], str.c_str(),len*sizeof(mylong));
+  }
+
+  
+
+  mylong *matCs = malloc(sizeof(mylong)*t*len);
+  mylong *matGs = malloc(sizeof(mylong)*t*t);
+
+
+  std::vector<int> myvector;
+  
+  // set some values:
+  for (int i=0; i<n; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
+
+  // using built-in random generator:
+  random_shuffle ( myvector.begin(), myvector.end() );
+
+
+
+  std::cout << "random chunk" << std::endl;  
+  int ind=0;
+  for(int ii=0;ii<t;ii++) {
+//  for(int i=n-1;i>=t;i--) {
+//  for(int i=0;i<n;i+=2) {
+
+    auto i=myvector[ii];
+    std::cout << myvector[i] << " ";
+
+
+    stringstream ss;
+    ss <<"lena_"<<i<<".png";
+    string str = ss.str();
+    readFile((uint8_t*)&matCs[ind*len], str.c_str(),len*sizeof(mylong));
+
+//    display(&matCs[ind*len],1,1);
+//    display(&matC[i*len],1,1);
+    
+    /*for(int j=0;j<len;j++) {
+      matCs[ind*len+j]=matC[i*len+j];
+      }*/
+    
+
+    
+    for(int j=0;j<t;j++) {
+      matGs[ind*t+j]=matG[i*t+j];
+    }
+    ind++;
+  }
+  std::cout << std::endl;
+
+  
+  printf("Matrix Gs:\n");
+  display(matGs, t, t);
+
+//  printf("Matrix Cs:\n");
+//  display(matCs, t, len);
+  
+  mylong* matGs_copy = malloc(sizeof(mylong)* t*t);
+
+  //WARNING invert changes the matrix
+//  invert = invertible_matrix(&gf,matGs, t, w);
+//  printf("\nInvertible Gs: %s\n", (invert == 1) ? "Yes" : "No");
+
+  memcpy(matGs_copy, matGs, sizeof(mylong)*t*t);
+  mylong *matInvGs = malloc(sizeof(mylong)*t*t);
+  invert_matrix(&gf, matGs_copy, matInvGs, t);
+
+  /*
+  WARNING   this changes matGs
+  identity=matrix_multiply(&gf, matInvGs, matGs, t, t, t, t, w);
+  printf("Identity:\n");
+  display(identity, t, t);
+  */
+
+  
+  //printf("Matrix Gs:\n");
+  //display(matGs, t, t);
+  
+  mylong *matS2 = malloc(sizeof(mylong)*t*len);
+
+
+  start = std::chrono::system_clock::now();
+  matS2=matrix_multiply(&gf, matInvGs, matCs, t, t, t, len, w);
+  end = std::chrono::system_clock::now();
+  elapsed_seconds = end-start;
+  std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
+
+
+  printf("Matrix S2:\n");
+//  display(matS2, len, t);
+  display(matS2, t, t);
+  
+  int equal=1;
+  for(int i=0;i<padded_size && equal;i++) {
+      equal=matS[i]==matS2[i];
+//      if(!equal)
+//     printf("ARGH\n");
+  }
+  if(equal)
+    printf("EQUAL !!!\n");
+
+
+  mylong new_size=matS2[0];
+  cout << "size of data " << new_size << endl;
+
+  
+  //first elements that contains the size is removed
+  uint8_t *reconstucted_data=reinterpret_cast<uint8_t*>(&matS2[1]);
+  saveFile(reconstucted_data, "lena2.png",new_size);
+  return 0;
+}
+
diff --git a/IDA/lena_small.png b/IDA/lena_small.png
deleted file mode 100644 (file)
index 872ef3a..0000000
Binary files a/IDA/lena_small.png and /dev/null differ
diff --git a/IDA/lena_small2.png b/IDA/lena_small2.png
deleted file mode 100644 (file)
index d02501f..0000000
Binary files a/IDA/lena_small2.png and /dev/null differ
index 34d24c2e4ab4e30f54365e1ad3477bc2c18998d2..90f4369cfb9f567d7511a04162151799d18f3625 100644 (file)
@@ -4,13 +4,14 @@
 #include<stdlib.h>
 #include <stdint.h>
 #include <string.h>
+#include <sys/time.h>
 #include"aes.h"
 #define CTR 1
 
 
 
 
-const int size_mesg=64;
+const int size_mesg=1024;
 
 typedef unsigned char byte;
 
@@ -19,6 +20,22 @@ typedef unsigned char byte;
 
 
 
+double TimeStart()
+{
+  struct timeval tstart;
+  gettimeofday(&tstart,0);
+  return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
+}
+
+double TimeStop(double t)
+{
+  struct timeval tend;
+
+  gettimeofday(&tend,0);
+  t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
+  return (t);
+}
+
 
 
 
@@ -63,26 +80,46 @@ int main(int argc, char** argv) {
   for(int i=0;i<size_mesg;i++) {
     plain[i]=i;
   }
-  for(int i=0;i<size_mesg;i++) {
+/*  for(int i=0;i<size_mesg;i++) {
     printf("%d ",plain[i]);
   }
   printf("\n\n");
-  
+*/
   struct AES_ctx ctx;
-  rc4key(mykey, 8);
 
+  int nb_times=1000;
+  
+  double time=0;
+  double t=TimeStart();
+  for(int i=0;i<nb_times;i++)
+    rc4key(mykey, 8);
+  time+=TimeStop(t);
+  printf("time generate sbox %f\n",time);
+  
     
 //  AES_init_ctx_iv(&ctx, mykey, iv);
-  My_KeyExpansion(ctx.RoundKey, mykey);
-  memcpy (ctx.Iv, iv, AES_BLOCKLEN);
-  My_AES_CTR_xcrypt_buffer(&ctx, plain, size_mesg);
+  time=0;
+  t=TimeStart();
+  for(int i=0;i<nb_times;i++) {
+    My_KeyExpansion(ctx.RoundKey, mykey);
+    memcpy (ctx.Iv, iv, AES_BLOCKLEN);
+  }
 
+  time+=TimeStop(t);
+  printf("time key expansion %f\n",time);
 
+  time=0;
+  t=TimeStart();
+  for(int i=0;i<nb_times;i++)
+    My_AES_CTR_xcrypt_buffer(&ctx, plain, size_mesg);
+  time+=TimeStop(t);
+  printf("time cipher %f size %d\n",time,size_mesg);
 
-  for(int i=0;i<size_mesg;i++) {
+
+/*  for(int i=0;i<size_mesg;i++) {
     printf("%d ",plain[i]);
   }
-
+*/
   printf("\n\n");
 //  AES_init_ctx_iv(&ctx, mykey, iv);
   My_KeyExpansion(ctx.RoundKey, mykey);
@@ -92,9 +129,9 @@ int main(int argc, char** argv) {
   My_AES_CTR_xcrypt_buffer(&ctx, plain, size_mesg);
 
 
-  for(int i=0;i<size_mesg;i++) {
+  /* for(int i=0;i<size_mesg;i++) {
     printf("%d ",plain[i]);
-  }
+    }*/
 
   printf("\n\n");