/* Portability glue for libcrypt.
Copyright 2007-2017 Thorsten Kukuk and Zack Weinberg
This library 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.
This library 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 library; if not, see
. */
#ifndef _CRYPT_PORT_H
#define _CRYPT_PORT_H 1
#ifndef HAVE_CONFIG_H
#error "Run configure before compiling; see INSTALL for instructions"
#endif
#include "config.h"
#undef NDEBUG
#include
#include
#include
#include
#ifdef HAVE_SYS_TYPES_H
#include
#endif
#ifdef HAVE_SYS_CDEFS_H
#include
#endif
#ifndef HAVE_SYS_CDEFS_THROW
#define __THROW /* nothing */
#endif
#ifndef HAVE_SYS_CDEFS_NONNULL
#define __nonnull(param) /* nothing */
#endif
/* Suppression of unused-argument warnings. */
#if defined __GNUC__ && __GNUC__ >= 3
# define ARG_UNUSED(x) x __attribute__ ((__unused__))
#else
# define ARG_UNUSED(x) x
#endif
/* static_assert shim. */
#ifdef HAVE_STATIC_ASSERT_IN_ASSERT_H
/* nothing to do */
#elif defined HAVE__STATIC_ASSERT
# define static_assert(expr, message) _Static_assert(expr, message)
#else
/* This fallback is known to work with most C99-compliant compilers.
See verify.h in gnulib for extensive discussion. */
# define static_assert(expr, message) \
extern int (*xcrypt_static_assert_fn (void)) \
[!!sizeof (struct { int xcrypt_error_if_negative: (expr) ? 2 : -1; })]
#endif
/* max_align_t shim. In the absence of official word from the
compiler, we guess that one of long double, uintmax_t, void *, and
void (*)(void) will have the maximum alignment. This is probably
not true in the presence of vector types, but we currently don't
use vector types, and hopefully any compiler with extra-aligned
vector types will provide max_align_t. */
#ifndef HAVE_MAX_ALIGN_T
typedef union
{
long double ld;
uintmax_t ui;
void *vp;
void (*vpf)(void);
} max_align_t;
#endif
/* Several files expect the traditional definitions of these macros. */
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
/* Per-symbol version tagging. Currently we only know how to do this
using GCC extensions. */
#if defined __GNUC__ && __GNUC__ >= 3
/* Define ALIASNAME as a strong alias for NAME. */
#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
#define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)))
/* Set the symbol version for EXTNAME, which uses INTNAME as its
implementation. */
#define symver_set(extname, intname, version, mode) \
__asm__ (".symver " #intname "," #extname mode #version)
/* A construct with the same syntactic role as the expansion of symver_set,
but which does nothing. */
#define symver_nop() __asm__ ("")
#else
#error "Don't know how to do symbol versioning with this compiler"
#endif
/* The macros for versioned symbols work differently in this library
than they do in glibc. They are mostly auto-generated (see gen-vers.awk),
and we currently don't support compatibility symbols that need a different
definition from the default version.
Each definition of a public symbol should look like this:
#if INCLUDE_foo
int foo(arguments)
{
body
}
SYMVER_foo;
#endif
and the macros take care of the rest. Normally, to call a public
symbol you do nothing special. The macro symver_ref() forces
all uses of a particular name (in the file where it's used) to refer
to a particular version of a public symbol, e.g. for testing. */
#ifdef IN_LIBCRYPT
#include "crypt-symbol-vers.h"
#ifdef PIC
#define symver_compat(n, extname, intname, version) \
strong_alias (intname, extname ## __ ## n); \
symver_set (extname, extname ## __ ## n, version, "@")
#define symver_compat0(extname, intname, version) \
symver_set (extname, intname, version, "@")
#define symver_default(extname, intname, version) \
symver_set (extname, intname, version, "@@")
#else
/* When not building the shared library, don't do any of this. */
#define symver_compat(n, extname, intname, version) symver_nop ()
#define symver_compat0(extname, intname, version) symver_nop ()
#define symver_default(extname, intname, version) symver_nop ()
#endif
#endif
/* Tests may need to _refer_ to compatibility symbols, but should never need
to _define_ them. */
#define symver_ref(extname, intname, version) \
symver_set(extname, intname, version, "@")
/* Rename all of the internal-but-global symbols with a _crypt_ prefix
so that they do not interfere with other people's code when linking
statically. This list cannot be autogenerated, but is validated by
test-symbols.sh. */
#define crypt_bcrypt_rn _crypt_crypt_bcrypt_rn
#define gensalt_bcrypt_a_rn _crypt_gensalt_bcrypt_a_rn
#define gensalt_bcrypt_b_rn _crypt_gensalt_bcrypt_b_rn
#define gensalt_bcrypt_x_rn _crypt_gensalt_bcrypt_x_rn
#define gensalt_bcrypt_y_rn _crypt_gensalt_bcrypt_y_rn
#define gensalt_sha_rn _crypt_gensalt_sha_rn
#define gensalt_sha256_rn _crypt_gensalt_sha256_rn
#define gensalt_sha512_rn _crypt_gensalt_sha512_rn
#define get_random_bytes _crypt_get_random_bytes
#define crypt_sha256_rn _crypt_crypt_sha256_rn
#define crypt_sha512_rn _crypt_crypt_sha512_rn
#define sha256_finish_ctx _crypt_sha256_finish_ctx
#define sha256_init_ctx _crypt_sha256_init_ctx
#define sha256_process_bytes _crypt_sha256_process_bytes
#define sha512_finish_ctx _crypt_sha512_finish_ctx
#define sha512_init_ctx _crypt_sha512_init_ctx
#define sha512_process_bytes _crypt_sha512_process_bytes
#if ENABLE_WEAK_HASHES
#define comp_maskl _crypt_comp_maskl
#define comp_maskr _crypt_comp_maskr
#define crypt_des_trd_or_big_rn _crypt_crypt_des_trd_or_big_rn
#define crypt_des_xbsd_rn _crypt_crypt_des_xbsd_rn
#define crypt_md5_rn _crypt_crypt_md5_rn
#define crypt_nthash_rn _crypt_crypt_nthash_rn
#define des_crypt_block _crypt_des_crypt_block
#define des_set_key _crypt_des_set_key
#define des_set_salt _crypt_des_set_salt
#define fp_maskl _crypt_fp_maskl
#define fp_maskr _crypt_fp_maskr
#define gensalt_des_trd_rn _crypt_gensalt_des_trd_rn
#define gensalt_des_xbsd_rn _crypt_gensalt_des_xbsd_rn
#define gensalt_md5_rn _crypt_gensalt_md5_rn
#define gensalt_nthash_rn _crypt_gensalt_nthash_rn
#define ip_maskl _crypt_ip_maskl
#define ip_maskr _crypt_ip_maskr
#define key_perm_maskl _crypt_key_perm_maskl
#define key_perm_maskr _crypt_key_perm_maskr
#define md4_finish_ctx _crypt_md4_finish_ctx
#define md4_init_ctx _crypt_md4_init_ctx
#define md4_process_bytes _crypt_md4_process_bytes
#define md5_finish_ctx _crypt_md5_finish_ctx
#define md5_init_ctx _crypt_md5_init_ctx
#define md5_process_bytes _crypt_md5_process_bytes
#define m_sbox _crypt_m_sbox
#define psbox _crypt_psbox
#endif
#endif /* crypt-port.h */