/** * @file layer.h * @version $Format:%h%d$ * * Header file to determine crypto algorithm provider. */ /* * Copyright (c) 2013-2017 INSIDE Secure Corporation * Copyright (c) PeerSec Networks, 2002-2011 * All Rights Reserved * * The latest version of this code is available at http://www.matrixssl.org * * This software is open source; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This General Public License does NOT permit incorporating this software * into proprietary programs. If you are unable to comply with the GPL, a * commercial license for this software may be purchased from INSIDE at * http://www.insidesecure.com/ * * This program is distributed in WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * http://www.gnu.org/copyleft/gpl.html */ /******************************************************************************/ #ifndef _h_PS_CRYPTOLAYER # define _h_PS_CRYPTOLAYER /** Layer implementations of configured crypto APIs. First we define MATRIX as the crypto provider for each enabled algorithm that was enabled above and then we can override with other providers. */ # if (defined(USE_AES_CBC) || defined(USE_AES_GCM) || \ defined(USE_AES_WRAP) || defined(USE_AES_CMAC) || \ defined(USE_AES_CTR)) # define USE_MATRIX_AES_BLOCK # define USE_AES_BLOCK # define USE_AES # endif # define USE_MATRIX_RAW_KEY /* Default, unless changed by lower layers */ # if defined(USE_AES_CBC) # define USE_MATRIX_AES_CBC # endif # if defined(USE_AES_GCM) # define USE_MATRIX_AES_GCM # endif # if defined(USE_AES_CMAC) # define USE_MATRIX_AES_CMAC # endif # if defined(USE_AES_WRAP) # define USE_MATRIX_AES_WRAP # endif # if defined(USE_AES_CTR) # define USE_MATRIX_AES_CTR # endif # ifdef USE_CHACHA20_POLY1305 # ifndef USE_LIBSODIUM_CRYPTO # error "libsodium required for chacha20_poly1305" # endif # endif # ifdef USE_ARC4 # define USE_MATRIX_ARC4 # endif # ifdef USE_RC2 # define USE_MATRIX_RC2 # endif # ifdef USE_3DES # define USE_MATRIX_3DES # endif # ifdef USE_SEED # define USE_MATRIX_SEED # endif # ifdef USE_IDEA # define USE_MATRIX_IDEA # endif # if defined(USE_SHA256) # define USE_MATRIX_SHA256 # endif # if defined(USE_HMAC_SHA256) # define USE_MATRIX_HMAC_SHA256 # endif # if defined(USE_SHA384) # define USE_MATRIX_SHA384 # endif # if defined(USE_HMAC_SHA384) # define USE_MATRIX_HMAC_SHA384 # endif # if defined(USE_SHA512) # define USE_MATRIX_SHA512 # endif # if defined(USE_SHA1) # define USE_MATRIX_SHA1 # endif # if defined(USE_HMAC_SHA1) # define USE_MATRIX_HMAC_SHA1 # endif # if defined(USE_MD5SHA1) # define USE_MATRIX_MD5SHA1 # endif # if defined(USE_MD5) # define USE_MATRIX_MD5 # endif # if defined(USE_HMAC_MD5) # define USE_MATRIX_HMAC_MD5 # endif # if defined(USE_MD4) # define USE_MATRIX_MD4 # endif # if defined(USE_MD2) # define USE_MATRIX_MD2 # endif # if defined(USE_RSA) # define USE_MATRIX_RSA # endif # if defined(USE_ECC) # define USE_MATRIX_ECC # endif # if defined(USE_DH) # define USE_MATRIX_DH # endif # if defined(USE_PRNG) # define USE_MATRIX_PRNG # endif # ifdef USE_LIBSODIUM_CRYPTO /******************************************************************************/ /** Use libsodium cryptography primitives (link with libsodium.a). */ # ifdef USE_CHACHA20_POLY1305 /* #undef USE_MATRIX_CHACHA20_POLY1305 / * @note, not defined in matrix crypto * / */ # define USE_LIBSODIUM_CHACHA20_POLY1305 # endif # ifdef USE_MATRIX_AES_GCM # undef USE_MATRIX_AES_GCM # define USE_LIBSODIUM_AES_GCM # endif # ifdef USE_MATRIX_SHA256 # undef USE_MATRIX_SHA256 # define USE_LIBSODIUM_SHA256 # endif # ifdef USE_MATRIX_SHA384 # undef USE_MATRIX_SHA384 # define USE_LIBSODIUM_SHA384 # endif # ifdef USE_MATRIX_SHA512 # undef USE_MATRIX_SHA512 # define USE_LIBSODIUM_SHA512 # endif # ifdef USE_MATRIX_HMAC_SHA256 # undef USE_MATRIX_HMAC_SHA256 # define USE_LIBSODIUM_HMAC_SHA256 # endif # endif /* USE_LIBSODIUM_CRYPTO */ /* Common for CL CRYPTO and FIPS CRYPTO */ # ifdef USE_OPENSSL_CRYPTO /******************************************************************************/ /** Use OpenSSL cryptography primitives (link with libcrypto.a). This can take advantage of hardware which has a specifically optimized libcrypto library, for example Cavium Octeon. */ # ifdef USE_MATRIX_AES_CBC # undef USE_MATRIX_AES_CBC # define USE_OPENSSL_AES_CBC # endif # ifdef USE_MATRIX_MD5 # undef USE_MATRIX_MD5 # define USE_OPENSSL_MD5 # endif # ifdef USE_MATRIX_SHA1 # undef USE_MATRIX_SHA1 # define USE_OPENSSL_SHA1 # endif # ifdef USE_MATRIX_MD5SHA1 # undef USE_MATRIX_MD5SHA1 # define USE_OPENSSL_MD5SHA1 # endif # ifdef USE_MATRIX_SHA256 # undef USE_MATRIX_SHA256 # define USE_OPENSSL_SHA256 # endif # ifdef USE_MATRIX_SHA384 # undef USE_MATRIX_SHA384 # define USE_OPENSSL_SHA384 # endif # ifdef USE_MATRIX_SHA512 # undef USE_MATRIX_SHA512 # define USE_OPENSSL_SHA512 # endif # ifdef USE_MATRIX_HMAC_MD5 # undef USE_MATRIX_HMAC_MD5 # define USE_OPENSSL_HMAC_MD5 # endif # ifdef USE_MATRIX_HMAC_SHA1 # undef USE_MATRIX_HMAC_SHA1 # define USE_OPENSSL_HMAC_SHA1 # endif # ifdef USE_MATRIX_HMAC_SHA256 # undef USE_MATRIX_HMAC_SHA256 # define USE_OPENSSL_HMAC_SHA256 # endif # ifdef USE_MATRIX_HMAC_SHA384 # undef USE_MATRIX_HMAC_SHA384 # define USE_OPENSSL_HMAC_SHA384 # endif # ifdef USE_MATRIX_RSA # undef USE_MATRIX_RSA # define USE_OPENSSL_RSA # endif # endif /* USE_OPENSSL_CRYPTO */ # if defined(__AES__) && !defined(USE_FIPS_CRYPTO) /******************************************************************************/ /** This is defined if the -maes compiler flag is used on Intel platforms. @see https://en.wikipedia.org/wiki/AES_instruction_set */ # ifdef USE_MATRIX_AES_BLOCK # undef USE_MATRIX_AES_BLOCK # define USE_AESNI_AES_BLOCK # endif # ifdef USE_MATRIX_AES_CBC # undef USE_MATRIX_AES_CBC # define USE_AESNI_AES_CBC # endif # ifdef USE_MATRIX_AES_GCM # undef USE_MATRIX_AES_GCM # define USE_AESNI_AES_GCM # endif # if defined(USE_AESNI_AES_BLOCK) || defined(USE_AESNI_AES_CBC) || \ defined(USE_AESNI_AES_GCM) # define USE_AESNI_CRYPTO # endif # endif /* __AES__ */ /******************************************************************************/ /* Enable algorithm optimizations based on the compiler optimization settings. GCC compatible compilers will define: __OPTIMIZE__ for all -O1 and above (include -Os) __OPTIMIZE_SIZE__ in addition to __OPTIMIZE__ for -Os Both code size and RAM usage are affected by these defines. By default below, these will be enabled on an optimized build that is not optimized for size. Eg. for -O[1-3,fast], but not for -Os For a specific platform, it is best to tune these by hand to get the right balance of speed and size. */ # if defined(__OPTIMIZE__) # if !defined(__OPTIMIZE_SIZE__) /* Improve block cipher performance, but produce larger code. Platforms vary, but ciphers will generally see a 5%-10% performance boost at the cost of 10-20 kilobytes (per algorithm). */ # ifdef USE_MATRIX_AES_BLOCK # define PS_AES_IMPROVE_PERF_INCREASE_CODESIZE # endif # ifdef USE_MATRIX_3DES # define PS_3DES_IMPROVE_PERF_INCREASE_CODESIZE # endif /* Improve hashing performance, but produce larger code. Platforms vary, but digests will generally see a 5%-10% performance boost at the cost of 1-10 kilobytes (per algorithm). */ # ifdef USE_MATRIX_MD5 # define PS_MD5_IMPROVE_PERF_INCREASE_CODESIZE # endif # ifdef USE_MATRIX_SHA1 # define PS_SHA1_IMPROVE_PERF_INCREASE_CODESIZE # endif /* Optimize public/private key operations for speed. Optimizations for 1024/2048 bit key size multiplication and squaring math. The library size can increase significantly if enabled. */ # if defined(USE_MATRIX_RSA) || defined(USE_MATRIX_ECC) || defined(USE_MATRIX_DH) # define PS_PUBKEY_OPTIMIZE_FOR_FASTER_SPEED # endif # if defined(USE_MATRIX_RSA) || defined(USE_MATRIX_DH) # define USE_1024_KEY_SPEED_OPTIMIZATIONS # define USE_2048_KEY_SPEED_OPTIMIZATIONS # endif # else /* OPTIMIZE_SIZE */ /* Optimize public/private key operations for smaller ram usage. The memory savings for optimizing for ram is around 50% */ # if defined(USE_MATRIX_RSA) || defined(USE_MATRIX_ECC) || defined(USE_MATRIX_DH) # define PS_PUBKEY_OPTIMIZE_FOR_SMALLER_RAM # endif # endif /* OPTIMIZE_SIZE */ # endif /* OPTIMIZE */ #endif /* _h_PS_CRYPTOLAYER */ /******************************************************************************/