1 /*
2  *    Copyright (C) 1998,1999,2000,2002 Nikos Mavroyanopoulos
3  *
4  *    This program is free software; you can redistribute it and/or modify
5  *    it under the terms of the GNU General Public License as published by
6  *    the Free Software Foundation; either version 2 of the License, or
7  *    (at your option) any later version.
8  *
9  *    This program is distributed in the hope that it will be useful,
10  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *    GNU General Public License for more details.
13  *
14  *    You should have received a copy of the GNU General Public License
15  *    along with this program; if not, write to the Free Software
16  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 
19 #include "../include/mutils/mcrypt.h"
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 
24 /* Prints plaintext and ciphertext in hex for all the algorithms */
25 
26 #define ALGORITHMS_DIR "../modules/algorithms/.libs"
27 #define MODES_DIR "../modules/modes/.libs"
28 /* #define ALGORITHMS_DIR NULL
29  * #define MODES_DIR NULL
30  */
31 #define TEXT "a small text, just to test the implementation"
32 
main()33 int main()
34 {
35 	MCRYPT td, td2;
36 	int i, t, imax;
37 	int j, jmax, ivsize;
38 	int x = 0, siz;
39 	char **names;
40 	char **modes;
41 	char *text;
42 	unsigned char *IV;
43 	unsigned char *key;
44 	int keysize;
45 
46 	names = mcrypt_list_algorithms (ALGORITHMS_DIR, &jmax);
47 	modes = mcrypt_list_modes (MODES_DIR, &imax);
48 
49 	if (names==NULL || modes==NULL) {
50 		fprintf(stderr, "Error getting algorithms/modes\n");
51 		exit(1);
52 	}
53 
54 	for (j=0;j<jmax;j++) {
55 		printf( "Algorithm: %s... ", names[j]);
56 
57 		if (mcrypt_module_self_test( names[j], ALGORITHMS_DIR)==0) {
58 			printf( "ok\n");
59 		} else {
60 			x=1;
61 			printf( "\n");
62 		}
63 		printf( "Modes:\n");
64 			for (i=0;i<imax;i++) {
65 				td = mcrypt_module_open(names[j], ALGORITHMS_DIR, modes[i], MODES_DIR);
66 				td2 = mcrypt_module_open(names[j], ALGORITHMS_DIR, modes[i], MODES_DIR);
67 				if (td != MCRYPT_FAILED && td2 != MCRYPT_FAILED) {
68 					keysize = mcrypt_enc_get_key_size(td);
69 					key = calloc(1, keysize);
70 					if (key==NULL) exit(1);
71 
72 					for (t=0;t<keysize;t++)
73 						key[t] = (t % 255) + 13;
74 
75 					ivsize = mcrypt_enc_get_iv_size(td);
76 					if (ivsize>0) {
77 						IV = calloc( 1, ivsize);
78 						if (IV==NULL) exit(1);
79 						for (t=0;t<ivsize;t++)
80 							IV[t] = (t*2 % 255) + 15;
81 					}
82 					if (mcrypt_generic_init( td, key, keysize, IV) < 0) {
83 						fprintf(stderr, "Failed to Initialize algorithm!\n");
84 						return -1;
85 					}
86 
87 					if (mcrypt_enc_is_block_mode(td)!=0)
88 						siz = (strlen(TEXT) / mcrypt_enc_get_block_size(td))*mcrypt_enc_get_block_size(td);
89 					else siz = strlen(TEXT);
90 
91 					text = calloc( 1, siz);
92 					if (text==NULL) exit(1);
93 
94 					memmove( text, TEXT, siz);
95 
96 					mcrypt_generic( td, text, siz);
97 
98 					if (mcrypt_generic_init( td2, key, keysize, IV) < 0) {
99 						fprintf(stderr, "Failed to Initialize algorithm!\n");
100 						return -1;
101 					}
102 
103 					mdecrypt_generic( td2, text, siz);
104 					if ( memcmp( text, TEXT, siz) == 0) {
105 						printf( "   %s: ok\n", modes[i]);
106 					} else {
107 						printf( "   %s: failed\n", modes[i]);
108 						x=1;
109 					}
110 					mcrypt_generic_deinit(td);
111 					mcrypt_generic_deinit(td2);
112 					mcrypt_module_close(td);
113 					mcrypt_module_close(td2);					free(text);
114 					free(key);
115 					if (ivsize>0) free(IV);
116 				}
117 			}
118 		printf("\n");
119 
120 	}
121 	mcrypt_free_p(names, jmax);
122 	mcrypt_free_p(modes, imax);
123 
124 
125 	if (x>0) fprintf(stderr, "\nProbably some of the algorithms listed above failed. "
126 				"Try not to use these algorithms, and file a bug report to mcrypt-dev@lists.hellug.gr\n\n");
127 	return x;
128 }
129