xref: /qemu/include/crypto/aes-round.h (revision 8b7b9c5c)
1 /*
2  * AES round fragments, generic version
3  * SPDX-License-Identifier: GPL-2.0-or-later
4  *
5  * Copyright (C) 2023 Linaro, Ltd.
6  */
7 
8 #ifndef CRYPTO_AES_ROUND_H
9 #define CRYPTO_AES_ROUND_H
10 
11 /* Hosts with acceleration will usually need a 16-byte vector type. */
12 typedef uint8_t AESStateVec __attribute__((vector_size(16)));
13 
14 typedef union {
15     uint8_t b[16];
16     uint32_t w[4];
17     uint64_t d[2];
18     AESStateVec v;
19 } AESState;
20 
21 #include "host/crypto/aes-round.h"
22 
23 /*
24  * Perform MixColumns.
25  */
26 
27 void aesenc_MC_gen(AESState *ret, const AESState *st);
28 void aesenc_MC_genrev(AESState *ret, const AESState *st);
29 
30 static inline void aesenc_MC(AESState *r, const AESState *st, bool be)
31 {
32     if (HAVE_AES_ACCEL) {
33         aesenc_MC_accel(r, st, be);
34     } else if (HOST_BIG_ENDIAN == be) {
35         aesenc_MC_gen(r, st);
36     } else {
37         aesenc_MC_genrev(r, st);
38     }
39 }
40 
41 /*
42  * Perform SubBytes + ShiftRows + AddRoundKey.
43  */
44 
45 void aesenc_SB_SR_AK_gen(AESState *ret, const AESState *st,
46                          const AESState *rk);
47 void aesenc_SB_SR_AK_genrev(AESState *ret, const AESState *st,
48                             const AESState *rk);
49 
50 static inline void aesenc_SB_SR_AK(AESState *r, const AESState *st,
51                                    const AESState *rk, bool be)
52 {
53     if (HAVE_AES_ACCEL) {
54         aesenc_SB_SR_AK_accel(r, st, rk, be);
55     } else if (HOST_BIG_ENDIAN == be) {
56         aesenc_SB_SR_AK_gen(r, st, rk);
57     } else {
58         aesenc_SB_SR_AK_genrev(r, st, rk);
59     }
60 }
61 
62 /*
63  * Perform SubBytes + ShiftRows + MixColumns + AddRoundKey.
64  */
65 
66 void aesenc_SB_SR_MC_AK_gen(AESState *ret, const AESState *st,
67                             const AESState *rk);
68 void aesenc_SB_SR_MC_AK_genrev(AESState *ret, const AESState *st,
69                                const AESState *rk);
70 
71 static inline void aesenc_SB_SR_MC_AK(AESState *r, const AESState *st,
72                                       const AESState *rk, bool be)
73 {
74     if (HAVE_AES_ACCEL) {
75         aesenc_SB_SR_MC_AK_accel(r, st, rk, be);
76     } else if (HOST_BIG_ENDIAN == be) {
77         aesenc_SB_SR_MC_AK_gen(r, st, rk);
78     } else {
79         aesenc_SB_SR_MC_AK_genrev(r, st, rk);
80     }
81 }
82 
83 /*
84  * Perform InvMixColumns.
85  */
86 
87 void aesdec_IMC_gen(AESState *ret, const AESState *st);
88 void aesdec_IMC_genrev(AESState *ret, const AESState *st);
89 
90 static inline void aesdec_IMC(AESState *r, const AESState *st, bool be)
91 {
92     if (HAVE_AES_ACCEL) {
93         aesdec_IMC_accel(r, st, be);
94     } else if (HOST_BIG_ENDIAN == be) {
95         aesdec_IMC_gen(r, st);
96     } else {
97         aesdec_IMC_genrev(r, st);
98     }
99 }
100 
101 /*
102  * Perform InvSubBytes + InvShiftRows + AddRoundKey.
103  */
104 
105 void aesdec_ISB_ISR_AK_gen(AESState *ret, const AESState *st,
106                            const AESState *rk);
107 void aesdec_ISB_ISR_AK_genrev(AESState *ret, const AESState *st,
108                               const AESState *rk);
109 
110 static inline void aesdec_ISB_ISR_AK(AESState *r, const AESState *st,
111                                      const AESState *rk, bool be)
112 {
113     if (HAVE_AES_ACCEL) {
114         aesdec_ISB_ISR_AK_accel(r, st, rk, be);
115     } else if (HOST_BIG_ENDIAN == be) {
116         aesdec_ISB_ISR_AK_gen(r, st, rk);
117     } else {
118         aesdec_ISB_ISR_AK_genrev(r, st, rk);
119     }
120 }
121 
122 /*
123  * Perform InvSubBytes + InvShiftRows + AddRoundKey + InvMixColumns.
124  */
125 
126 void aesdec_ISB_ISR_AK_IMC_gen(AESState *ret, const AESState *st,
127                                const AESState *rk);
128 void aesdec_ISB_ISR_AK_IMC_genrev(AESState *ret, const AESState *st,
129                                   const AESState *rk);
130 
131 static inline void aesdec_ISB_ISR_AK_IMC(AESState *r, const AESState *st,
132                                          const AESState *rk, bool be)
133 {
134     if (HAVE_AES_ACCEL) {
135         aesdec_ISB_ISR_AK_IMC_accel(r, st, rk, be);
136     } else if (HOST_BIG_ENDIAN == be) {
137         aesdec_ISB_ISR_AK_IMC_gen(r, st, rk);
138     } else {
139         aesdec_ISB_ISR_AK_IMC_genrev(r, st, rk);
140     }
141 }
142 
143 /*
144  * Perform InvSubBytes + InvShiftRows + InvMixColumns + AddRoundKey.
145  */
146 
147 void aesdec_ISB_ISR_IMC_AK_gen(AESState *ret, const AESState *st,
148                                const AESState *rk);
149 void aesdec_ISB_ISR_IMC_AK_genrev(AESState *ret, const AESState *st,
150                                   const AESState *rk);
151 
152 static inline void aesdec_ISB_ISR_IMC_AK(AESState *r, const AESState *st,
153                                          const AESState *rk, bool be)
154 {
155     if (HAVE_AES_ACCEL) {
156         aesdec_ISB_ISR_IMC_AK_accel(r, st, rk, be);
157     } else if (HOST_BIG_ENDIAN == be) {
158         aesdec_ISB_ISR_IMC_AK_gen(r, st, rk);
159     } else {
160         aesdec_ISB_ISR_IMC_AK_genrev(r, st, rk);
161     }
162 }
163 
164 #endif /* CRYPTO_AES_ROUND_H */
165