1*62c56f98SSadaf Ebrahimi /** 2*62c56f98SSadaf Ebrahimi * \file aesce.h 3*62c56f98SSadaf Ebrahimi * 4*62c56f98SSadaf Ebrahimi * \brief Support hardware AES acceleration on Armv8-A processors with 5*62c56f98SSadaf Ebrahimi * the Armv8-A Cryptographic Extension in AArch64 execution state. 6*62c56f98SSadaf Ebrahimi * 7*62c56f98SSadaf Ebrahimi * \warning These functions are only for internal use by other library 8*62c56f98SSadaf Ebrahimi * functions; you must not call them directly. 9*62c56f98SSadaf Ebrahimi */ 10*62c56f98SSadaf Ebrahimi /* 11*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors 12*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 13*62c56f98SSadaf Ebrahimi */ 14*62c56f98SSadaf Ebrahimi #ifndef MBEDTLS_AESCE_H 15*62c56f98SSadaf Ebrahimi #define MBEDTLS_AESCE_H 16*62c56f98SSadaf Ebrahimi 17*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h" 18*62c56f98SSadaf Ebrahimi 19*62c56f98SSadaf Ebrahimi #include "mbedtls/aes.h" 20*62c56f98SSadaf Ebrahimi 21*62c56f98SSadaf Ebrahimi 22*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_AESCE_C) && defined(MBEDTLS_ARCH_IS_ARM64) 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimi #define MBEDTLS_AESCE_HAVE_CODE 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimi #ifdef __cplusplus 27*62c56f98SSadaf Ebrahimi extern "C" { 28*62c56f98SSadaf Ebrahimi #endif 29*62c56f98SSadaf Ebrahimi 30*62c56f98SSadaf Ebrahimi #if defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) 31*62c56f98SSadaf Ebrahimi 32*62c56f98SSadaf Ebrahimi extern signed char mbedtls_aesce_has_support_result; 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimi /** 35*62c56f98SSadaf Ebrahimi * \brief Internal function to detect the crypto extension in CPUs. 36*62c56f98SSadaf Ebrahimi * 37*62c56f98SSadaf Ebrahimi * \return 1 if CPU has support for the feature, 0 otherwise 38*62c56f98SSadaf Ebrahimi */ 39*62c56f98SSadaf Ebrahimi int mbedtls_aesce_has_support_impl(void); 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi #define MBEDTLS_AESCE_HAS_SUPPORT() (mbedtls_aesce_has_support_result == -1 ? \ 42*62c56f98SSadaf Ebrahimi mbedtls_aesce_has_support_impl() : \ 43*62c56f98SSadaf Ebrahimi mbedtls_aesce_has_support_result) 44*62c56f98SSadaf Ebrahimi 45*62c56f98SSadaf Ebrahimi #else /* defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) */ 46*62c56f98SSadaf Ebrahimi 47*62c56f98SSadaf Ebrahimi /* If we are not on Linux, we can't detect support so assume that it's supported. 48*62c56f98SSadaf Ebrahimi * Similarly, assume support if MBEDTLS_AES_USE_HARDWARE_ONLY is set. 49*62c56f98SSadaf Ebrahimi */ 50*62c56f98SSadaf Ebrahimi #define MBEDTLS_AESCE_HAS_SUPPORT() 1 51*62c56f98SSadaf Ebrahimi 52*62c56f98SSadaf Ebrahimi #endif /* defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) */ 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi /** 55*62c56f98SSadaf Ebrahimi * \brief Internal AES-ECB block encryption and decryption 56*62c56f98SSadaf Ebrahimi * 57*62c56f98SSadaf Ebrahimi * \warning This assumes that the context specifies either 10, 12 or 14 58*62c56f98SSadaf Ebrahimi * rounds and will behave incorrectly if this is not the case. 59*62c56f98SSadaf Ebrahimi * 60*62c56f98SSadaf Ebrahimi * \param ctx AES context 61*62c56f98SSadaf Ebrahimi * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT 62*62c56f98SSadaf Ebrahimi * \param input 16-byte input block 63*62c56f98SSadaf Ebrahimi * \param output 16-byte output block 64*62c56f98SSadaf Ebrahimi * 65*62c56f98SSadaf Ebrahimi * \return 0 on success (cannot fail) 66*62c56f98SSadaf Ebrahimi */ 67*62c56f98SSadaf Ebrahimi int mbedtls_aesce_crypt_ecb(mbedtls_aes_context *ctx, 68*62c56f98SSadaf Ebrahimi int mode, 69*62c56f98SSadaf Ebrahimi const unsigned char input[16], 70*62c56f98SSadaf Ebrahimi unsigned char output[16]); 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimi /** 73*62c56f98SSadaf Ebrahimi * \brief Internal GCM multiplication: c = a * b in GF(2^128) 74*62c56f98SSadaf Ebrahimi * 75*62c56f98SSadaf Ebrahimi * \note This function is only for internal use by other library 76*62c56f98SSadaf Ebrahimi * functions; you must not call it directly. 77*62c56f98SSadaf Ebrahimi * 78*62c56f98SSadaf Ebrahimi * \param c Result 79*62c56f98SSadaf Ebrahimi * \param a First operand 80*62c56f98SSadaf Ebrahimi * \param b Second operand 81*62c56f98SSadaf Ebrahimi * 82*62c56f98SSadaf Ebrahimi * \note Both operands and result are bit strings interpreted as 83*62c56f98SSadaf Ebrahimi * elements of GF(2^128) as per the GCM spec. 84*62c56f98SSadaf Ebrahimi */ 85*62c56f98SSadaf Ebrahimi void mbedtls_aesce_gcm_mult(unsigned char c[16], 86*62c56f98SSadaf Ebrahimi const unsigned char a[16], 87*62c56f98SSadaf Ebrahimi const unsigned char b[16]); 88*62c56f98SSadaf Ebrahimi 89*62c56f98SSadaf Ebrahimi 90*62c56f98SSadaf Ebrahimi /** 91*62c56f98SSadaf Ebrahimi * \brief Internal round key inversion. This function computes 92*62c56f98SSadaf Ebrahimi * decryption round keys from the encryption round keys. 93*62c56f98SSadaf Ebrahimi * 94*62c56f98SSadaf Ebrahimi * \param invkey Round keys for the equivalent inverse cipher 95*62c56f98SSadaf Ebrahimi * \param fwdkey Original round keys (for encryption) 96*62c56f98SSadaf Ebrahimi * \param nr Number of rounds (that is, number of round keys minus one) 97*62c56f98SSadaf Ebrahimi */ 98*62c56f98SSadaf Ebrahimi void mbedtls_aesce_inverse_key(unsigned char *invkey, 99*62c56f98SSadaf Ebrahimi const unsigned char *fwdkey, 100*62c56f98SSadaf Ebrahimi int nr); 101*62c56f98SSadaf Ebrahimi 102*62c56f98SSadaf Ebrahimi /** 103*62c56f98SSadaf Ebrahimi * \brief Internal key expansion for encryption 104*62c56f98SSadaf Ebrahimi * 105*62c56f98SSadaf Ebrahimi * \param rk Destination buffer where the round keys are written 106*62c56f98SSadaf Ebrahimi * \param key Encryption key 107*62c56f98SSadaf Ebrahimi * \param bits Key size in bits (must be 128, 192 or 256) 108*62c56f98SSadaf Ebrahimi * 109*62c56f98SSadaf Ebrahimi * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH 110*62c56f98SSadaf Ebrahimi */ 111*62c56f98SSadaf Ebrahimi int mbedtls_aesce_setkey_enc(unsigned char *rk, 112*62c56f98SSadaf Ebrahimi const unsigned char *key, 113*62c56f98SSadaf Ebrahimi size_t bits); 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimi #ifdef __cplusplus 116*62c56f98SSadaf Ebrahimi } 117*62c56f98SSadaf Ebrahimi #endif 118*62c56f98SSadaf Ebrahimi 119*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_AESCE_C && MBEDTLS_ARCH_IS_ARM64 */ 120*62c56f98SSadaf Ebrahimi 121*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_AESCE_H */ 122