quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

aesce.h (4597B)


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