Coverage Report

Created: 2024-01-20 12:33

/src/mbedtls/library/aesni.h
Line
Count
Source
1
/**
2
 * \file aesni.h
3
 *
4
 * \brief AES-NI for hardware AES acceleration on some Intel processors
5
 *
6
 * \warning These functions are only for internal use by other library
7
 *          functions; you must not call them directly.
8
 */
9
/*
10
 *  Copyright The Mbed TLS Contributors
11
 *  SPDX-License-Identifier: Apache-2.0
12
 *
13
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
14
 *  not use this file except in compliance with the License.
15
 *  You may obtain a copy of the License at
16
 *
17
 *  http://www.apache.org/licenses/LICENSE-2.0
18
 *
19
 *  Unless required by applicable law or agreed to in writing, software
20
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
 *  See the License for the specific language governing permissions and
23
 *  limitations under the License.
24
 */
25
#ifndef MBEDTLS_AESNI_H
26
#define MBEDTLS_AESNI_H
27
28
#include "mbedtls/build_info.h"
29
30
#include "mbedtls/aes.h"
31
32
836k
#define MBEDTLS_AESNI_AES      0x02000000u
33
5.14k
#define MBEDTLS_AESNI_CLMUL    0x00000002u
34
35
#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) &&  \
36
    (defined(__amd64__) || defined(__x86_64__))   &&  \
37
    !defined(MBEDTLS_HAVE_X86_64)
38
#define MBEDTLS_HAVE_X86_64
39
#endif
40
41
#if defined(MBEDTLS_HAVE_X86_64)
42
43
#ifdef __cplusplus
44
extern "C" {
45
#endif
46
47
/**
48
 * \brief          Internal function to detect the AES-NI feature in CPUs.
49
 *
50
 * \note           This function is only for internal use by other library
51
 *                 functions; you must not call it directly.
52
 *
53
 * \param what     The feature to detect
54
 *                 (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL)
55
 *
56
 * \return         1 if CPU has support for the feature, 0 otherwise
57
 */
58
int mbedtls_aesni_has_support(unsigned int what);
59
60
/**
61
 * \brief          Internal AES-NI AES-ECB block encryption and decryption
62
 *
63
 * \note           This function is only for internal use by other library
64
 *                 functions; you must not call it directly.
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_aesni_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_aesni_gcm_mult(unsigned char c[16],
92
                            const unsigned char a[16],
93
                            const unsigned char b[16]);
94
95
/**
96
 * \brief           Internal round key inversion. This function computes
97
 *                  decryption round keys from the encryption round keys.
98
 *
99
 * \note            This function is only for internal use by other library
100
 *                  functions; you must not call it directly.
101
 *
102
 * \param invkey    Round keys for the equivalent inverse cipher
103
 * \param fwdkey    Original round keys (for encryption)
104
 * \param nr        Number of rounds (that is, number of round keys minus one)
105
 */
106
void mbedtls_aesni_inverse_key(unsigned char *invkey,
107
                               const unsigned char *fwdkey,
108
                               int nr);
109
110
/**
111
 * \brief           Internal key expansion for encryption
112
 *
113
 * \note            This function is only for internal use by other library
114
 *                  functions; you must not call it directly.
115
 *
116
 * \param rk        Destination buffer where the round keys are written
117
 * \param key       Encryption key
118
 * \param bits      Key size in bits (must be 128, 192 or 256)
119
 *
120
 * \return          0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH
121
 */
122
int mbedtls_aesni_setkey_enc(unsigned char *rk,
123
                             const unsigned char *key,
124
                             size_t bits);
125
126
#ifdef __cplusplus
127
}
128
#endif
129
130
#endif /* MBEDTLS_HAVE_X86_64 */
131
132
#endif /* MBEDTLS_AESNI_H */