diff options
author | René Schümann <white06tiger@gmail.com> | 2015-03-14 19:56:55 +0000 |
---|---|---|
committer | René Schümann <white06tiger@gmail.com> | 2015-03-14 19:56:55 +0000 |
commit | c60aed5432e9cda277b9351de51e82dfb8e02475 (patch) | |
tree | 97ccd1ea8e2544f6a9673ee7d04c18b714877a35 /plugins/MirOTR/libgcrypt-1.4.6/src/global.c | |
parent | d2b26b1f86326362f56540b5185fa09ab5f2779c (diff) |
MirOTR: part one of many file/folder structure changes
git-svn-id: http://svn.miranda-ng.org/main/trunk@12402 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/MirOTR/libgcrypt-1.4.6/src/global.c')
-rw-r--r-- | plugins/MirOTR/libgcrypt-1.4.6/src/global.c | 1069 |
1 files changed, 0 insertions, 1069 deletions
diff --git a/plugins/MirOTR/libgcrypt-1.4.6/src/global.c b/plugins/MirOTR/libgcrypt-1.4.6/src/global.c deleted file mode 100644 index a69513e7d5..0000000000 --- a/plugins/MirOTR/libgcrypt-1.4.6/src/global.c +++ /dev/null @@ -1,1069 +0,0 @@ -/* global.c - global control functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 - * 2004, 2005, 2006, 2008 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser general Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <ctype.h> -#include <limits.h> -#include <errno.h> -#include <unistd.h> -#ifdef HAVE_SYSLOG -# include <syslog.h> -#endif /*HAVE_SYSLOG*/ - -#include "g10lib.h" -#include "cipher.h" -#include "stdmem.h" /* our own memory allocator */ -#include "secmem.h" /* our own secmem allocator */ -#include "ath.h" - - - -/**************** - * flag bits: 0 : general cipher debug - * 1 : general MPI debug - */ -static unsigned int debug_flags; - -/* gcry_control (GCRYCTL_SET_FIPS_MODE), sets this flag so that the - intialization code swicthed fips mode on. */ -static int force_fips_mode; - -/* Controlled by global_init(). */ -static int any_init_done; - - - -/* Memory management. */ - -static gcry_handler_alloc_t alloc_func; -static gcry_handler_alloc_t alloc_secure_func; -static gcry_handler_secure_check_t is_secure_func; -static gcry_handler_realloc_t realloc_func; -static gcry_handler_free_t free_func; -static gcry_handler_no_mem_t outofcore_handler; -static void *outofcore_handler_value; -static int no_secure_memory; - - - - - -/* This is our handmade constructor. It gets called by any function - likely to be called at startup. The suggested way for an - application to make sure that this has been called is by using - gcry_check_version. */ -static void -global_init (void) -{ - gcry_error_t err = 0; - - if (any_init_done) - return; - any_init_done = 1; - - /* Initialize our portable thread/mutex wrapper. */ - err = ath_init (); - if (err) - goto fail; - - /* See whether the system is in FIPS mode. This needs to come as - early as possible put after the ATH has been initialized. */ - _gcry_initialize_fips_mode (force_fips_mode); - - /* Before we do any other initialization we need to test available - hardware features. */ - _gcry_detect_hw_features (); - - err = _gcry_cipher_init (); - if (err) - goto fail; - err = _gcry_md_init (); - if (err) - goto fail; - err = _gcry_pk_init (); - if (err) - goto fail; -#if 0 - /* Hmmm, as of now ac_init does nothing. */ - if ( !fips_mode () ) - { - err = _gcry_ac_init (); - if (err) - goto fail; - } -#endif - - return; - - fail: - BUG (); -} - - -/* This function is called by the macro fips_is_operational and makes - sure that the minimal initialization has been done. This is far - from a perfect solution and hides problems with an improper - initialization but at least in single-threaded mode it should work - reliable. - - The reason we need this is that a lot of applications don't use - Libgcrypt properly by not running any initialization code at all. - They just call a Libgcrypt function and that is all what they want. - Now with the FIPS mode, that has the side effect of entering FIPS - mode (for security reasons, FIPS mode is the default if no - initialization has been done) and bailing out immediately because - the FSM is in the wrong state. If we always run the init code, - Libgcrypt can test for FIPS mode and at least if not in FIPS mode, - it will behave as before. Note that this on-the-fly initialization - is only done for the cryptographic functions subject to FIPS mode - and thus not all API calls will do such an initialization. */ -int -_gcry_global_is_operational (void) -{ - if (!any_init_done) - { -#ifdef HAVE_SYSLOG - syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "missing initialization - please fix the application"); -#endif /*HAVE_SYSLOG*/ - global_init (); - } - return _gcry_fips_is_operational (); -} - - - - -/* Version number parsing. */ - -/* This function parses the first portion of the version number S and - stores it in *NUMBER. On sucess, this function returns a pointer - into S starting with the first character, which is not part of the - initial number portion; on failure, NULL is returned. */ -static const char* -parse_version_number( const char *s, int *number ) -{ - int val = 0; - - if( *s == '0' && isdigit(s[1]) ) - return NULL; /* leading zeros are not allowed */ - for ( ; isdigit(*s); s++ ) { - val *= 10; - val += *s - '0'; - } - *number = val; - return val < 0? NULL : s; -} - -/* This function breaks up the complete string-representation of the - version number S, which is of the following struture: <major - number>.<minor number>.<micro number><patch level>. The major, - minor and micro number components will be stored in *MAJOR, *MINOR - and *MICRO. - - On success, the last component, the patch level, will be returned; - in failure, NULL will be returned. */ - -static const char * -parse_version_string( const char *s, int *major, int *minor, int *micro ) -{ - s = parse_version_number( s, major ); - if( !s || *s != '.' ) - return NULL; - s++; - s = parse_version_number( s, minor ); - if( !s || *s != '.' ) - return NULL; - s++; - s = parse_version_number( s, micro ); - if( !s ) - return NULL; - return s; /* patchlevel */ -} - -/* If REQ_VERSION is non-NULL, check that the version of the library - is at minimum the requested one. Returns the string representation - of the library version if the condition is satisfied; return NULL - if the requested version is newer than that of the library. - - If a NULL is passed to this function, no check is done, but the - string representation of the library is simply returned. */ -const char * -gcry_check_version( const char *req_version ) -{ - const char *ver = VERSION; - int my_major, my_minor, my_micro; - int rq_major, rq_minor, rq_micro; - const char *my_plvl, *rq_plvl; - - /* Initialize library. */ - global_init (); - - if ( !req_version ) - /* Caller wants our version number. */ - return ver; - - /* Parse own version number. */ - my_plvl = parse_version_string( ver, &my_major, &my_minor, &my_micro ); - if ( !my_plvl ) - /* very strange our own version is bogus. Shouldn't we use - assert() here and bail out in case this happens? -mo. */ - return NULL; - - /* Parse requested version number. */ - rq_plvl = parse_version_string( req_version, &rq_major, &rq_minor, - &rq_micro ); - if ( !rq_plvl ) - /* req version string is invalid, this can happen. */ - return NULL; - - /* Compare version numbers. */ - if ( my_major > rq_major - || (my_major == rq_major && my_minor > rq_minor) - || (my_major == rq_major && my_minor == rq_minor - && my_micro > rq_micro) - || (my_major == rq_major && my_minor == rq_minor - && my_micro == rq_micro - && strcmp( my_plvl, rq_plvl ) >= 0) ) { - return ver; - } - - return NULL; -} - - -static void -print_config ( int (*fnc)(FILE *fp, const char *format, ...), FILE *fp) -{ - unsigned int hwf; - struct { - unsigned int flag; - const char *desc; - } hwflist[] = { - { HWF_PADLOCK_RNG, "padlock-rng" }, - { HWF_PADLOCK_AES, "padlock-aes" }, - { HWF_PADLOCK_SHA, "padlock-sha" }, - { 0, NULL} - }; - int i; - - fnc (fp, "version:%s:\n", VERSION); - fnc (fp, "ciphers:%s:\n", LIBGCRYPT_CIPHERS); - fnc (fp, "pubkeys:%s:\n", LIBGCRYPT_PUBKEY_CIPHERS); - fnc (fp, "digests:%s:\n", LIBGCRYPT_DIGESTS); - fnc (fp, "rnd-mod:" -#if USE_RNDEGD - "egd:" -#endif -#if USE_RNDLINUX - "linux:" -#endif -#if USE_RNDUNIX - "unix:" -#endif -#if USE_RNDW32 - "w32:" -#endif - "\n"); - fnc (fp, "mpi-asm:%s:\n", _gcry_mpi_get_hw_config ()); - hwf = _gcry_get_hw_features (); - fnc (fp, "hwflist:"); - for (i=0; hwflist[i].desc; i++) - if ( (hwf & hwflist[i].flag) ) - fnc (fp, "%s:", hwflist[i].desc); - fnc (fp, "\n"); - /* We use y/n instead of 1/0 for the simple reason that Emacsen's - compile error parser would accidently flag that line when printed - during "make check" as an error. */ - fnc (fp, "fips-mode:%c:%c:\n", - fips_mode ()? 'y':'n', - _gcry_enforced_fips_mode ()? 'y':'n' ); -} - - - - -/* Command dispatcher function, acting as general control - function. */ -gcry_error_t -_gcry_vcontrol (enum gcry_ctl_cmds cmd, va_list arg_ptr) -{ - static int init_finished = 0; - gcry_err_code_t err = 0; - - switch (cmd) - { - case GCRYCTL_ENABLE_M_GUARD: - _gcry_private_enable_m_guard (); - break; - - case GCRYCTL_ENABLE_QUICK_RANDOM: - _gcry_enable_quick_random_gen (); - break; - - case GCRYCTL_FAKED_RANDOM_P: - /* Return an error if the RNG is faked one (e.g. enabled by - ENABLE_QUICK_RANDOM. */ - if (_gcry_random_is_faked ()) - err = GPG_ERR_GENERAL; /* Use as TRUE value. */ - break; - - case GCRYCTL_DUMP_RANDOM_STATS: - _gcry_random_dump_stats (); - break; - - case GCRYCTL_DUMP_MEMORY_STATS: - /*m_print_stats("[fixme: prefix]");*/ - break; - - case GCRYCTL_DUMP_SECMEM_STATS: - _gcry_secmem_dump_stats (); - break; - - case GCRYCTL_DROP_PRIVS: - global_init (); - _gcry_secmem_init (0); - break; - - case GCRYCTL_DISABLE_SECMEM: - global_init (); - no_secure_memory = 1; - break; - - case GCRYCTL_INIT_SECMEM: - global_init (); - _gcry_secmem_init (va_arg (arg_ptr, unsigned int)); - if ((_gcry_secmem_get_flags () & GCRY_SECMEM_FLAG_NOT_LOCKED)) - err = GPG_ERR_GENERAL; - break; - - case GCRYCTL_TERM_SECMEM: - global_init (); - _gcry_secmem_term (); - break; - - case GCRYCTL_DISABLE_SECMEM_WARN: - _gcry_secmem_set_flags ((_gcry_secmem_get_flags () - | GCRY_SECMEM_FLAG_NO_WARNING)); - break; - - case GCRYCTL_SUSPEND_SECMEM_WARN: - _gcry_secmem_set_flags ((_gcry_secmem_get_flags () - | GCRY_SECMEM_FLAG_SUSPEND_WARNING)); - break; - - case GCRYCTL_RESUME_SECMEM_WARN: - _gcry_secmem_set_flags ((_gcry_secmem_get_flags () - & ~GCRY_SECMEM_FLAG_SUSPEND_WARNING)); - break; - - case GCRYCTL_USE_SECURE_RNDPOOL: - global_init (); - _gcry_secure_random_alloc (); /* Put random number into secure memory. */ - break; - - case GCRYCTL_SET_RANDOM_SEED_FILE: - _gcry_set_random_seed_file (va_arg (arg_ptr, const char *)); - break; - - case GCRYCTL_UPDATE_RANDOM_SEED_FILE: - if ( fips_is_operational () ) - _gcry_update_random_seed_file (); - break; - - case GCRYCTL_SET_VERBOSITY: - _gcry_set_log_verbosity (va_arg (arg_ptr, int)); - break; - - case GCRYCTL_SET_DEBUG_FLAGS: - debug_flags |= va_arg (arg_ptr, unsigned int); - break; - - case GCRYCTL_CLEAR_DEBUG_FLAGS: - debug_flags &= ~va_arg (arg_ptr, unsigned int); - break; - - case GCRYCTL_DISABLE_INTERNAL_LOCKING: - /* Not used anymore. */ - global_init (); - break; - - case GCRYCTL_ANY_INITIALIZATION_P: - if (any_init_done) - err = GPG_ERR_GENERAL; - break; - - case GCRYCTL_INITIALIZATION_FINISHED_P: - if (init_finished) - err = GPG_ERR_GENERAL; /* Yes. */ - break; - - case GCRYCTL_INITIALIZATION_FINISHED: - /* This is a hook which should be used by an application after - all initialization has been done and right before any threads - are started. It is not really needed but the only way to be - really sure that all initialization for thread-safety has - been done. */ - if (! init_finished) - { - global_init (); - /* Do only a basic random initialization, i.e. init the - mutexes. */ - _gcry_random_initialize (0); - init_finished = 1; - /* Force us into operational state if in FIPS mode. */ - (void)fips_is_operational (); - } - break; - - case GCRYCTL_SET_THREAD_CBS: - err = ath_install (va_arg (arg_ptr, void *), any_init_done); - if (! err) - global_init (); - break; - - case GCRYCTL_FAST_POLL: - /* We need to do make sure that the random pool is really - initialized so that the poll function is not a NOP. */ - _gcry_random_initialize (1); - - if ( fips_is_operational () ) - _gcry_fast_random_poll (); - break; - - case GCRYCTL_SET_RNDEGD_SOCKET: -#if USE_RNDEGD - err = _gcry_rndegd_set_socket_name (va_arg (arg_ptr, const char *)); -#else - err = gpg_error (GPG_ERR_NOT_SUPPORTED); -#endif - break; - - case GCRYCTL_SET_RANDOM_DAEMON_SOCKET: - _gcry_set_random_daemon_socket (va_arg (arg_ptr, const char *)); - break; - - case GCRYCTL_USE_RANDOM_DAEMON: - /* We need to do make sure that the random pool is really - initialized so that the poll function is not a NOP. */ - _gcry_random_initialize (1); - _gcry_use_random_daemon (!! va_arg (arg_ptr, int)); - break; - - /* This command dumps information pertaining to the - configuration of libgcrypt to the given stream. It may be - used before the intialization has been finished but not - before a gcry_version_check. */ - case GCRYCTL_PRINT_CONFIG: - { - FILE *fp = va_arg (arg_ptr, FILE *); - print_config (fp?fprintf:_gcry_log_info_with_dummy_fp, fp); - } - break; - - case GCRYCTL_OPERATIONAL_P: - /* Returns true if the library is in an operational state. This - is always true for non-fips mode. */ - if (_gcry_fips_test_operational ()) - err = GPG_ERR_GENERAL; /* Used as TRUE value */ - break; - - case GCRYCTL_FIPS_MODE_P: - if (fips_mode () - && !_gcry_is_fips_mode_inactive () - && !no_secure_memory) - err = GPG_ERR_GENERAL; /* Used as TRUE value */ - break; - - case GCRYCTL_FORCE_FIPS_MODE: - /* Performing this command puts the library into fips mode. If - the library has already been initialized into fips mode, a - selftest is triggered. it is not possible to put the libraty - into fips mode after having passed the initialization. */ - if (!any_init_done) - { - /* Not yet intialized at all. Set a flag so that we are put - into fips mode during initialization. */ - force_fips_mode = 1; - } - else - { - /* Already initialized. If we are already operational we - run a selftest. If not we use the is_operational call to - force us into operational state if possible. */ - if (_gcry_fips_test_error_or_operational ()) - _gcry_fips_run_selftests (1); - if (_gcry_fips_is_operational ()) - err = GPG_ERR_GENERAL; /* Used as TRUE value */ - } - break; - - case GCRYCTL_SELFTEST: - /* Run a selftest. This works in fips mode as well as in - standard mode. In contrast to the power-up tests, we use an - extended version of the selftests. Returns 0 on success or an - error code. */ - global_init (); - err = _gcry_fips_run_selftests (1); - break; - - case 58: /* Init external random test. */ - { - void **rctx = va_arg (arg_ptr, void **); - unsigned int flags = va_arg (arg_ptr, unsigned int); - const void *key = va_arg (arg_ptr, const void *); - size_t keylen = va_arg (arg_ptr, size_t); - const void *seed = va_arg (arg_ptr, const void *); - size_t seedlen = va_arg (arg_ptr, size_t); - const void *dt = va_arg (arg_ptr, const void *); - size_t dtlen = va_arg (arg_ptr, size_t); - if (!fips_is_operational ()) - err = fips_not_operational (); - else - err = _gcry_random_init_external_test (rctx, flags, key, keylen, - seed, seedlen, dt, dtlen); - } - break; - case 59: /* Run external random test. */ - { - void *ctx = va_arg (arg_ptr, void *); - void *buffer = va_arg (arg_ptr, void *); - size_t buflen = va_arg (arg_ptr, size_t); - if (!fips_is_operational ()) - err = fips_not_operational (); - else - err = _gcry_random_run_external_test (ctx, buffer, buflen); - } - break; - case 60: /* Deinit external random test. */ - { - void *ctx = va_arg (arg_ptr, void *); - _gcry_random_deinit_external_test (ctx); - } - break; - - - default: - err = GPG_ERR_INV_OP; - } - - return gcry_error (err); -} - - -/* Command dispatcher function, acting as general control - function. */ -gcry_error_t -gcry_control (enum gcry_ctl_cmds cmd, ...) -{ - gcry_error_t err; - va_list arg_ptr; - - va_start (arg_ptr, cmd); - err = _gcry_vcontrol (cmd, arg_ptr); - va_end(arg_ptr); - return err; -} - - - -/* Return a pointer to a string containing a description of the error - code in the error value ERR. */ -const char * -gcry_strerror (gcry_error_t err) -{ - return gpg_strerror (err); -} - -/* Return a pointer to a string containing a description of the error - source in the error value ERR. */ -const char * -gcry_strsource (gcry_error_t err) -{ - return gpg_strsource (err); -} - -/* Retrieve the error code for the system error ERR. This returns - GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped (report - this). */ -gcry_err_code_t -gcry_err_code_from_errno (int err) -{ - return gpg_err_code_from_errno (err); -} - - -/* Retrieve the system error for the error code CODE. This returns 0 - if CODE is not a system error code. */ -int -gcry_err_code_to_errno (gcry_err_code_t code) -{ - return gpg_err_code_from_errno (code); -} - - -/* Return an error value with the error source SOURCE and the system - error ERR. */ -gcry_error_t -gcry_err_make_from_errno (gpg_err_source_t source, int err) -{ - return gpg_err_make_from_errno (source, err); -} - - -/* Return an error value with the system error ERR. */ -gcry_err_code_t -gcry_error_from_errno (int err) -{ - return gcry_error (gpg_err_code_from_errno (err)); -} - - -/* Set custom allocation handlers. This is in general not useful - * because the libgcrypt allocation functions are guaranteed to - * provide proper allocation handlers which zeroize memory if needed. - * NOTE: All 5 functions should be set. */ -void -gcry_set_allocation_handler (gcry_handler_alloc_t new_alloc_func, - gcry_handler_alloc_t new_alloc_secure_func, - gcry_handler_secure_check_t new_is_secure_func, - gcry_handler_realloc_t new_realloc_func, - gcry_handler_free_t new_free_func) -{ - global_init (); - - if (fips_mode ()) - { - /* We do not want to enforce the fips mode, but merely set a - flag so that the application may check whether it is still in - fips mode. */ - _gcry_inactivate_fips_mode ("custom allocation handler"); - } - - alloc_func = new_alloc_func; - alloc_secure_func = new_alloc_secure_func; - is_secure_func = new_is_secure_func; - realloc_func = new_realloc_func; - free_func = new_free_func; -} - - - -/**************** - * Set an optional handler which is called in case the xmalloc functions - * ran out of memory. This handler may do one of these things: - * o free some memory and return true, so that the xmalloc function - * tries again. - * o Do whatever it like and return false, so that the xmalloc functions - * use the default fatal error handler. - * o Terminate the program and don't return. - * - * The handler function is called with 3 arguments: The opaque value set with - * this function, the requested memory size, and a flag with these bits - * currently defined: - * bit 0 set = secure memory has been requested. - */ -void -gcry_set_outofcore_handler( int (*f)( void*, size_t, unsigned int ), - void *value ) -{ - global_init (); - - if (fips_mode () ) - { - log_info ("out of core handler ignored in FIPS mode\n"); - return; - } - - outofcore_handler = f; - outofcore_handler_value = value; -} - -/* Return the no_secure_memory flag. */ -static int -get_no_secure_memory (void) -{ - if (!no_secure_memory) - return 0; - if (_gcry_enforced_fips_mode ()) - { - no_secure_memory = 0; - return 0; - } - return no_secure_memory; -} - - -static gcry_err_code_t -do_malloc (size_t n, unsigned int flags, void **mem) -{ - gcry_err_code_t err = 0; - void *m; - - if ((flags & GCRY_ALLOC_FLAG_SECURE) && !get_no_secure_memory ()) - { - if (alloc_secure_func) - m = (*alloc_secure_func) (n); - else - m = _gcry_private_malloc_secure (n); - } - else - { - if (alloc_func) - m = (*alloc_func) (n); - else - m = _gcry_private_malloc (n); - } - - if (!m) - { - /* Make sure that ERRNO has been set in case a user supplied - memory handler didn't it correctly. */ - if (!errno) - errno = ENOMEM; - err = gpg_err_code_from_errno (errno); - } - else - *mem = m; - - return err; -} - -void * -gcry_malloc (size_t n) -{ - void *mem = NULL; - - do_malloc (n, 0, &mem); - - return mem; -} - -void * -gcry_malloc_secure (size_t n) -{ - void *mem = NULL; - - do_malloc (n, GCRY_ALLOC_FLAG_SECURE, &mem); - - return mem; -} - -int -gcry_is_secure (const void *a) -{ - if (get_no_secure_memory ()) - return 0; - if (is_secure_func) - return is_secure_func (a) ; - return _gcry_private_is_secure (a); -} - -void -_gcry_check_heap( const void *a ) -{ - (void)a; - - /* FIXME: implement this*/ -#if 0 - if( some_handler ) - some_handler(a) - else - _gcry_private_check_heap(a) -#endif -} - -void * -gcry_realloc (void *a, size_t n) -{ - void *p; - - if (realloc_func) - p = realloc_func (a, n); - else - p = _gcry_private_realloc (a, n); - if (!p && !errno) - errno = ENOMEM; - return p; -} - -void -gcry_free (void *p) -{ - int save_errno; - - if (!p) - return; - - /* In case ERRNO is set we better save it so that the free machinery - may not accidently change ERRNO. We restore it only if it was - already set to comply with the usual C semantic for ERRNO. */ - save_errno = errno; - if (free_func) - free_func (p); - else - _gcry_private_free (p); - - if (save_errno) - errno = save_errno; -} - -void * -gcry_calloc (size_t n, size_t m) -{ - size_t bytes; - void *p; - - bytes = n * m; /* size_t is unsigned so the behavior on overflow is - defined. */ - if (m && bytes / m != n) - { - errno = ENOMEM; - return NULL; - } - - p = gcry_malloc (bytes); - if (p) - memset (p, 0, bytes); - return p; -} - -void * -gcry_calloc_secure (size_t n, size_t m) -{ - size_t bytes; - void *p; - - bytes = n * m; /* size_t is unsigned so the behavior on overflow is - defined. */ - if (m && bytes / m != n) - { - errno = ENOMEM; - return NULL; - } - - p = gcry_malloc_secure (bytes); - if (p) - memset (p, 0, bytes); - return p; -} - - -/* Create and return a copy of the null-terminated string STRING. If - it is contained in secure memory, the copy will be contained in - secure memory as well. In an out-of-memory condition, NULL is - returned. */ -char * -gcry_strdup (const char *string) -{ - char *string_cp = NULL; - size_t string_n = 0; - - string_n = strlen (string); - - if (gcry_is_secure (string)) - string_cp = gcry_malloc_secure (string_n + 1); - else - string_cp = gcry_malloc (string_n + 1); - - if (string_cp) - strcpy (string_cp, string); - - return string_cp; -} - - -void * -gcry_xmalloc( size_t n ) -{ - void *p; - - while ( !(p = gcry_malloc( n )) ) - { - if ( fips_mode () - || !outofcore_handler - || !outofcore_handler (outofcore_handler_value, n, 0) ) - { - _gcry_fatal_error (gpg_err_code_from_errno (errno), NULL); - } - } - return p; -} - -void * -gcry_xrealloc( void *a, size_t n ) -{ - void *p; - - while ( !(p = gcry_realloc( a, n )) ) - { - if ( fips_mode () - || !outofcore_handler - || !outofcore_handler (outofcore_handler_value, n, - gcry_is_secure(a)? 3:2 ) ) - { - _gcry_fatal_error (gpg_err_code_from_errno (errno), NULL ); - } - } - return p; -} - -void * -gcry_xmalloc_secure( size_t n ) -{ - void *p; - - while ( !(p = gcry_malloc_secure( n )) ) - { - if ( fips_mode () - || !outofcore_handler - || !outofcore_handler (outofcore_handler_value, n, 1) ) - { - _gcry_fatal_error (gpg_err_code_from_errno (errno), - _("out of core in secure memory")); - } - } - return p; -} - - -void * -gcry_xcalloc( size_t n, size_t m ) -{ - size_t nbytes; - void *p; - - nbytes = n * m; - if (m && nbytes / m != n) - { - errno = ENOMEM; - _gcry_fatal_error(gpg_err_code_from_errno (errno), NULL ); - } - - p = gcry_xmalloc ( nbytes ); - memset ( p, 0, nbytes ); - return p; -} - -void * -gcry_xcalloc_secure( size_t n, size_t m ) -{ - size_t nbytes; - void *p; - - nbytes = n * m; - if (m && nbytes / m != n) - { - errno = ENOMEM; - _gcry_fatal_error(gpg_err_code_from_errno (errno), NULL ); - } - - p = gcry_xmalloc_secure ( nbytes ); - memset ( p, 0, nbytes ); - return p; -} - -char * -gcry_xstrdup (const char *string) -{ - char *p; - - while ( !(p = gcry_strdup (string)) ) - { - size_t n = strlen (string); - int is_sec = !!gcry_is_secure (string); - - if (fips_mode () - || !outofcore_handler - || !outofcore_handler (outofcore_handler_value, n, is_sec) ) - { - _gcry_fatal_error (gpg_err_code_from_errno (errno), - is_sec? _("out of core in secure memory"):NULL); - } - } - - return p; -} - - -int -_gcry_get_debug_flag (unsigned int mask) -{ - if ( fips_mode () ) - return 0; - return (debug_flags & mask); -} - - - -/* It is often useful to get some feedback of long running operations. - This function may be used to register a handler for this. - The callback function CB is used as: - - void cb (void *opaque, const char *what, int printchar, - int current, int total); - - Where WHAT is a string identifying the the type of the progress - output, PRINTCHAR the character usually printed, CURRENT the amount - of progress currently done and TOTAL the expected amount of - progress. A value of 0 for TOTAL indicates that there is no - estimation available. - - Defined values for WHAT: - - "need_entropy" X 0 number-of-bytes-required - When running low on entropy - "primegen" '\n' 0 0 - Prime generated - '!' - Need to refresh the prime pool - '<','>' - Number of bits adjusted - '^' - Looking for a generator - '.' - Fermat tests on 10 candidates failed - ':' - Restart with a new random value - '+' - Rabin Miller test passed - "pk_elg" '+','-','.','\n' 0 0 - Only used in debugging mode. - "pk_dsa" - Only used in debugging mode. -*/ -void -gcry_set_progress_handler (void (*cb)(void *,const char*,int, int, int), - void *cb_data) -{ -#if USE_DSA - _gcry_register_pk_dsa_progress (cb, cb_data); -#endif -#if USE_ELGAMAL - _gcry_register_pk_elg_progress (cb, cb_data); -#endif - _gcry_register_primegen_progress (cb, cb_data); - _gcry_register_random_progress (cb, cb_data); -} |