ff7f4b3adb8db1038be71f18cf3b4c69745a53e3
[libgcrypt.git] / src / g10lib.h
1 /* g10lib.h - Internal definitions for libgcrypt
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
3  *               2007, 2011 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 #if __GNUC__ >= 3
62 /* According to glibc this attribute is available since 2.8 however we
63    better play safe and use it only with gcc 3 or newer. */
64 #define GCC_ATTR_FORMAT_ARG(a)  __attribute__ ((format_arg (a)))
65 #else
66 #define GCC_ATTR_FORMAT_ARG(a)
67 #endif
68
69
70 /* I am not sure since when the unused attribute is really supported.
71    In any case it it only needed for gcc versions which print a
72    warning.  Thus let us require gcc >= 3.5.  */
73 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 5 )
74 #define GCC_ATTR_UNUSED  __attribute__ ((unused))
75 #else
76 #define GCC_ATTR_UNUSED
77 #endif
78
79
80 /* Gettext macros.  */
81
82 #define _(a)  _gcry_gettext(a)
83 #define N_(a) (a)
84
85 /* Some handy macros */
86 #ifndef STR
87 #define STR(v) #v
88 #endif
89 #define STR2(v) STR(v)
90 #define DIM(v) (sizeof(v)/sizeof((v)[0]))
91 #define DIMof(type,member)   DIM(((type *)0)->member)
92
93 \f
94
95 /*-- src/global.c -*/
96 int _gcry_global_is_operational (void);
97 gcry_error_t _gcry_vcontrol (enum gcry_ctl_cmds cmd, va_list arg_ptr);
98 void  _gcry_check_heap (const void *a);
99 int _gcry_get_debug_flag (unsigned int mask);
100
101
102 /*-- src/misc.c --*/
103
104 #if defined(JNLIB_GCC_M_FUNCTION) || __STDC_VERSION__ >= 199901L
105 void _gcry_bug (const char *file, int line,
106                 const char *func) GCC_ATTR_NORETURN;
107 void _gcry_assert_failed (const char *expr, const char *file, int line,
108                           const char *func) GCC_ATTR_NORETURN;
109 #else
110 void _gcry_bug (const char *file, int line);
111 void _gcry_assert_failed (const char *expr, const char *file, int line);
112 #endif
113
114 void _gcry_divide_by_zero (void) JNLIB_GCC_A_NR;
115
116 const char *_gcry_gettext (const char *key) GCC_ATTR_FORMAT_ARG(1);
117 void _gcry_fatal_error(int rc, const char *text ) JNLIB_GCC_A_NR;
118 void _gcry_logv (int level,
119                  const char *fmt, va_list arg_ptr) JNLIB_GCC_A_PRINTF(2,0);
120 void _gcry_log( int level, const char *fmt, ... ) JNLIB_GCC_A_PRINTF(2,3);
121 void _gcry_log_bug( const char *fmt, ... )   JNLIB_GCC_A_NR_PRINTF(1,2);
122 void _gcry_log_fatal( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2);
123 void _gcry_log_error( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
124 void _gcry_log_info( const char *fmt, ... )  JNLIB_GCC_A_PRINTF(1,2);
125 int  _gcry_log_info_with_dummy_fp (FILE *fp, const char *fmt, ... )
126                                              JNLIB_GCC_A_PRINTF(2,3);
127 void _gcry_log_debug( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
128 void _gcry_log_printf ( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
129 void _gcry_log_printhex (const char *text, const void *buffer, size_t length);
130 void _gcry_log_printmpi (const char *text, gcry_mpi_t mpi);
131 void _gcry_log_printsxp (const char *text, gcry_sexp_t sexp);
132
133 void _gcry_set_log_verbosity( int level );
134 int _gcry_log_verbosity( int level );
135
136 #ifdef JNLIB_GCC_M_FUNCTION
137 #define BUG() _gcry_bug( __FILE__ , __LINE__, __FUNCTION__ )
138 #define gcry_assert(expr) ((expr)? (void)0 \
139          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__, __FUNCTION__))
140 #elif __STDC_VERSION__ >= 199901L
141 #define BUG() _gcry_bug( __FILE__ , __LINE__, __func__ )
142 #define gcry_assert(expr) ((expr)? (void)0 \
143          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__, __func__))
144 #else
145 #define BUG() _gcry_bug( __FILE__ , __LINE__ )
146 #define gcry_assert(expr) ((expr)? (void)0 \
147          : _gcry_assert_failed (STR(expr), __FILE__, __LINE__))
148 #endif
149
150
151 #define log_bug     _gcry_log_bug
152 #define log_fatal   _gcry_log_fatal
153 #define log_error   _gcry_log_error
154 #define log_info    _gcry_log_info
155 #define log_debug   _gcry_log_debug
156 #define log_printf  _gcry_log_printf
157 #define log_printhex _gcry_log_printhex
158 #define log_printmpi _gcry_log_printmpi
159 #define log_printsxp _gcry_log_printsxp
160
161 /* Compatibility macro.  */
162 #define log_mpidump _gcry_log_printmpi
163
164
165 /*-- src/hwfeatures.c --*/
166 /* (Do not change these values unless synced with the asm code.)  */
167 #define HWF_PADLOCK_RNG  1
168 #define HWF_PADLOCK_AES  2
169 #define HWF_PADLOCK_SHA  4
170 #define HWF_PADLOCK_MMUL 8
171
172 #define HWF_INTEL_AESNI  256
173 #define HWF_INTEL_RDRAND 512
174 #define HWF_INTEL_AVX    1024
175 #define HWF_INTEL_AVX2   2048
176
177 #define HWF_ARM_NEON     4096
178
179
180 unsigned int _gcry_get_hw_features (void);
181 void _gcry_detect_hw_features (unsigned int);
182
183
184 /*-- mpi/mpiutil.c --*/
185 const char *_gcry_mpi_get_hw_config (void);
186
187
188 /*-- cipher/pubkey.c --*/
189
190 /* FIXME: shouldn't this go into mpi.h?  */
191 #ifndef mpi_powm
192 #define mpi_powm(w,b,e,m)   gcry_mpi_powm( (w), (b), (e), (m) )
193 #endif
194
195 /*-- primegen.c --*/
196 gcry_err_code_t _gcry_primegen_init (void);
197 gcry_mpi_t _gcry_generate_secret_prime (unsigned int nbits,
198                                  gcry_random_level_t random_level,
199                                  int (*extra_check)(void*, gcry_mpi_t),
200                                  void *extra_check_arg);
201 gcry_mpi_t _gcry_generate_public_prime (unsigned int nbits,
202                                  gcry_random_level_t random_level,
203                                  int (*extra_check)(void*, gcry_mpi_t),
204                                  void *extra_check_arg);
205 gcry_mpi_t _gcry_generate_elg_prime (int mode,
206                                      unsigned int pbits, unsigned int qbits,
207                                      gcry_mpi_t g, gcry_mpi_t **factors);
208 gcry_mpi_t _gcry_derive_x931_prime (const gcry_mpi_t xp,
209                                     const gcry_mpi_t xp1, const gcry_mpi_t xp2,
210                                     const gcry_mpi_t e,
211                                     gcry_mpi_t *r_p1, gcry_mpi_t *r_p2);
212 gpg_err_code_t _gcry_generate_fips186_2_prime
213                  (unsigned int pbits, unsigned int qbits,
214                   const void *seed, size_t seedlen,
215                   gcry_mpi_t *r_q, gcry_mpi_t *r_p,
216                   int *r_counter,
217                   void **r_seed, size_t *r_seedlen);
218 gpg_err_code_t _gcry_generate_fips186_3_prime
219                  (unsigned int pbits, unsigned int qbits,
220                   const void *seed, size_t seedlen,
221                   gcry_mpi_t *r_q, gcry_mpi_t *r_p,
222                   int *r_counter,
223                   void **r_seed, size_t *r_seedlen, int *r_hashalgo);
224
225
226 /* Replacements of missing functions (missing-string.c).  */
227 #ifndef HAVE_STPCPY
228 char *stpcpy (char *a, const char *b);
229 #endif
230 #ifndef HAVE_STRCASECMP
231 int strcasecmp (const char *a, const char *b) _GCRY_GCC_ATTR_PURE;
232 #endif
233
234 #include "../compat/libcompat.h"
235
236
237 /* Macros used to rename missing functions.  */
238 #ifndef HAVE_STRTOUL
239 #define strtoul(a,b,c)  ((unsigned long)strtol((a),(b),(c)))
240 #endif
241 #ifndef HAVE_MEMMOVE
242 #define memmove(d, s, n) bcopy((s), (d), (n))
243 #endif
244 #ifndef HAVE_STRICMP
245 #define stricmp(a,b)     strcasecmp( (a), (b) )
246 #endif
247 #ifndef HAVE_ATEXIT
248 #define atexit(a)    (on_exit((a),0))
249 #endif
250 #ifndef HAVE_RAISE
251 #define raise(a) kill(getpid(), (a))
252 #endif
253
254
255 /* Stack burning.  */
256
257 void _gcry_burn_stack (unsigned int bytes);
258
259
260 /* To avoid that a compiler optimizes certain memset calls away, these
261    macros may be used instead. */
262 #define wipememory2(_ptr,_set,_len) do { \
263               volatile char *_vptr=(volatile char *)(_ptr); \
264               size_t _vlen=(_len); \
265               unsigned char _vset=(_set); \
266               fast_wipememory2(_vptr,_vset,_vlen); \
267               while(_vlen) { *_vptr=(_vset); _vptr++; _vlen--; } \
268                   } while(0)
269 #define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
270
271
272 /* Optimized fast_wipememory2 for i386, x86-64 and arm architectures.  May leave
273    tail bytes unhandled, in which case tail bytes are handled by wipememory2.
274  */
275 #if defined(__x86_64__) && __GNUC__ >= 4
276 #define fast_wipememory2(_vptr,_vset,_vlen) do { \
277               unsigned long long int _vset8 = _vset; \
278               if (_vlen < 8) \
279                 break; \
280               _vset8 *= 0x0101010101010101ULL; \
281               do { \
282                 asm volatile("movq %[set], %[ptr]\n\t" \
283                              : /**/ \
284                              : [set] "Cr" (_vset8), \
285                                [ptr] "m" (*_vptr) \
286                              : "memory"); \
287                 _vlen -= 8; \
288                 _vptr += 8; \
289               } while (_vlen >= 8); \
290                   } while (0)
291 #elif defined (__i386__) && SIZEOF_UNSIGNED_LONG == 4 && __GNUC__ >= 4
292 #define fast_wipememory2(_ptr,_set,_len) do { \
293               unsigned long _vset4 = _vset; \
294               if (_vlen < 4) \
295                 break; \
296               _vset4 *= 0x01010101; \
297               do { \
298                 asm volatile("movl %[set], %[ptr]\n\t" \
299                              : /**/ \
300                              : [set] "Cr" (_vset4), \
301                                [ptr] "m" (*_vptr) \
302                              : "memory"); \
303                 _vlen -= 4; \
304                 _vptr += 4; \
305               } while (_vlen >= 4); \
306                   } while (0)
307 #elif defined (__arm__) && (defined (__thumb2__) || !defined (__thumb__)) && \
308         __GNUC__ >= 4
309
310 #ifdef __ARM_FEATURE_UNALIGNED
311 #define fast_wipememory2_unaligned_head(_ptr,_set,_len) /*do nothing*/
312 #else
313 #define fast_wipememory2_unaligned_head(_vptr,_vset,_vlen) do { \
314               while((size_t)(_vptr)&3 && _vlen) \
315                 { *_vptr=(_vset); _vptr++; _vlen--; } \
316                   } while(0)
317 #endif
318
319 #define fast_wipememory2(_vptr,_vset,_vlen) do { \
320               unsigned long _vset4 = _vset; \
321               fast_wipememory2_unaligned_head(_vptr,_vset,_vlen); \
322               if (_vlen < 8) \
323                 break; \
324               _vset4 *= 0x01010101; \
325               asm volatile( \
326                 "mov %%r4, %[set];\n\t" \
327                 "mov %%r5, %[set];\n\t" \
328                 "1:;\n\t" \
329                 "stm %[ptr]!, {%%r4, %%r5};\n\t" \
330                 "cmp %[end], %[ptr];\n\t" \
331                 "bne 1b;\n\t" \
332                 : [ptr] "=r" (_vptr) \
333                 : [set] "r" (_vset4), \
334                   [end] "r" (_vptr+(_vlen&(~0x7))), \
335                   "0" (_vptr) \
336                 : "memory", "r4", "r5", "cc"); \
337               _vlen &= 0x7; \
338                   } while (0)
339 #else
340 #define fast_wipememory2(_ptr,_set,_len)
341 #endif
342
343
344 /* Digit predicates.  */
345
346 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
347 #define octdigitp(p) (*(p) >= '0' && *(p) <= '7')
348 #define alphap(a)    (   (*(a) >= 'A' && *(a) <= 'Z')  \
349                       || (*(a) >= 'a' && *(a) <= 'z'))
350 #define hexdigitp(a) (digitp (a)                     \
351                       || (*(a) >= 'A' && *(a) <= 'F')  \
352                       || (*(a) >= 'a' && *(a) <= 'f'))
353
354 /* Management for ciphers/digests/pubkey-ciphers.  */
355
356 /* Structure for each registered `module'.  */
357 struct gcry_module
358 {
359   struct gcry_module *next;     /* List pointers.      */
360   struct gcry_module **prevp;
361   void *spec;                   /* Pointer to the subsystem-specific
362                                    specification structure.  */
363   void *extraspec;              /* Pointer to the subsystem-specific
364                                    extra specification structure.  */
365   int flags;                    /* Associated flags.   */
366   int counter;                  /* Use counter.        */
367   unsigned int mod_id;          /* ID of this module.  */
368 };
369
370 /* Flags for the `flags' member of gcry_module_t.  */
371 #define FLAG_MODULE_DISABLED (1 << 0)
372
373 gcry_err_code_t _gcry_module_add (gcry_module_t *entries,
374                                   unsigned int id,
375                                   void *spec,
376                                   void *extraspec,
377                                   gcry_module_t *module);
378
379 typedef int (*gcry_module_lookup_t) (void *spec, void *data);
380
381 /* Lookup a module specification by it's ID.  After a successful
382    lookup, the module has it's resource counter incremented.  */
383 gcry_module_t _gcry_module_lookup_id (gcry_module_t entries,
384                                        unsigned int id);
385
386 /* Internal function.  Lookup a module specification.  */
387 gcry_module_t _gcry_module_lookup (gcry_module_t entries, void *data,
388                                     gcry_module_lookup_t func);
389
390 /* Release a module.  In case the use-counter reaches zero, destroy
391    the module.  */
392 void _gcry_module_release (gcry_module_t entry);
393
394 /* Add a reference to a module.  */
395 void _gcry_module_use (gcry_module_t module);
396
397 /* Return a list of module IDs.  */
398 gcry_err_code_t _gcry_module_list (gcry_module_t modules,
399                                   int *list, int *list_length);
400
401 gcry_err_code_t _gcry_cipher_init (void);
402 gcry_err_code_t _gcry_md_init (void);
403 gcry_err_code_t _gcry_pk_init (void);
404 gcry_err_code_t _gcry_secmem_module_init (void);
405 gcry_err_code_t _gcry_mpi_init (void);
406
407 /* Memory management.  */
408 #define GCRY_ALLOC_FLAG_SECURE (1 << 0)
409
410
411 /*-- sexp.c --*/
412 gcry_err_code_t _gcry_sexp_vbuild (gcry_sexp_t *retsexp, size_t *erroff,
413                                    const char *format, va_list arg_ptr);
414 gcry_mpi_t _gcry_sexp_nth_opaque_mpi (gcry_sexp_t list, int number);
415 char *_gcry_sexp_nth_string (const gcry_sexp_t list, int number);
416
417
418 /*-- fips.c --*/
419
420 void _gcry_initialize_fips_mode (int force);
421
422 int _gcry_fips_mode (void);
423 #define fips_mode() _gcry_fips_mode ()
424
425 int _gcry_enforced_fips_mode (void);
426
427 void _gcry_set_enforced_fips_mode (void);
428
429 void _gcry_inactivate_fips_mode (const char *text);
430 int _gcry_is_fips_mode_inactive (void);
431
432
433 void _gcry_fips_signal_error (const char *srcfile,
434                               int srcline,
435                               const char *srcfunc,
436                               int is_fatal,
437                               const char *description);
438 #ifdef JNLIB_GCC_M_FUNCTION
439 # define fips_signal_error(a) \
440            _gcry_fips_signal_error (__FILE__, __LINE__, __FUNCTION__, 0, (a))
441 # define fips_signal_fatal_error(a) \
442            _gcry_fips_signal_error (__FILE__, __LINE__, __FUNCTION__, 1, (a))
443 #else
444 # define fips_signal_error(a) \
445            _gcry_fips_signal_error (__FILE__, __LINE__, NULL, 0, (a))
446 # define fips_signal_fatal_error(a) \
447            _gcry_fips_signal_error (__FILE__, __LINE__, NULL, 1, (a))
448 #endif
449
450 int _gcry_fips_is_operational (void);
451 #define fips_is_operational()   (_gcry_global_is_operational ())
452 #define fips_not_operational()  (GPG_ERR_NOT_OPERATIONAL)
453
454 int _gcry_fips_test_operational (void);
455 int _gcry_fips_test_error_or_operational (void);
456
457 gpg_err_code_t _gcry_fips_run_selftests (int extended);
458
459 void _gcry_fips_noreturn (void);
460 #define fips_noreturn()  (_gcry_fips_noreturn ())
461
462
463
464 #endif /* G10LIB_H */