Add support for Salsa20.
[libgcrypt.git] / src / misc.c
1 /* misc.c
2  * Copyright (C) 1999, 2001, 2002, 2003, 2007,
3  *               2008 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 #include <config.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <stdarg.h>
27 #include <unistd.h>
28
29 #include "g10lib.h"
30 #include "secmem.h"
31
32 static int verbosity_level = 0;
33
34 static void (*fatal_error_handler)(void*,int, const char*) = NULL;
35 static void *fatal_error_handler_value = 0;
36 static void (*log_handler)(void*,int, const char*, va_list) = NULL;
37 static void *log_handler_value = 0;
38
39 static const char *(*user_gettext_handler)( const char * ) = NULL;
40
41 void
42 gcry_set_gettext_handler( const char *(*f)(const char*) )
43 {
44     user_gettext_handler = f;
45 }
46
47
48 const char *
49 _gcry_gettext( const char *key )
50 {
51     if( user_gettext_handler )
52         return user_gettext_handler( key );
53     /* FIXME: switch the domain to gnupg and restore later */
54     return key;
55 }
56
57 void
58 gcry_set_fatalerror_handler( void (*fnc)(void*,int, const char*), void *value)
59 {
60     fatal_error_handler_value = value;
61     fatal_error_handler = fnc;
62 }
63
64 static void
65 write2stderr( const char *s )
66 {
67   /* Dummy variable to silence gcc warning.  */
68   int res = write( 2, s, strlen(s) );
69   (void) res;
70 }
71
72 /*
73  * This function is called for fatal errors.  A caller might want to
74  * set his own handler because this function simply calls abort().
75  */
76 void
77 _gcry_fatal_error (int rc, const char *text)
78 {
79   if ( !text ) /* get a default text */
80     text = gpg_strerror (rc);
81
82   if (fatal_error_handler && !fips_mode () )
83     fatal_error_handler (fatal_error_handler_value, rc, text);
84
85   fips_signal_fatal_error (text);
86   write2stderr("\nFatal error: ");
87   write2stderr(text);
88   write2stderr("\n");
89   _gcry_secmem_term ();
90   abort ();
91 }
92
93 void
94 gcry_set_log_handler( void (*f)(void*,int, const char*, va_list ),
95                                                             void *opaque )
96 {
97     log_handler = f;
98     log_handler_value = opaque;
99 }
100
101 void
102 _gcry_set_log_verbosity( int level )
103 {
104     verbosity_level = level;
105 }
106
107 int
108 _gcry_log_verbosity( int level )
109 {
110     return verbosity_level >= level;
111 }
112
113 /****************
114  * This is our log function which prints all log messages to stderr or
115  * using the function defined with gcry_set_log_handler().
116  */
117 static void
118 _gcry_logv( int level, const char *fmt, va_list arg_ptr )
119 {
120   if (log_handler)
121     log_handler (log_handler_value, level, fmt, arg_ptr);
122   else
123     {
124       switch (level)
125         {
126         case GCRY_LOG_CONT:  break;
127         case GCRY_LOG_INFO:  break;
128         case GCRY_LOG_WARN:  break;
129         case GCRY_LOG_ERROR: break;
130         case GCRY_LOG_FATAL: fputs("Fatal: ",stderr ); break;
131         case GCRY_LOG_BUG:   fputs("Ohhhh jeeee: ", stderr); break;
132         case GCRY_LOG_DEBUG: fputs("DBG: ", stderr ); break;
133         default: fprintf(stderr,"[Unknown log level %d]: ", level ); break;
134         }
135       vfprintf(stderr,fmt,arg_ptr) ;
136     }
137
138   if ( level == GCRY_LOG_FATAL || level == GCRY_LOG_BUG )
139     {
140       fips_signal_fatal_error ("internal error (fatal or bug)");
141       _gcry_secmem_term ();
142       abort ();
143     }
144 }
145
146
147 void
148 _gcry_log( int level, const char *fmt, ... )
149 {
150     va_list arg_ptr ;
151
152     va_start( arg_ptr, fmt ) ;
153     _gcry_logv( level, fmt, arg_ptr );
154     va_end(arg_ptr);
155 }
156
157
158 #if defined(JNLIB_GCC_M_FUNCTION) || __STDC_VERSION__ >= 199901L
159 void
160 _gcry_bug( const char *file, int line, const char *func )
161 {
162     _gcry_log( GCRY_LOG_BUG,
163              ("... this is a bug (%s:%d:%s)\n"), file, line, func );
164     abort(); /* never called, but it makes the compiler happy */
165 }
166 void
167 _gcry_assert_failed (const char *expr, const char *file, int line,
168                      const char *func)
169 {
170   _gcry_log (GCRY_LOG_BUG,
171              ("Assertion `%s' failed (%s:%d:%s)\n"), expr, file, line, func );
172   abort(); /* Never called, but it makes the compiler happy. */
173 }
174 #else
175 void
176 _gcry_bug( const char *file, int line )
177 {
178     _gcry_log( GCRY_LOG_BUG,
179              _("you found a bug ... (%s:%d)\n"), file, line);
180     abort(); /* never called, but it makes the compiler happy */
181 }
182 void
183 _gcry_assert_failed (const char *expr, const char *file, int line)
184 {
185   _gcry_log (GCRY_LOG_BUG,
186              ("Assertion `%s' failed (%s:%d)\n"), expr, file, line);
187   abort(); /* Never called, but it makes the compiler happy. */
188 }
189 #endif
190
191 void
192 _gcry_log_info( const char *fmt, ... )
193 {
194     va_list arg_ptr ;
195
196     va_start( arg_ptr, fmt ) ;
197     _gcry_logv( GCRY_LOG_INFO, fmt, arg_ptr );
198     va_end(arg_ptr);
199 }
200
201 int
202 _gcry_log_info_with_dummy_fp (FILE *fp, const char *fmt, ... )
203 {
204     va_list arg_ptr;
205
206     (void)fp;
207     va_start( arg_ptr, fmt ) ;
208     _gcry_logv( GCRY_LOG_INFO, fmt, arg_ptr );
209     va_end(arg_ptr);
210     return 0;
211 }
212
213 void
214 _gcry_log_error( const char *fmt, ... )
215 {
216     va_list arg_ptr ;
217
218     va_start( arg_ptr, fmt ) ;
219     _gcry_logv( GCRY_LOG_ERROR, fmt, arg_ptr );
220     va_end(arg_ptr);
221 }
222
223
224 void
225 _gcry_log_fatal( const char *fmt, ... )
226 {
227     va_list arg_ptr ;
228
229     va_start( arg_ptr, fmt ) ;
230     _gcry_logv( GCRY_LOG_FATAL, fmt, arg_ptr );
231     va_end(arg_ptr);
232     abort(); /* never called, but it makes the compiler happy */
233 }
234
235 void
236 _gcry_log_bug( const char *fmt, ... )
237 {
238     va_list arg_ptr ;
239
240     va_start( arg_ptr, fmt ) ;
241     _gcry_logv( GCRY_LOG_BUG, fmt, arg_ptr );
242     va_end(arg_ptr);
243     abort(); /* never called, but it makes the compiler happy */
244 }
245
246 void
247 _gcry_log_debug( const char *fmt, ... )
248 {
249     va_list arg_ptr ;
250
251     va_start( arg_ptr, fmt ) ;
252     _gcry_logv( GCRY_LOG_DEBUG, fmt, arg_ptr );
253     va_end(arg_ptr);
254 }
255
256
257 void
258 _gcry_log_printf (const char *fmt, ...)
259 {
260   va_list arg_ptr;
261
262   if (fmt)
263     {
264       va_start( arg_ptr, fmt ) ;
265       _gcry_logv (GCRY_LOG_CONT, fmt, arg_ptr);
266       va_end(arg_ptr);
267     }
268 }
269
270 /* Print a hexdump of BUFFER.  With TEXT of NULL print just the raw
271    dump, with TEXT an empty string, print a trailing linefeed,
272    otherwise print an entire debug line. */
273 void
274 _gcry_log_printhex (const char *text, const void *buffer, size_t length)
275 {
276   if (text && *text)
277     log_debug ("%s ", text);
278   if (length)
279     {
280       const unsigned char *p = buffer;
281       log_printf ("%02X", *p);
282       for (length--, p++; length--; p++)
283         log_printf (" %02X", *p);
284     }
285   if (text)
286     log_printf ("\n");
287 }
288
289
290 void
291 _gcry_burn_stack (int bytes)
292 {
293 #if SIZEOF_UNSIGNED_LONG == 4 || SIZEOF_UNSIGNED_LONG == 8
294     /* Optimized burn_stack for 32-bit and 64-bit architectures.  In addition
295        to loop unrolling, compiler sees that writes are within 'buf' and
296        generation of stack-protection code is avoided.  */
297     volatile unsigned long buf[64 / SIZEOF_UNSIGNED_LONG];
298
299     buf[0] = 0;
300     buf[1] = 0;
301     buf[2] = 0;
302     buf[3] = 0;
303     buf[4] = 0;
304     buf[5] = 0;
305     buf[6] = 0;
306     buf[7] = 0;
307 # if SIZEOF_UNSIGNED_LONG == 4
308     buf[8] = 0;
309     buf[9] = 0;
310     buf[10] = 0;
311     buf[11] = 0;
312     buf[12] = 0;
313     buf[13] = 0;
314     buf[14] = 0;
315     buf[15] = 0;
316 # endif
317 #else
318     char buf[64];
319
320     wipememory (buf, sizeof buf);
321 #endif
322     bytes -= sizeof buf;
323     if (bytes > 0)
324         _gcry_burn_stack (bytes);
325 }
326
327 void
328 _gcry_divide_by_zero (void)
329 {
330     gpg_err_set_errno (EDOM);
331     _gcry_fatal_error (gpg_err_code_from_errno (errno), "divide by zero");
332 }