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