Implemented transient-key flag as requested by the GNUNet folks.
[libgcrypt.git] / src / g10lib.h
1 /* g10lib.h - Internal definitions for libgcrypt
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
3  *               2007 Free Software Foundation, Inc.
4  *
5  * This file is part of Libgcrypt.
6  *
7  * Libgcrypt is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser general Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * Libgcrypt is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 /* This header is to be used inside of libgcrypt in place of gcrypt.h.
22    This way we can better distinguish between internal and external
23    usage of gcrypt.h. */
24
25 #ifndef G10LIB_H
26 #define G10LIB_H 1
27
28 #ifdef _GCRYPT_H
29 #error  gcrypt.h already included
30 #endif
31
32 #ifndef _GCRYPT_IN_LIBGCRYPT 
33 #error something is wrong with config.h
34 #endif
35
36 #include <stdio.h>
37 #include <stdarg.h>
38
39 #include "visibility.h"
40 #include "types.h"
41
42
43 \f
44
45 /* Attribute handling macros.  */
46
47 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
48 #define JNLIB_GCC_M_FUNCTION 1
49 #define JNLIB_GCC_A_NR       __attribute__ ((noreturn))
50 #define JNLIB_GCC_A_PRINTF( f, a )  __attribute__ ((format (printf,f,a)))
51 #define JNLIB_GCC_A_NR_PRINTF( f, a ) \
52                             __attribute__ ((noreturn, format (printf,f,a)))
53 #define GCC_ATTR_NORETURN  __attribute__ ((__noreturn__))
54 #else
55 #define JNLIB_GCC_A_NR
56 #define JNLIB_GCC_A_PRINTF( f, a )
57 #define JNLIB_GCC_A_NR_PRINTF( f, a )
58 #define GCC_ATTR_NORETURN 
59 #endif
60
61 /* Gettext macros.  */
62
63 #define _(a)  _gcry_gettext(a)
64 #define N_(a) (a)
65
66 /* Some handy macros */
67 #ifndef STR
68 #define STR(v) #v
69 #endif
70 #define STR2(v) STR(v)
71 #define DIM(v) (sizeof(v)/sizeof((v)[0]))
72 #define DIMof(type,member)   DIM(((type *)0)->member)
73
74 \f
75
76 /*-- src/global.c -*/
77 gcry_error_t _gcry_vcontrol (enum gcry_ctl_cmds cmd, va_list arg_ptr);
78 void  _gcry_check_heap (const void *a);
79 int _gcry_get_debug_flag (unsigned int mask);
80
81
82 /*-- src/misc.c --*/
83
84 #if defined(JNLIB_GCC_M_FUNCTION) || __STDC_VERSION__ >= 199901L
85 void _gcry_bug (const char *file, int line,
86                 const char *func) GCC_ATTR_NORETURN;
87 void _gcry_assert_failed (const char *expr, const char *file, int line,
88                           const char *func) GCC_ATTR_NORETURN;
89 #else
90 void _gcry_bug (const char *file, int line);
91 void _gcry_assert_failed (const char *expr, const char *file, int line);
92 #endif
93
94 const char *_gcry_gettext (const char *key);
95 void _gcry_fatal_error(int rc, const char *text ) JNLIB_GCC_A_NR;
96 void _gcry_log( int level, const char *fmt, ... ) JNLIB_GCC_A_PRINTF(2,3);
97 void _gcry_log_bug( const char *fmt, ... )   JNLIB_GCC_A_NR_PRINTF(1,2);
98 void _gcry_log_fatal( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2);
99 void _gcry_log_error( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
100 void _gcry_log_info( const char *fmt, ... )  JNLIB_GCC_A_PRINTF(1,2);
101 int  _gcry_log_info_with_dummy_fp (FILE *fp, const char *fmt, ... )
102                                              JNLIB_GCC_A_PRINTF(2,3);
103 void _gcry_log_debug( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
104 void _gcry_log_printf ( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
105 void _gcry_log_printhex (const char *text, const void *buffer, size_t length);
106
107 void _gcry_set_log_verbosity( int level );
108 int _gcry_log_verbosity( int level );
109
110 #ifdef JNLIB_GCC_M_FUNCTION
111 #define BUG() _gcry_bug( __FILE__ , __LINE__, __FUNCTION__ )
112 #define gcry_assert(expr) ((expr)? (void)0 \
113          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__, __FUNCTION__))
114 #elif __STDC_VERSION__ >= 199901L
115 #define BUG() _gcry_bug( __FILE__ , __LINE__, __func__ )
116 #define gcry_assert(expr) ((expr)? (void)0 \
117          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__, __func__))
118 #else
119 #define BUG() _gcry_bug( __FILE__ , __LINE__ )
120 #define gcry_assert(expr) ((expr)? (void)0 \
121          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__))
122 #endif
123
124
125 #define log_bug     _gcry_log_bug
126 #define log_fatal   _gcry_log_fatal
127 #define log_error   _gcry_log_error
128 #define log_info    _gcry_log_info
129 #define log_debug   _gcry_log_debug
130 #define log_printf  _gcry_log_printf
131 #define log_printhex _gcry_log_printhex
132
133
134 /*-- src/hwfeatures.c --*/
135 /* (Do not change these values unless synced with the asm code.)  */
136 #define HWF_PADLOCK_RNG  1
137 #define HWF_PADLOCK_AES  2
138 #define HWF_PADLOCK_SHA  4
139 #define HWF_PADLOCK_MMUL 8
140
141 unsigned int _gcry_get_hw_features (void);
142 void _gcry_detect_hw_features (void);
143
144
145 /*-- mpi/mpiutil.c --*/
146 const char *_gcry_mpi_get_hw_config (void);
147
148
149 /*-- cipher/pubkey.c --*/
150
151 /* FIXME: shouldn't this go into mpi.h?  */
152 #ifndef mpi_powm
153 #define mpi_powm(w,b,e,m)   gcry_mpi_powm( (w), (b), (e), (m) )
154 #endif
155
156 /*-- primegen.c --*/
157 gcry_mpi_t _gcry_generate_secret_prime (unsigned int nbits,
158                                  gcry_random_level_t random_level,
159                                  int (*extra_check)(void*, gcry_mpi_t),
160                                  void *extra_check_arg);
161 gcry_mpi_t _gcry_generate_public_prime (unsigned int nbits,
162                                  gcry_random_level_t random_level,
163                                  int (*extra_check)(void*, gcry_mpi_t),
164                                  void *extra_check_arg);
165 gcry_mpi_t _gcry_generate_elg_prime (int mode, 
166                                      unsigned int pbits, unsigned int qbits,
167                                      gcry_mpi_t g, gcry_mpi_t **factors);
168
169
170 /* replacements of missing functions (missing-string.c)*/
171 #ifndef HAVE_STPCPY
172 char *stpcpy (char *a, const char *b);
173 #endif
174 #ifndef HAVE_STRCASECMP
175 int strcasecmp (const char *a, const char *b) _GCRY_GCC_ATTR_PURE;
176 #endif
177
178 /* macros used to rename missing functions */
179 #ifndef HAVE_STRTOUL
180 #define strtoul(a,b,c)  ((unsigned long)strtol((a),(b),(c)))
181 #endif
182 #ifndef HAVE_MEMMOVE
183 #define memmove(d, s, n) bcopy((s), (d), (n))
184 #endif
185 #ifndef HAVE_STRICMP
186 #define stricmp(a,b)     strcasecmp( (a), (b) )
187 #endif
188 #ifndef HAVE_ATEXIT
189 #define atexit(a)    (on_exit((a),0))
190 #endif
191 #ifndef HAVE_RAISE
192 #define raise(a) kill(getpid(), (a))
193 #endif
194
195
196 /* Stack burning.  */
197
198 void _gcry_burn_stack (int bytes);
199
200
201 /* To avoid that a compiler optimizes certain memset calls away, these
202    macros may be used instead. */
203 #define wipememory2(_ptr,_set,_len) do { \
204               volatile char *_vptr=(volatile char *)(_ptr); \
205               size_t _vlen=(_len); \
206               while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
207                   } while(0)
208 #define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
209
210
211
212 /* Digit predicates.  */
213
214 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
215 #define octdigitp(p) (*(p) >= '0' && *(p) <= '7')
216 #define alphap(a)    (   (*(a) >= 'A' && *(a) <= 'Z')  \
217                       || (*(a) >= 'a' && *(a) <= 'z'))
218 #define hexdigitp(a) (digitp (a)                     \
219                       || (*(a) >= 'A' && *(a) <= 'F')  \
220                       || (*(a) >= 'a' && *(a) <= 'f'))
221
222 /* Management for ciphers/digests/pubkey-ciphers.  */
223
224 /* Structure for each registered `module'.  */
225 struct gcry_module
226 {
227   struct gcry_module *next;     /* List pointers.      */
228   struct gcry_module **prevp;
229   void *spec;                   /* Pointer to the subsystem-specific
230                                    specification structure.  */
231   void *extraspec;              /* Pointer to the subsystem-specific
232                                    extra specification structure.  */
233   int flags;                    /* Associated flags.   */
234   int counter;                  /* Use counter.        */
235   unsigned int mod_id;          /* ID of this module.  */
236 };
237
238 /* Flags for the `flags' member of gcry_module_t.  */
239 #define FLAG_MODULE_DISABLED (1 << 0)
240
241 gcry_err_code_t _gcry_module_add (gcry_module_t *entries,
242                                   unsigned int id,
243                                   void *spec,
244                                   void *extraspec,
245                                   gcry_module_t *module);
246
247 typedef int (*gcry_module_lookup_t) (void *spec, void *data);
248
249 /* Lookup a module specification by it's ID.  After a successfull
250    lookup, the module has it's resource counter incremented.  */
251 gcry_module_t _gcry_module_lookup_id (gcry_module_t entries,
252                                        unsigned int id);
253
254 /* Internal function.  Lookup a module specification.  */
255 gcry_module_t _gcry_module_lookup (gcry_module_t entries, void *data,
256                                     gcry_module_lookup_t func);
257
258 /* Release a module.  In case the use-counter reaches zero, destroy
259    the module.  */
260 void _gcry_module_release (gcry_module_t entry);
261
262 /* Add a reference to a module.  */
263 void _gcry_module_use (gcry_module_t module);
264
265 /* Return a list of module IDs.  */
266 gcry_err_code_t _gcry_module_list (gcry_module_t modules,
267                                   int *list, int *list_length);
268
269 gcry_err_code_t _gcry_cipher_init (void);
270 gcry_err_code_t _gcry_md_init (void);
271 gcry_err_code_t _gcry_pk_init (void);
272 gcry_err_code_t _gcry_ac_init (void);
273
274 gcry_err_code_t _gcry_pk_module_lookup (int id, gcry_module_t *module);
275 void _gcry_pk_module_release (gcry_module_t module);
276 gcry_err_code_t _gcry_pk_get_elements (int algo, char **enc, char **sig);
277
278 /* Memory management.  */
279 #define GCRY_ALLOC_FLAG_SECURE (1 << 0)
280
281
282 /*-- sexp.c --*/
283 gcry_error_t _gcry_sexp_vbuild (gcry_sexp_t *retsexp, size_t *erroff, 
284                                 const char *format, va_list arg_ptr);
285 char *_gcry_sexp_nth_string (const gcry_sexp_t list, int number);
286
287
288 /*-- fips.c --*/
289
290 void _gcry_initialize_fips_mode (int force);
291
292 int _gcry_fips_mode (void);
293 #define fips_mode() _gcry_fips_mode ()
294
295 void _gcry_fips_signal_error (const char *srcfile, 
296                               int srcline, 
297                               const char *srcfunc,
298                               int is_fatal,
299                               const char *description);
300 #ifdef JNLIB_GCC_M_FUNCTION
301 # define fips_signal_error(a) \
302            _gcry_fips_signal_error (__FILE__, __LINE__, __FUNCTION__, 0, (a))
303 # define fips_signal_fatal_error(a) \
304            _gcry_fips_signal_error (__FILE__, __LINE__, __FUNCTION__, 1, (a))
305 #else
306 # define fips_signal_error(a) \
307            _gcry_fips_signal_error (__FILE__, __LINE__, NULL, 0, (a))
308 # define fips_signal_fatal_error(a) \
309            _gcry_fips_signal_error (__FILE__, __LINE__, NULL, 1, (a))
310 #endif
311
312 int _gcry_fips_is_operational (void);
313 #define fips_is_operational()   (_gcry_fips_is_operational ())
314 #define fips_not_operational()  (GCRY_GPG_ERR_NOT_OPERATIONAL)
315
316 int _gcry_fips_test_operational (void);
317
318 void _gcry_fips_run_selftests (void);
319
320 void _gcry_fips_noreturn (void);
321 #define fips_noreturn()  (_gcry_fips_noreturn ())
322
323
324
325 #endif /* G10LIB_H */