xref: /optee_os/lib/libmbedtls/mbedtls/library/padlock.h (revision b0563631928755fe864b97785160fb3088e9efdc)
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