1 /** 2 * \file aesce.h 3 * 4 * \brief Support hardware AES acceleration on Armv8-A processors with 5 * the Armv8-A Cryptographic Extension in AArch64 execution state. 6 * 7 * \warning These functions are only for internal use by other library 8 * functions; you must not call them directly. 9 */ 10 /* 11 * Copyright The Mbed TLS Contributors 12 * SPDX-License-Identifier: Apache-2.0 13 * 14 * Licensed under the Apache License, Version 2.0 (the "License"); you may 15 * not use this file except in compliance with the License. 16 * You may obtain a copy of the License at 17 * 18 * http://www.apache.org/licenses/LICENSE-2.0 19 * 20 * Unless required by applicable law or agreed to in writing, software 21 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 22 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 23 * See the License for the specific language governing permissions and 24 * limitations under the License. 25 */ 26 #ifndef MBEDTLS_AESCE_H 27 #define MBEDTLS_AESCE_H 28 29 #include "mbedtls/build_info.h" 30 31 #include "mbedtls/aes.h" 32 33 34 #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && \ 35 defined(__aarch64__) && !defined(MBEDTLS_HAVE_ARM64) 36 #define MBEDTLS_HAVE_ARM64 37 #endif 38 39 #if defined(MBEDTLS_HAVE_ARM64) 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 /** 46 * \brief Internal function to detect the crypto extension in CPUs. 47 * 48 * \return 1 if CPU has support for the feature, 0 otherwise 49 */ 50 int mbedtls_aesce_has_support(void); 51 52 /** 53 * \brief Internal AES-ECB block encryption and decryption 54 * 55 * \param ctx AES context 56 * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT 57 * \param input 16-byte input block 58 * \param output 16-byte output block 59 * 60 * \return 0 on success (cannot fail) 61 */ 62 int mbedtls_aesce_crypt_ecb(mbedtls_aes_context *ctx, 63 int mode, 64 const unsigned char input[16], 65 unsigned char output[16]); 66 67 /** 68 * \brief Internal GCM multiplication: c = a * b in GF(2^128) 69 * 70 * \note This function is only for internal use by other library 71 * functions; you must not call it directly. 72 * 73 * \param c Result 74 * \param a First operand 75 * \param b Second operand 76 * 77 * \note Both operands and result are bit strings interpreted as 78 * elements of GF(2^128) as per the GCM spec. 79 */ 80 void mbedtls_aesce_gcm_mult(unsigned char c[16], 81 const unsigned char a[16], 82 const unsigned char b[16]); 83 84 85 /** 86 * \brief Internal round key inversion. This function computes 87 * decryption round keys from the encryption round keys. 88 * 89 * \param invkey Round keys for the equivalent inverse cipher 90 * \param fwdkey Original round keys (for encryption) 91 * \param nr Number of rounds (that is, number of round keys minus one) 92 */ 93 void mbedtls_aesce_inverse_key(unsigned char *invkey, 94 const unsigned char *fwdkey, 95 int nr); 96 97 /** 98 * \brief Internal key expansion for encryption 99 * 100 * \param rk Destination buffer where the round keys are written 101 * \param key Encryption key 102 * \param bits Key size in bits (must be 128, 192 or 256) 103 * 104 * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH 105 */ 106 int mbedtls_aesce_setkey_enc(unsigned char *rk, 107 const unsigned char *key, 108 size_t bits); 109 110 #ifdef __cplusplus 111 } 112 #endif 113 114 #endif /* MBEDTLS_HAVE_ARM64 */ 115 116 #endif /* MBEDTLS_AESCE_H */ 117