1/*
2 * Copyright (C) 1998,1999,2002 Nikos Mavroyanopoulos
3 *
4 * Encryption/decryption library. This library is free software;
5 * you can redistribute it and/or modify it under the terms of the
6 * GNU Library General Public License as published by the Free Software
7 * Foundation; either version 2 of the License, or (at your option) any
8 * later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
19 */
20
21
22#define MCRYPT_API_VERSION 20021217
23
24#define LIBMCRYPT_VERSION "@VERSION@"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29/* Definitions
30 */
31#define MCRYPT_FAILED 0x0
32
33struct CRYPT_STREAM;
34typedef struct CRYPT_STREAM *MCRYPT;
35
36/* generic - high level functions.
37 */
38	MCRYPT mcrypt_module_open(char *algorithm,
39				  char *a_directory, char *mode,
40				  char *m_directory);
41	int mcrypt_module_close(MCRYPT td);
42
43	/* returns 0 if the library has not been compiled with
44	 * dynamic module support.
45 	 */
46	int mcrypt_module_support_dynamic(void);
47
48/* returns thread descriptor */
49
50	int mcrypt_generic_init(const MCRYPT td, void *key, int lenofkey,
51				void *IV);
52	int mcrypt_generic_deinit(const MCRYPT td);
53	int mcrypt_generic_end(const MCRYPT td);
54	int mdecrypt_generic(MCRYPT td, void *plaintext, int len);
55	int mcrypt_generic(MCRYPT td, void *plaintext, int len);
56
57/* extra functions */
58
59	int mcrypt_enc_set_state(MCRYPT td, void *st, int size);
60	int mcrypt_enc_get_state(MCRYPT td, void *st, int *size); /* only
61	* for block algorithms and certain modes like cbc
62	* ncfb etc.
63	*/
64	int (mcrypt_enc_self_test) (MCRYPT);
65	int (mcrypt_enc_get_block_size) (MCRYPT);
66	int (mcrypt_enc_get_iv_size) (MCRYPT);
67	int (mcrypt_enc_get_key_size) (MCRYPT);
68
69/* If this is a block algorithm returns 1
70 */
71	int (mcrypt_enc_is_block_algorithm) (MCRYPT);
72
73/* If the mode operates in blocks returns 1
74 */
75	int (mcrypt_enc_is_block_mode) (MCRYPT);
76
77/* If the mode is for block algorithms it returns 1
78 */
79	int (mcrypt_enc_is_block_algorithm_mode) (MCRYPT td);
80	int mcrypt_enc_mode_has_iv(MCRYPT td);
81
82/* Return a const string containing the name of the algorithm/mode
83 */
84	char *(mcrypt_enc_get_algorithms_name) (MCRYPT td);
85	char *(mcrypt_enc_get_modes_name) (MCRYPT td);
86
87	int *mcrypt_enc_get_supported_key_sizes(MCRYPT td, int *len);
88
89
90	char **mcrypt_list_algorithms(char *libdir, int *size);
91	char **mcrypt_list_modes(char *libdir, int *size);
92
93	/* Frees the memory allocated by the mcrypt_list_xxx() functions.
94	 */
95	void mcrypt_free_p(char **p, int size);
96	void mcrypt_free(void *ptr);
97
98	/* If mcrypt_xxx functions return an error code, and you supply this
99	 * to this function, it will print a human readable message
100	 */
101	void mcrypt_perror(int err);
102	const char* mcrypt_strerror(int err);
103
104	/* Self test for the specified algorithm
105	 */
106	int mcrypt_module_self_test(char *algorithm, char *a_directory);
107
108	int mcrypt_module_is_block_algorithm(char *algorithm,
109					     char *a_directory);
110	int mcrypt_module_is_block_algorithm_mode(char *mode,
111						  char *m_directory);
112	int mcrypt_module_is_block_mode(char *mode, char *m_directory);
113
114	int mcrypt_module_get_algo_key_size(char *algorithm,
115					    char *a_directory);
116	int mcrypt_module_get_algo_block_size(char *algorithm,
117					      char *a_directory);
118
119	int *mcrypt_module_get_algo_supported_key_sizes(char *algorithm,
120							char *a_directory,
121							int *len);
122
123	/* Checks the version of the specified module
124	 */
125	int mcrypt_module_algorithm_version(char *algorithm,
126					    char *a_directory);
127	int mcrypt_module_mode_version(char *mode, char *a_directory);
128
129
130	/* for multithreaded applications:
131	 */
132	int mcrypt_mutex_register ( void (*mutex_lock)(void) ,
133			void (*mutex_unlock)(void),
134			void (*set_error)(const char*),
135			const char* (*get_error)(void));
136
137	const char *
138		mcrypt_check_version( const char *);
139
140	/* These definitions exist in order to ease the access to
141	 * mcrypt_module_init().
142	 */
143
144	/* Algorithms */
145#define MCRYPT_BLOWFISH		"blowfish"
146#define MCRYPT_DES 		"des"
147#define MCRYPT_3DES 		"tripledes"
148#define MCRYPT_3WAY 		"threeway"
149#define MCRYPT_GOST 		"gost"
150#define MCRYPT_SAFER_SK64 	"safer-sk64"
151#define MCRYPT_SAFER_SK128 	"safer-sk128"
152#define MCRYPT_CAST_128 	"cast-128"
153#define MCRYPT_XTEA 		"xtea"
154#define MCRYPT_RC2	 	"rc2"
155#define MCRYPT_TWOFISH 		"twofish"
156#define MCRYPT_CAST_256 	"cast-256"
157#define MCRYPT_SAFERPLUS 	"saferplus"
158#define MCRYPT_LOKI97 		"loki97"
159#define MCRYPT_SERPENT 		"serpent"
160#define MCRYPT_RIJNDAEL_128 	"rijndael-128"
161#define MCRYPT_RIJNDAEL_192 	"rijndael-192"
162#define MCRYPT_RIJNDAEL_256 	"rijndael-256"
163#define MCRYPT_ENIGMA 		"enigma"
164#define MCRYPT_ARCFOUR		"arcfour"
165#define MCRYPT_WAKE		"wake"
166
167	/* Modes */
168#define MCRYPT_CBC		"cbc"
169#define MCRYPT_ECB		"ecb"
170#define MCRYPT_CFB		"cfb"
171#define MCRYPT_OFB		"ofb"
172#define MCRYPT_nOFB		"nofb"
173#define MCRYPT_STREAM		"stream"
174
175#ifdef __cplusplus
176}
177#endif
178