132b31808SJens Wiklander /** 232b31808SJens Wiklander * \file padlock.h 332b31808SJens Wiklander * 432b31808SJens Wiklander * \brief VIA PadLock ACE for HW encryption/decryption supported by some 532b31808SJens Wiklander * processors 632b31808SJens Wiklander * 732b31808SJens Wiklander * \warning These functions are only for internal use by other library 832b31808SJens Wiklander * functions; you must not call them directly. 932b31808SJens Wiklander */ 1032b31808SJens Wiklander /* 1132b31808SJens Wiklander * Copyright The Mbed TLS Contributors 12*b0563631STom Van Eyck * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 1332b31808SJens Wiklander */ 1432b31808SJens Wiklander #ifndef MBEDTLS_PADLOCK_H 1532b31808SJens Wiklander #define MBEDTLS_PADLOCK_H 1632b31808SJens Wiklander 1732b31808SJens Wiklander #include "mbedtls/build_info.h" 1832b31808SJens Wiklander 1932b31808SJens Wiklander #include "mbedtls/aes.h" 2032b31808SJens Wiklander 2132b31808SJens Wiklander #define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ 2232b31808SJens Wiklander 2332b31808SJens Wiklander #if defined(__has_feature) 2432b31808SJens Wiklander #if __has_feature(address_sanitizer) 2532b31808SJens Wiklander #define MBEDTLS_HAVE_ASAN 2632b31808SJens Wiklander #endif 2732b31808SJens Wiklander #endif 2832b31808SJens Wiklander 29*b0563631STom Van Eyck /* 30*b0563631STom Van Eyck * - `padlock` is implements with GNUC assembly for x86 target. 31*b0563631STom Van Eyck * - Some versions of ASan result in errors about not enough registers. 32*b0563631STom Van Eyck */ 33*b0563631STom Van Eyck #if defined(MBEDTLS_PADLOCK_C) && \ 34*b0563631STom Van Eyck defined(__GNUC__) && defined(MBEDTLS_ARCH_IS_X86) && \ 35*b0563631STom Van Eyck defined(MBEDTLS_HAVE_ASM) && \ 3632b31808SJens Wiklander !defined(MBEDTLS_HAVE_ASAN) 3732b31808SJens Wiklander 38*b0563631STom Van Eyck #define MBEDTLS_VIA_PADLOCK_HAVE_CODE 3932b31808SJens Wiklander 4032b31808SJens Wiklander #include <stdint.h> 4132b31808SJens Wiklander 4232b31808SJens Wiklander #define MBEDTLS_PADLOCK_RNG 0x000C 4332b31808SJens Wiklander #define MBEDTLS_PADLOCK_ACE 0x00C0 4432b31808SJens Wiklander #define MBEDTLS_PADLOCK_PHE 0x0C00 4532b31808SJens Wiklander #define MBEDTLS_PADLOCK_PMM 0x3000 4632b31808SJens Wiklander 4732b31808SJens Wiklander #define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) (x) & ~15)) 4832b31808SJens Wiklander 4932b31808SJens Wiklander #ifdef __cplusplus 5032b31808SJens Wiklander extern "C" { 5132b31808SJens Wiklander #endif 5232b31808SJens Wiklander 5332b31808SJens Wiklander /** 5432b31808SJens Wiklander * \brief Internal PadLock detection routine 5532b31808SJens Wiklander * 5632b31808SJens Wiklander * \note This function is only for internal use by other library 5732b31808SJens Wiklander * functions; you must not call it directly. 5832b31808SJens Wiklander * 5932b31808SJens Wiklander * \param feature The feature to detect 6032b31808SJens Wiklander * 6132b31808SJens Wiklander * \return non-zero if CPU has support for the feature, 0 otherwise 6232b31808SJens Wiklander */ 6332b31808SJens Wiklander int mbedtls_padlock_has_support(int feature); 6432b31808SJens Wiklander 6532b31808SJens Wiklander /** 6632b31808SJens Wiklander * \brief Internal PadLock AES-ECB block en(de)cryption 6732b31808SJens Wiklander * 6832b31808SJens Wiklander * \note This function is only for internal use by other library 6932b31808SJens Wiklander * functions; you must not call it directly. 7032b31808SJens Wiklander * 7132b31808SJens Wiklander * \param ctx AES context 7232b31808SJens Wiklander * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT 7332b31808SJens Wiklander * \param input 16-byte input block 7432b31808SJens Wiklander * \param output 16-byte output block 7532b31808SJens Wiklander * 7632b31808SJens Wiklander * \return 0 if success, 1 if operation failed 7732b31808SJens Wiklander */ 7832b31808SJens Wiklander int mbedtls_padlock_xcryptecb(mbedtls_aes_context *ctx, 7932b31808SJens Wiklander int mode, 8032b31808SJens Wiklander const unsigned char input[16], 8132b31808SJens Wiklander unsigned char output[16]); 8232b31808SJens Wiklander 8332b31808SJens Wiklander /** 8432b31808SJens Wiklander * \brief Internal PadLock AES-CBC buffer en(de)cryption 8532b31808SJens Wiklander * 8632b31808SJens Wiklander * \note This function is only for internal use by other library 8732b31808SJens Wiklander * functions; you must not call it directly. 8832b31808SJens Wiklander * 8932b31808SJens Wiklander * \param ctx AES context 9032b31808SJens Wiklander * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT 9132b31808SJens Wiklander * \param length length of the input data 9232b31808SJens Wiklander * \param iv initialization vector (updated after use) 9332b31808SJens Wiklander * \param input buffer holding the input data 9432b31808SJens Wiklander * \param output buffer holding the output data 9532b31808SJens Wiklander * 9632b31808SJens Wiklander * \return 0 if success, 1 if operation failed 9732b31808SJens Wiklander */ 9832b31808SJens Wiklander int mbedtls_padlock_xcryptcbc(mbedtls_aes_context *ctx, 9932b31808SJens Wiklander int mode, 10032b31808SJens Wiklander size_t length, 10132b31808SJens Wiklander unsigned char iv[16], 10232b31808SJens Wiklander const unsigned char *input, 10332b31808SJens Wiklander unsigned char *output); 10432b31808SJens Wiklander 10532b31808SJens Wiklander #ifdef __cplusplus 10632b31808SJens Wiklander } 10732b31808SJens Wiklander #endif 10832b31808SJens Wiklander 10932b31808SJens Wiklander #endif /* HAVE_X86 */ 11032b31808SJens Wiklander 11132b31808SJens Wiklander #endif /* padlock.h */ 112