/[mcrypt]/libmcrypt/lib/mcrypt.c
ViewVC logotype

Annotation of /libmcrypt/lib/mcrypt.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (hide annotations)
Tue Jan 23 17:45:09 2001 UTC (23 years, 2 months ago) by nmav
Branch: MAIN
Changes since 1.9: +8 -1 lines
File MIME type: text/plain
added mcrypt_generic_deinit() function

1 nmav 1.1 /*
2     * Copyright (C) 1998,1999,2000 Nikos Mavroyanopoulos
3     *
4     * This library is free software; you can redistribute it and/or modify it
5     * under the terms of the GNU Library General Public License as published
6     * by the Free Software Foundation; either version 2 of the License, or
7     * (at your option) any later version.
8     *
9     * This library 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 GNU
12     * Library General Public License for more details.
13     *
14     * You should have received a copy of the GNU Library General Public
15     * License along with this library; if not, write to the
16     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17     * Boston, MA 02111-1307, USA.
18     */
19    
20 nmav 1.10 /* $Id: mcrypt.c,v 1.9 2001/01/23 11:51:19 nmav Exp $ */
21 nmav 1.1
22     /* Changed by Steve Underwood 1999/12/10 to allow an arbitrary number of
23     * streams of encryption. Currently the resulting code is probably not
24     * thread safe, but as far as I could tell the previous code wasn't
25     * either. This version has brute force locking in a lot of places, but
26     * it has not been tested in a multi-threaded manner.
27     * The key locking issue is that the table of encryption streams could
28     * be moved when it is extended. Any address pre-calculated, or in
29     * calculation at the time of the reallocation would be screwed.
30     * This won't happen often, but requires lots of locks - PITA!
31     */
32    
33     /* Changed again at 1999/12/15 to correct the thread safeness. Now it
34     * seems to be thread safe. Brute force locking was removed and
35     * locks per thread were introduced.
36     * --nikos
37     */
38    
39 nmav 1.5 /* The above comments are too old! */
40    
41 nmav 1.1 #ifndef LIBDEFS_H
42     #define LIBDEFS_H
43     #include <libdefs.h>
44     #endif
45     #include <bzero.h>
46     #include <xmemory.h>
47     #include <mcrypt_internal.h>
48    
49     #if 0
50     static int preloaded_symbols = 0;
51     #endif
52    
53 nmav 1.2 static int internal_end_mcrypt(MCRYPT td);
54 nmav 1.1
55 nmav 1.2 static int internal_init_mcrypt(MCRYPT td, void *key, int lenofkey, void *IV)
56 nmav 1.1 {
57     int *sizes = NULL;
58     int num_of_sizes, i, ok = 0;
59 nmav 1.9 int key_size = mcrypt_enc_get_key_size(td);
60    
61     if (lenofkey > key_size || lenofkey==0) {
62     return MCRYPT_KEY_LEN_ERROR; /* error */
63 nmav 1.1 }
64 nmav 1.6
65 nmav 1.1 sizes = mcrypt_enc_get_supported_key_sizes(td, &num_of_sizes);
66     if (sizes != NULL) {
67     for (i = 0; i < num_of_sizes; i++) {
68     if (lenofkey == sizes[i]) {
69     ok = 1;
70     break;
71     }
72     }
73     } else { /* sizes==NULL */
74     if (num_of_sizes == 0
75     && lenofkey <= mcrypt_enc_get_key_size(td))
76     ok = 1;
77     }
78    
79 nmav 1.5
80     if (ok == 0) { /* not supported key size */
81     key_size = mcrypt_enc_get_key_size(td);
82     if (sizes != NULL) {
83     for (i = 0; i < num_of_sizes; i++) {
84     if (lenofkey <= sizes[i]) {
85     key_size = sizes[i];
86     break;
87     }
88     }
89 nmav 1.7 } else { /* well every key size is supported! */
90     key_size = lenofkey;
91 nmav 1.5 }
92     } else {
93     key_size = lenofkey;
94 nmav 1.6 }
95 nmav 1.7
96     if (sizes!=NULL) free(sizes);
97 nmav 1.6
98 nmav 1.1 td->keyword_given = mxcalloc(1, mcrypt_enc_get_key_size(td));
99 nmav 1.9 if (td->keyword_given==NULL) return MCRYPT_MEMORY_ALLOCATION_ERROR;
100    
101 nmav 1.1 memmove(td->keyword_given, key, lenofkey);
102     td->akey = mxcalloc(1, mcrypt_get_size(td));
103 nmav 1.9 if (td->akey==NULL) return MCRYPT_MEMORY_ALLOCATION_ERROR;
104    
105 nmav 1.1 td->abuf = mxcalloc(1, mcrypt_mode_get_size(td));
106 nmav 1.9 if (td->abuf==NULL) return MCRYPT_MEMORY_ALLOCATION_ERROR;
107 nmav 1.1
108 nmav 1.5 init_mcrypt(td, td->abuf, key, key_size, IV);
109 nmav 1.1
110 nmav 1.8 ok = mcrypt_set_key(td,
111 nmav 1.1 (void *) td->akey,
112     (void *) td->keyword_given,
113 nmav 1.5 key_size, IV, mcrypt_enc_get_iv_size(td));
114 nmav 1.8
115     if (ok!=0) return MCRYPT_UNKNOWN_ERROR; /* algorithm error */
116 nmav 1.1
117     if (td->akey == NULL) {
118     internal_end_mcrypt(td);
119     return MCRYPT_UNKNOWN_ERROR;
120     }
121     return 0;
122     }
123    
124 nmav 1.3 static int internal_end_mcrypt(MCRYPT td)
125 nmav 1.1 {
126     mxfree(td->keyword_given, mcrypt_enc_get_key_size(td));
127     td->keyword_given = NULL;
128    
129     mxfree(td->akey, mcrypt_get_size(td));
130     td->akey = NULL;
131    
132     end_mcrypt(td, td->abuf);
133     mxfree(td->abuf, mcrypt_mode_get_size(td));
134     td->abuf = NULL;
135    
136     return 0;
137     }
138    
139     /* Generic - High level functions */
140    
141 nmav 1.3 WIN32DLL_DEFINE
142 nmav 1.1 int mcrypt_generic_init(const MCRYPT td, void *key, int lenofkey, void *IV)
143     {
144     return internal_init_mcrypt(td, key, lenofkey, IV);
145     }
146    
147 nmav 1.3 WIN32DLL_DEFINE
148 nmav 1.1 int mcrypt_generic(MCRYPT td, void *plaintext, int len)
149     {
150     int x;
151    
152     x = mcrypt(td, td->abuf, plaintext, len);
153     return x;
154     }
155    
156 nmav 1.3 WIN32DLL_DEFINE
157 nmav 1.1 int mdecrypt_generic(MCRYPT td, void *ciphertext, int len)
158     {
159     int x;
160     x = mdecrypt(td, td->abuf, ciphertext, len);
161     return x;
162     }
163    
164 nmav 1.3 WIN32DLL_DEFINE
165 nmav 1.1 int mcrypt_generic_end(const MCRYPT td)
166     {
167     internal_end_mcrypt(td);
168     mcrypt_module_close(td);
169 nmav 1.10 return 0;
170     }
171    
172     WIN32DLL_DEFINE
173     int mcrypt_generic_deinit(const MCRYPT td)
174     {
175     internal_end_mcrypt(td);
176 nmav 1.1 return 0;
177     }
178    
179 nmav 1.3 WIN32DLL_DEFINE
180 nmav 1.1 void mcrypt_perror(int err)
181     {
182    
183     switch (err) {
184     case MCRYPT_UNKNOWN_ERROR:
185     fprintf(stderr, "Unknown error.\n");
186     break;
187     case MCRYPT_ALGORITHM_MODE_INCOMPATIBILITY:
188     fprintf(stderr,
189     "Algorithm incompatible with this mode.\n");
190     break;
191     case MCRYPT_KEY_LEN_ERROR:
192     fprintf(stderr, "Key length is not legal.\n");
193     break;
194     case MCRYPT_MEMORY_ALLOCATION_ERROR:
195     fprintf(stderr, "Memory allocation failed.\n");
196     break;
197     case MCRYPT_UNKNOWN_MODE:
198     fprintf(stderr, "Unknown mode.\n");
199     break;
200     case MCRYPT_UNKNOWN_ALGORITHM:
201     fprintf(stderr, "Unknown algorithm.\n");
202     break;
203    
204     }
205     return;
206 nmav 1.4 }
207    
208     WIN32DLL_DEFINE
209     char* mcrypt_strerror(int err)
210     {
211     char* cerr=malloc(256);
212 nmav 1.9 if (cerr==NULL) return NULL;
213 nmav 1.4
214     switch (err) {
215     case MCRYPT_UNKNOWN_ERROR:
216     sprintf(cerr, "Unknown error.\n");
217     break;
218     case MCRYPT_ALGORITHM_MODE_INCOMPATIBILITY:
219     sprintf(cerr,
220     "Algorithm incompatible with this mode.\n");
221     break;
222     case MCRYPT_KEY_LEN_ERROR:
223     sprintf(cerr, "Key length is not legal.\n");
224     break;
225     case MCRYPT_MEMORY_ALLOCATION_ERROR:
226     sprintf(cerr, "Memory allocation failed.\n");
227     break;
228     case MCRYPT_UNKNOWN_MODE:
229     sprintf(cerr, "Unknown mode.\n");
230     break;
231     case MCRYPT_UNKNOWN_ALGORITHM:
232     sprintf(cerr, "Unknown algorithm.\n");
233     break;
234    
235     }
236     return cerr;
237 nmav 1.1 }
238    
239 nmav 1.3 WIN32DLL_DEFINE
240 nmav 1.1 int mcrypt_free(void *ptr)
241     {
242     free(ptr);
243     return 0;
244     }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26