/src/mbedtls/library/aesni.h
Line | Count | Source (jump to first uncovered line) |
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 | 963k | #define MBEDTLS_AESNI_AES 0x02000000u |
33 | 0 | #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 */ |