]> AND Private Git Repository - Cipher_code.git/blob - OneRoundIoT/openssl/openssl_evp_ebc.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
e4fea7432fec9c2427c9bf626bf482dba379cb25
[Cipher_code.git] / OneRoundIoT / openssl / openssl_evp_ebc.c
1 //gcc pixmap_io.c  -c
2 //gcc openssl_evp_ebc.c pixmap_io.o -o openssl_evp_ebc -I /usr/include/openssl/ -lcrypto -O3 -std=c99 
3
4
5 #include <openssl/conf.h>
6 #include <openssl/evp.h>
7 #include <openssl/err.h>
8 #include <openssl/ssl.h>
9 #include <openssl/bio.h>
10 #include <string.h>
11 #include <sys/time.h>
12 #include "pixmap_io.h"
13
14 typedef unsigned char   uchar;
15
16
17 double TimeStart()
18 {
19   struct timeval tstart;
20   gettimeofday(&tstart,0);
21   return( (double) (tstart.tv_sec + tstart.tv_usec*1e-6) );
22 }
23
24 double TimeStop(double t)
25 {
26   struct timeval tend;
27
28   gettimeofday(&tend,0);
29   t = (double) (tend.tv_sec + tend.tv_usec*1e-6) - t;
30   return (t);
31 }
32
33
34 void handleErrors(void)
35 {
36   ERR_print_errors_fp(stderr);
37   abort();
38 }
39
40
41 int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
42   unsigned char *iv, unsigned char *ciphertext)
43 {
44   EVP_CIPHER_CTX *ctx;
45
46   int len;
47
48   int ciphertext_len;
49
50   /* Create and initialise the context */
51   if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
52
53   /* Initialise the encryption operation. IMPORTANT - ensure you use a key
54    * and IV size appropriate for your cipher
55    * In this example we are using 256 bit AES (i.e. a 256 bit key). The
56    * IV size for *most* modes is the same as the block size. For AES this
57    * is 128 bits */
58
59   //256
60   //avant ecb
61   if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv))
62     handleErrors();
63
64 //  int cipherBlockSize = EVP_CIPHER_CTX_block_size(ctx);  
65 //  printf("INFO(evp_encrypt): block size: %d\n", cipherBlockSize);
66
67   
68   /* Provide the message to be encrypted, and obtain the encrypted output.
69    * EVP_EncryptUpdate can be called multiple times if necessary
70    */
71
72   if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
73     handleErrors();
74   ciphertext_len = len;
75
76   
77
78
79
80
81   
82   /* Finalise the encryption. Further ciphertext bytes may be written at
83    * this stage.
84    */
85   if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();
86   ciphertext_len += len;
87
88   /* Clean up */
89   EVP_CIPHER_CTX_free(ctx);
90
91   return ciphertext_len;
92 }
93
94 int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
95   unsigned char *iv, unsigned char *plaintext)
96 {
97   EVP_CIPHER_CTX *ctx;
98
99   int len;
100
101   int plaintext_len;
102
103   /* Create and initialise the context */
104   if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
105
106   /* Initialise the decryption operation. IMPORTANT - ensure you use a key
107    * and IV size appropriate for your cipher
108    * In this example we are using 256 bit AES (i.e. a 256 bit key). The
109    * IV size for *most* modes is the same as the block size. For AES this
110    * is 128 bits */
111
112   //256
113
114   //avant => ecb
115   if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, iv))
116     handleErrors();
117
118   /* Provide the message to be decrypted, and obtain the plaintext output.
119    * EVP_DecryptUpdate can be called multiple times if necessary
120    */
121   
122  
123   if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
124     handleErrors();
125   plaintext_len = len;
126
127   /* Finalise the decryption. Further plaintext bytes may be written at
128    * this stage.
129    */
130   if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
131   plaintext_len += len;
132
133   /* Clean up */
134   EVP_CIPHER_CTX_free(ctx);
135
136   return plaintext_len;
137 }
138
139
140 int main (int argc, char** argv)
141 {
142   /* Set up the key and iv. Do I need to say to not hard code these in a
143    * real application? :-)
144    */
145
146   /* A 256 bit key */
147 //  unsigned char *key = (unsigned char *)"01234567890123456789012345678901";
148   unsigned char *key = (unsigned char *)"0123456789012345";
149   
150   /* A 128 bit IV */
151   unsigned char *iv = (unsigned char *)"0123456789012345";
152
153   /* Message to be encrypted */
154
155  int nb_test=1;
156   if(argc==2)
157     nb_test=atoi(argv[1]);
158   if(nb_test<=0 || nb_test>10000) {
159     printf("nb tests is not correct\n");
160     exit(0);
161   }
162   else
163     printf("nb tests = %d\n\n",nb_test);
164
165
166   
167   /* Buffer for ciphertext. Ensure the buffer is long enough for the
168    * ciphertext which may be longer than the plaintext, dependant on the
169    * algorithm and mode
170    */
171
172   int width;
173   int height;
174   uchar *data_R, *data_G, *data_B;
175   load_RGB_pixmap("lena.ppm", &width, &height, &data_R, &data_G, &data_B);
176
177
178 //  load_RGB_pixmap("No_ecb_mode_picture.ppm", &width, &height, &data_R, &data_G, &data_B);
179 //  load_RGB_pixmap("4096.ppm", &width, &height, &data_R, &data_G, &data_B);
180   int size=width*height*3;
181
182   int oneD=width*height;
183   uchar *plaintext = malloc(size);
184
185   
186   for(int i=0;i<oneD;i++) {
187     plaintext[i]=data_R[i];
188     plaintext[oneD+i]=data_G[i];
189     plaintext[2*oneD+i]=data_B[i];
190   }
191
192   
193
194   uchar *ciphertext = malloc(size);
195
196   /* Buffer for the decrypted text */
197   uchar *decryptedtext = malloc(size);
198
199   int decryptedtext_len, ciphertext_len;
200
201  
202   int ss=0;
203    double time=0;
204   double t=TimeStart();
205
206   
207   /* Encrypt the plaintext */
208
209
210   int i;
211
212   for(i=0;i<nb_test;i++)
213   {  
214     ciphertext_len = encrypt (plaintext, size, key, iv,
215                               ciphertext);
216   }
217   
218  time+=TimeStop(t);
219
220  printf("Time encrypt %f \n",time);
221
222
223  for(int i=0;i<oneD;i++) {
224     data_R[i]=ciphertext[i];
225     data_G[i]=ciphertext[oneD+i];
226     data_B[i]=ciphertext[2*oneD+i];
227   }
228   store_RGB_pixmap("lena2.ppm", data_R, data_G, data_B, width, height);            
229  
230   
231   time=0;
232   t=0;
233   t=TimeStart();
234
235   for(int i=0;i<nb_test;i++)
236   {  
237     /* Decrypt the ciphertext */
238     decryptedtext_len = decrypt(ciphertext, ciphertext_len, key, iv,
239                                 decryptedtext);
240   }
241
242  time+=TimeStop(t);
243
244  printf("Time decrypt %f\n",time);
245
246
247   for(int i=0;i<oneD;i++) {
248     data_R[i]=decryptedtext[i];
249     data_G[i]=decryptedtext[oneD+i];
250     data_B[i]=decryptedtext[2*oneD+i];
251   }
252   store_RGB_pixmap("lena3.ppm", data_R, data_G, data_B, width, height);             
253
254   
255
256   /* Clean up */
257   EVP_cleanup();
258   ERR_free_strings();
259
260   return 0;
261 }