Add tests for OCB mode
[openssl.git] / crypto / evp / evp_test.c
1 /* Written by Ben Laurie, 2001 */
2 /*
3  * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer. 
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in
14  *    the documentation and/or other materials provided with the
15  *    distribution.
16  *
17  * 3. All advertising materials mentioning features or use of this
18  *    software must display the following acknowledgment:
19  *    "This product includes software developed by the OpenSSL Project
20  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21  *
22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23  *    endorse or promote products derived from this software without
24  *    prior written permission. For written permission, please contact
25  *    openssl-core@openssl.org.
26  *
27  * 5. Products derived from this software may not be called "OpenSSL"
28  *    nor may "OpenSSL" appear in their names without prior written
29  *    permission of the OpenSSL Project.
30  *
31  * 6. Redistributions of any form whatsoever must retain the following
32  *    acknowledgment:
33  *    "This product includes software developed by the OpenSSL Project
34  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47  * OF THE POSSIBILITY OF SUCH DAMAGE.
48  */
49
50 #include <stdio.h>
51 #include <string.h>
52
53 #include "../e_os.h"
54
55 #include <openssl/opensslconf.h>
56 #include <openssl/evp.h>
57 #ifndef OPENSSL_NO_ENGINE
58 #include <openssl/engine.h>
59 #endif
60 #include <openssl/err.h>
61 #include <openssl/conf.h>
62
63 static void hexdump(FILE *f,const char *title,const unsigned char *s,int l)
64     {
65     int n=0;
66
67     fprintf(f,"%s",title);
68     for( ; n < l ; ++n)
69         {
70         if((n%16) == 0)
71             fprintf(f,"\n%04x",n);
72         fprintf(f," %02x",s[n]);
73         }
74     fprintf(f,"\n");
75     }
76
77 static int convert(unsigned char *s)
78     {
79     unsigned char *d;
80
81     for(d=s ; *s ; s+=2,++d)
82         {
83         unsigned int n;
84
85         if(!s[1])
86             {
87             fprintf(stderr,"Odd number of hex digits!");
88             EXIT(4);
89             }
90         sscanf((char *)s,"%2x",&n);
91         *d=(unsigned char)n;
92         }
93     return s-d;
94     }
95
96 static char *sstrsep(char **string, const char *delim)
97     {
98     char isdelim[256];
99     char *token = *string;
100
101     if (**string == 0)
102         return NULL;
103
104     memset(isdelim, 0, 256);
105     isdelim[0] = 1;
106
107     while (*delim)
108         {
109         isdelim[(unsigned char)(*delim)] = 1;
110         delim++;
111         }
112
113     while (!isdelim[(unsigned char)(**string)])
114         {
115         (*string)++;
116         }
117
118     if (**string)
119         {
120         **string = 0;
121         (*string)++;
122         }
123
124     return token;
125     }
126
127 static unsigned char *ustrsep(char **p,const char *sep)
128     { return (unsigned char *)sstrsep(p,sep); }
129
130 static int test1_exit(int ec)
131         {
132         EXIT(ec);
133         return(0);              /* To keep some compilers quiet */
134         }
135
136 /* Test copying of contexts */
137 static void test_ctx_replace(EVP_CIPHER_CTX **pctx)
138         {
139         /* Make copy of context and replace original */
140         EVP_CIPHER_CTX *ctx_copy;
141         ctx_copy = EVP_CIPHER_CTX_new();
142         EVP_CIPHER_CTX_copy(ctx_copy, *pctx);
143         EVP_CIPHER_CTX_free(*pctx);
144         *pctx = ctx_copy;
145         }
146
147 static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
148                   const unsigned char *iv,int in,
149                   const unsigned char *plaintext,int pn,
150                   const unsigned char *ciphertext,int cn,
151                   const unsigned char *aad,int an,
152                   const unsigned char *tag,int tn,
153                   int encdec)
154     {
155     EVP_CIPHER_CTX *ctx = NULL;
156     unsigned char out[4096];
157     int outl,outl2,mode;
158
159     printf("Testing cipher %s%s\n",EVP_CIPHER_name(c),
160            (encdec == 1 ? "(encrypt)" : (encdec == 0 ? "(decrypt)" : "(encrypt/decrypt)")));
161     hexdump(stdout,"Key",key,kn);
162     if(in)
163         hexdump(stdout,"IV",iv,in);
164     hexdump(stdout,"Plaintext",plaintext,pn);
165     hexdump(stdout,"Ciphertext",ciphertext,cn);
166     if (an)
167         hexdump(stdout,"AAD",aad,an);
168     if (tn)
169         hexdump(stdout,"Tag",tag,tn);
170     mode = EVP_CIPHER_mode(c); 
171     if(kn != EVP_CIPHER_key_length(c))
172         {
173         fprintf(stderr,"Key length doesn't match, got %d expected %lu\n",kn,
174                 (unsigned long)EVP_CIPHER_key_length(c));
175         test1_exit(5);
176         }
177     ctx = EVP_CIPHER_CTX_new();
178     EVP_CIPHER_CTX_set_flags(ctx,EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
179     if (encdec != 0)
180         {
181         if ((mode == EVP_CIPH_GCM_MODE) || (mode == EVP_CIPH_OCB_MODE))
182             {
183             if(!EVP_EncryptInit_ex(ctx,c,NULL,NULL,NULL))
184                 {
185                 fprintf(stderr,"EncryptInit failed\n");
186                 ERR_print_errors_fp(stderr);
187                 test1_exit(10);
188                 }
189             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_IVLEN, in, NULL))
190                 {
191                 fprintf(stderr,"IV length set failed\n");
192                 ERR_print_errors_fp(stderr);
193                 test1_exit(11);
194                 }
195             if((mode == EVP_CIPH_OCB_MODE) &&
196                 !EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_OCB_SET_TAGLEN, tn, NULL))
197                 {
198                 fprintf(stderr,"Tag length set failed\n");
199                 ERR_print_errors_fp(stderr);
200                 test1_exit(15);
201                 }
202             if(!EVP_EncryptInit_ex(ctx,NULL,NULL,key,iv))
203                 {
204                 fprintf(stderr,"Key/IV set failed\n");
205                 ERR_print_errors_fp(stderr);
206                 test1_exit(12);
207                 }
208             if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
209                 {
210                 fprintf(stderr,"AAD set failed\n");
211                 ERR_print_errors_fp(stderr);
212                 test1_exit(13);
213                 }
214             }
215         else if (mode == EVP_CIPH_CCM_MODE)
216             {
217             if(!EVP_EncryptInit_ex(ctx,c,NULL,NULL,NULL))
218                 {
219                 fprintf(stderr,"EncryptInit failed\n");
220                 ERR_print_errors_fp(stderr);
221                 test1_exit(10);
222                 }
223             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
224                 {
225                 fprintf(stderr,"IV length set failed\n");
226                 ERR_print_errors_fp(stderr);
227                 test1_exit(11);
228                 }
229             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, tn, NULL))
230                 {
231                 fprintf(stderr,"Tag length set failed\n");
232                 ERR_print_errors_fp(stderr);
233                 test1_exit(11);
234                 }
235             if(!EVP_EncryptInit_ex(ctx,NULL,NULL,key,iv))
236                 {
237                 fprintf(stderr,"Key/IV set failed\n");
238                 ERR_print_errors_fp(stderr);
239                 test1_exit(12);
240                 }
241             if (!EVP_EncryptUpdate(ctx,NULL,&outl,NULL,pn))
242                 {
243                 fprintf(stderr,"Plaintext length set failed\n");
244                 ERR_print_errors_fp(stderr);
245                 test1_exit(12);
246                 }
247             if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
248                 {
249                 fprintf(stderr,"AAD set failed\n");
250                 ERR_print_errors_fp(stderr);
251                 test1_exit(13);
252                 }
253             }
254         else if (mode == EVP_CIPH_WRAP_MODE)
255             {
256             if(!EVP_EncryptInit_ex(ctx,c,NULL,key,in ? iv : NULL))
257                 {
258                 fprintf(stderr,"EncryptInit failed\n");
259                 ERR_print_errors_fp(stderr);
260                 test1_exit(10);
261                 }
262             }
263         else if(!EVP_EncryptInit_ex(ctx,c,NULL,key,iv))
264             {
265             fprintf(stderr,"EncryptInit failed\n");
266             ERR_print_errors_fp(stderr);
267             test1_exit(10);
268             }
269         EVP_CIPHER_CTX_set_padding(ctx,0);
270
271         test_ctx_replace(&ctx);
272
273         if(!EVP_EncryptUpdate(ctx,out,&outl,plaintext,pn))
274             {
275             fprintf(stderr,"Encrypt failed\n");
276             ERR_print_errors_fp(stderr);
277             test1_exit(6);
278             }
279         if(!EVP_EncryptFinal_ex(ctx,out+outl,&outl2))
280             {
281             fprintf(stderr,"EncryptFinal failed\n");
282             ERR_print_errors_fp(stderr);
283             test1_exit(7);
284             }
285
286         if(outl+outl2 != cn)
287             {
288             fprintf(stderr,"Ciphertext length mismatch got %d expected %d\n",
289                     outl+outl2,cn);
290             test1_exit(8);
291             }
292
293         if(memcmp(out,ciphertext,cn))
294             {
295             fprintf(stderr,"Ciphertext mismatch\n");
296             hexdump(stderr,"Got",out,cn);
297             hexdump(stderr,"Expected",ciphertext,cn);
298             test1_exit(9);
299             }
300         if ((mode == EVP_CIPH_GCM_MODE) || (mode == EVP_CIPH_OCB_MODE)
301                         || (mode == EVP_CIPH_CCM_MODE))
302             {
303             unsigned char rtag[16];
304
305             if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GET_TAG, tn, rtag))
306                 {
307                 fprintf(stderr,"Get tag failed\n");
308                 ERR_print_errors_fp(stderr);
309                 test1_exit(14);
310                 }
311             if (memcmp(rtag, tag, tn))
312                 {
313                 fprintf(stderr,"Tag mismatch\n");
314                 hexdump(stderr,"Got",rtag,tn);
315                 hexdump(stderr,"Expected",tag,tn);
316                 test1_exit(9);
317                 }
318             }
319         }
320
321     if (encdec <= 0)
322         {
323         if ((mode == EVP_CIPH_GCM_MODE) || (mode == EVP_CIPH_OCB_MODE))
324             {
325             if(!EVP_DecryptInit_ex(ctx,c,NULL,NULL,NULL))
326                 {
327                 fprintf(stderr,"DecryptInit failed\n");
328                 ERR_print_errors_fp(stderr);
329                 test1_exit(10);
330                 }
331             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_IVLEN, in, NULL))
332                 {
333                 fprintf(stderr,"IV length set failed\n");
334                 ERR_print_errors_fp(stderr);
335                 test1_exit(11);
336                 }
337             if((mode == EVP_CIPH_OCB_MODE) &&
338                 !EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_OCB_SET_TAGLEN, tn, NULL))
339                 {
340                 fprintf(stderr,"Tag length set failed\n");
341                 ERR_print_errors_fp(stderr);
342                 test1_exit(15);
343                 }
344             if(!EVP_DecryptInit_ex(ctx,NULL,NULL,key,iv))
345                 {
346                 fprintf(stderr,"Key/IV set failed\n");
347                 ERR_print_errors_fp(stderr);
348                 test1_exit(12);
349                 }
350             if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_TAG, tn, (void *)tag))
351                 {
352                 fprintf(stderr,"Set tag failed\n");
353                 ERR_print_errors_fp(stderr);
354                 test1_exit(14);
355                 }
356             if (an && !EVP_DecryptUpdate(ctx,NULL,&outl,aad,an))
357                 {
358                 fprintf(stderr,"AAD set failed\n");
359                 ERR_print_errors_fp(stderr);
360                 test1_exit(13);
361                 }
362             }
363         else if (mode == EVP_CIPH_CCM_MODE)
364             {
365             if(!EVP_DecryptInit_ex(ctx,c,NULL,NULL,NULL))
366                 {
367                 fprintf(stderr,"DecryptInit failed\n");
368                 ERR_print_errors_fp(stderr);
369                 test1_exit(10);
370                 }
371             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
372                 {
373                 fprintf(stderr,"IV length set failed\n");
374                 ERR_print_errors_fp(stderr);
375                 test1_exit(11);
376                 }
377             if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, tn, (void *)tag))
378                 {
379                 fprintf(stderr,"Tag length set failed\n");
380                 ERR_print_errors_fp(stderr);
381                 test1_exit(11);
382                 }
383             if(!EVP_DecryptInit_ex(ctx,NULL,NULL,key,iv))
384                 {
385                 fprintf(stderr,"Key/Nonce set failed\n");
386                 ERR_print_errors_fp(stderr);
387                 test1_exit(12);
388                 }
389             if (!EVP_DecryptUpdate(ctx,NULL,&outl,NULL,pn))
390                 {
391                 fprintf(stderr,"Plaintext length set failed\n");
392                 ERR_print_errors_fp(stderr);
393                 test1_exit(12);
394                 }
395             if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
396                 {
397                 fprintf(stderr,"AAD set failed\n");
398                 ERR_print_errors_fp(stderr);
399                 test1_exit(13);
400                 }
401             }
402         else if (mode == EVP_CIPH_WRAP_MODE)
403             {
404             if(!EVP_DecryptInit_ex(ctx,c,NULL,key,in ? iv : NULL))
405                 {
406                 fprintf(stderr,"EncryptInit failed\n");
407                 ERR_print_errors_fp(stderr);
408                 test1_exit(10);
409                 }
410             }
411         else if(!EVP_DecryptInit_ex(ctx,c,NULL,key,iv))
412             {
413             fprintf(stderr,"DecryptInit failed\n");
414             ERR_print_errors_fp(stderr);
415             test1_exit(11);
416             }
417         EVP_CIPHER_CTX_set_padding(ctx,0);
418
419         test_ctx_replace(&ctx);
420
421         if(!EVP_DecryptUpdate(ctx,out,&outl,ciphertext,cn))
422             {
423             fprintf(stderr,"Decrypt failed\n");
424             ERR_print_errors_fp(stderr);
425             test1_exit(6);
426             }
427         if(mode != EVP_CIPH_CCM_MODE && !EVP_DecryptFinal_ex(ctx,out+outl,&outl2))
428             {
429             fprintf(stderr,"DecryptFinal failed\n");
430             ERR_print_errors_fp(stderr);
431             test1_exit(7);
432             }
433
434         if(outl+outl2 != pn)
435             {
436             fprintf(stderr,"Plaintext length mismatch got %d expected %d\n",
437                     outl+outl2,pn);
438             test1_exit(8);
439             }
440
441         if(memcmp(out,plaintext,pn))
442             {
443             fprintf(stderr,"Plaintext mismatch\n");
444             hexdump(stderr,"Got",out,pn);
445             hexdump(stderr,"Expected",plaintext,pn);
446             test1_exit(9);
447             }
448         }
449
450     EVP_CIPHER_CTX_free(ctx);
451
452     printf("\n");
453     }
454
455 static int test_cipher(const char *cipher,const unsigned char *key,int kn,
456                        const unsigned char *iv,int in,
457                        const unsigned char *plaintext,int pn,
458                        const unsigned char *ciphertext,int cn,
459                        const unsigned char *aad,int an,
460                        const unsigned char *tag,int tn,
461                        int encdec)
462     {
463     const EVP_CIPHER *c;
464
465     c=EVP_get_cipherbyname(cipher);
466     if(!c)
467         return 0;
468
469     test1(c,key,kn,iv,in,plaintext,pn,ciphertext,cn,aad,an,tag,tn,encdec);
470
471     return 1;
472     }
473
474 static int test_digest(const char *digest,
475                        const unsigned char *plaintext,int pn,
476                        const unsigned char *ciphertext, unsigned int cn)
477     {
478     const EVP_MD *d;
479     EVP_MD_CTX ctx;
480     unsigned char md[EVP_MAX_MD_SIZE];
481     unsigned int mdn;
482
483     d=EVP_get_digestbyname(digest);
484     if(!d)
485         return 0;
486
487     printf("Testing digest %s\n",EVP_MD_name(d));
488     hexdump(stdout,"Plaintext",plaintext,pn);
489     hexdump(stdout,"Digest",ciphertext,cn);
490
491     EVP_MD_CTX_init(&ctx);
492     if(!EVP_DigestInit_ex(&ctx,d, NULL))
493         {
494         fprintf(stderr,"DigestInit failed\n");
495         ERR_print_errors_fp(stderr);
496         EXIT(100);
497         }
498     if(!EVP_DigestUpdate(&ctx,plaintext,pn))
499         {
500         fprintf(stderr,"DigestUpdate failed\n");
501         ERR_print_errors_fp(stderr);
502         EXIT(101);
503         }
504     if(!EVP_DigestFinal_ex(&ctx,md,&mdn))
505         {
506         fprintf(stderr,"DigestFinal failed\n");
507         ERR_print_errors_fp(stderr);
508         EXIT(101);
509         }
510     EVP_MD_CTX_cleanup(&ctx);
511
512     if(mdn != cn)
513         {
514         fprintf(stderr,"Digest length mismatch, got %d expected %d\n",mdn,cn);
515         EXIT(102);
516         }
517
518     if(memcmp(md,ciphertext,cn))
519         {
520         fprintf(stderr,"Digest mismatch\n");
521         hexdump(stderr,"Got",md,cn);
522         hexdump(stderr,"Expected",ciphertext,cn);
523         EXIT(103);
524         }
525
526     printf("\n");
527
528     EVP_MD_CTX_cleanup(&ctx);
529
530     return 1;
531     }
532
533 int main(int argc,char **argv)
534     {
535     const char *szTestFile;
536     FILE *f;
537
538     if(argc != 2)
539         {
540         fprintf(stderr,"%s <test file>\n",argv[0]);
541         EXIT(1);
542         }
543     CRYPTO_malloc_debug_init();
544     CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
545     CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
546
547     szTestFile=argv[1];
548
549     f=fopen(szTestFile,"r");
550     if(!f)
551         {
552         perror(szTestFile);
553         EXIT(2);
554         }
555     ERR_load_crypto_strings();
556     /* Load up the software EVP_CIPHER and EVP_MD definitions */
557     OpenSSL_add_all_ciphers();
558     OpenSSL_add_all_digests();
559 #ifndef OPENSSL_NO_ENGINE
560     /* Load all compiled-in ENGINEs */
561     ENGINE_load_builtin_engines();
562 #endif
563 #if 0
564     OPENSSL_config();
565 #endif
566 #ifndef OPENSSL_NO_ENGINE
567     /* Register all available ENGINE implementations of ciphers and digests.
568      * This could perhaps be changed to "ENGINE_register_all_complete()"? */
569     ENGINE_register_all_ciphers();
570     ENGINE_register_all_digests();
571     /* If we add command-line options, this statement should be switchable.
572      * It'll prevent ENGINEs being ENGINE_init()ialised for cipher/digest use if
573      * they weren't already initialised. */
574     /* ENGINE_set_cipher_flags(ENGINE_CIPHER_FLAG_NOINIT); */
575 #endif
576
577     for( ; ; )
578         {
579         char line[4096];
580         char *p;
581         char *cipher;
582         unsigned char *iv,*key,*plaintext,*ciphertext,*aad,*tag;
583         int encdec;
584         int kn,in,pn,cn;
585         int an = 0;
586         int tn = 0;
587
588         if(!fgets((char *)line,sizeof line,f))
589             break;
590         if(line[0] == '#' || line[0] == '\n')
591             continue;
592         p=line;
593         cipher=sstrsep(&p,":"); 
594         key=ustrsep(&p,":");
595         iv=ustrsep(&p,":");
596         plaintext=ustrsep(&p,":");
597         ciphertext=ustrsep(&p,":");
598         if (p[-1] == '\n') {
599             encdec = -1;
600             p[-1] = '\0';
601             tag=aad=NULL;
602             an=tn=0;
603         } else {
604             aad=ustrsep(&p,":");
605             tag=ustrsep(&p,":");
606             if (tag == NULL) {
607                 p = (char *)aad;
608                 tag=aad=NULL;
609                 an=tn=0;
610             }
611             if (p [-1] == '\n') {
612                 encdec = -1;
613                 p[-1] = '\0';
614             } else
615                 encdec = atoi(sstrsep(&p,"\n"));
616         }
617
618         kn=convert(key);
619         in=convert(iv);
620         pn=convert(plaintext);
621         cn=convert(ciphertext);
622         if (aad) {
623             an=convert(aad);
624             tn=convert(tag);
625         }
626
627         if(!test_cipher(cipher,key,kn,iv,in,plaintext,pn,ciphertext,cn,aad,an,tag,tn,encdec)
628            && !test_digest(cipher,plaintext,pn,ciphertext,cn))
629             {
630 #ifdef OPENSSL_NO_AES
631             if (strstr(cipher, "AES") == cipher)
632                 {
633                 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher); 
634                 continue;
635                 }
636 #endif
637 #ifdef OPENSSL_NO_DES
638             if (strstr(cipher, "DES") == cipher)
639                 {
640                 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher); 
641                 continue;
642                 }
643 #endif
644 #ifdef OPENSSL_NO_RC4
645             if (strstr(cipher, "RC4") == cipher)
646                 {
647                 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher); 
648                 continue;
649                 }
650 #endif
651 #ifdef OPENSSL_NO_CAMELLIA
652             if (strstr(cipher, "CAMELLIA") == cipher)
653                 {
654                 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher); 
655                 continue;
656                 }
657 #endif
658 #ifdef OPENSSL_NO_SEED
659             if (strstr(cipher, "SEED") == cipher)
660                 {
661                 fprintf(stdout, "Cipher disabled, skipping %s\n", cipher); 
662                 continue;
663                 }
664 #endif
665             fprintf(stderr,"Can't find %s\n",cipher);
666             EXIT(3);
667             }
668         }
669         fclose(f);
670
671 #ifndef OPENSSL_NO_ENGINE
672     ENGINE_cleanup();
673 #endif
674     EVP_cleanup();
675     CRYPTO_cleanup_all_ex_data();
676     ERR_remove_thread_state(NULL);
677     ERR_free_strings();
678     CRYPTO_mem_leaks_fp(stderr);
679
680     return 0;
681     }