123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- * AES round fragments, generic version
- * SPDX-License-Identifier: GPL-2.0-or-later
- *
- * Copyright (C) 2023 Linaro, Ltd.
- */
- #ifndef CRYPTO_AES_ROUND_H
- #define CRYPTO_AES_ROUND_H
- /* Hosts with acceleration will usually need a 16-byte vector type. */
- typedef uint8_t AESStateVec __attribute__((vector_size(16)));
- typedef union {
- uint8_t b[16];
- uint32_t w[4];
- uint64_t d[2];
- AESStateVec v;
- } AESState;
- #include "host/crypto/aes-round.h"
- /*
- * Perform MixColumns.
- */
- void aesenc_MC_gen(AESState *ret, const AESState *st);
- void aesenc_MC_genrev(AESState *ret, const AESState *st);
- static inline void aesenc_MC(AESState *r, const AESState *st, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesenc_MC_accel(r, st, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesenc_MC_gen(r, st);
- } else {
- aesenc_MC_genrev(r, st);
- }
- }
- /*
- * Perform SubBytes + ShiftRows + AddRoundKey.
- */
- void aesenc_SB_SR_AK_gen(AESState *ret, const AESState *st,
- const AESState *rk);
- void aesenc_SB_SR_AK_genrev(AESState *ret, const AESState *st,
- const AESState *rk);
- static inline void aesenc_SB_SR_AK(AESState *r, const AESState *st,
- const AESState *rk, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesenc_SB_SR_AK_accel(r, st, rk, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesenc_SB_SR_AK_gen(r, st, rk);
- } else {
- aesenc_SB_SR_AK_genrev(r, st, rk);
- }
- }
- /*
- * Perform SubBytes + ShiftRows + MixColumns + AddRoundKey.
- */
- void aesenc_SB_SR_MC_AK_gen(AESState *ret, const AESState *st,
- const AESState *rk);
- void aesenc_SB_SR_MC_AK_genrev(AESState *ret, const AESState *st,
- const AESState *rk);
- static inline void aesenc_SB_SR_MC_AK(AESState *r, const AESState *st,
- const AESState *rk, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesenc_SB_SR_MC_AK_accel(r, st, rk, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesenc_SB_SR_MC_AK_gen(r, st, rk);
- } else {
- aesenc_SB_SR_MC_AK_genrev(r, st, rk);
- }
- }
- /*
- * Perform InvMixColumns.
- */
- void aesdec_IMC_gen(AESState *ret, const AESState *st);
- void aesdec_IMC_genrev(AESState *ret, const AESState *st);
- static inline void aesdec_IMC(AESState *r, const AESState *st, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesdec_IMC_accel(r, st, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesdec_IMC_gen(r, st);
- } else {
- aesdec_IMC_genrev(r, st);
- }
- }
- /*
- * Perform InvSubBytes + InvShiftRows + AddRoundKey.
- */
- void aesdec_ISB_ISR_AK_gen(AESState *ret, const AESState *st,
- const AESState *rk);
- void aesdec_ISB_ISR_AK_genrev(AESState *ret, const AESState *st,
- const AESState *rk);
- static inline void aesdec_ISB_ISR_AK(AESState *r, const AESState *st,
- const AESState *rk, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesdec_ISB_ISR_AK_accel(r, st, rk, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesdec_ISB_ISR_AK_gen(r, st, rk);
- } else {
- aesdec_ISB_ISR_AK_genrev(r, st, rk);
- }
- }
- /*
- * Perform InvSubBytes + InvShiftRows + AddRoundKey + InvMixColumns.
- */
- void aesdec_ISB_ISR_AK_IMC_gen(AESState *ret, const AESState *st,
- const AESState *rk);
- void aesdec_ISB_ISR_AK_IMC_genrev(AESState *ret, const AESState *st,
- const AESState *rk);
- static inline void aesdec_ISB_ISR_AK_IMC(AESState *r, const AESState *st,
- const AESState *rk, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesdec_ISB_ISR_AK_IMC_accel(r, st, rk, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesdec_ISB_ISR_AK_IMC_gen(r, st, rk);
- } else {
- aesdec_ISB_ISR_AK_IMC_genrev(r, st, rk);
- }
- }
- /*
- * Perform InvSubBytes + InvShiftRows + InvMixColumns + AddRoundKey.
- */
- void aesdec_ISB_ISR_IMC_AK_gen(AESState *ret, const AESState *st,
- const AESState *rk);
- void aesdec_ISB_ISR_IMC_AK_genrev(AESState *ret, const AESState *st,
- const AESState *rk);
- static inline void aesdec_ISB_ISR_IMC_AK(AESState *r, const AESState *st,
- const AESState *rk, bool be)
- {
- if (HAVE_AES_ACCEL) {
- aesdec_ISB_ISR_IMC_AK_accel(r, st, rk, be);
- } else if (HOST_BIG_ENDIAN == be) {
- aesdec_ISB_ISR_IMC_AK_gen(r, st, rk);
- } else {
- aesdec_ISB_ISR_IMC_AK_genrev(r, st, rk);
- }
- }
- #endif /* CRYPTO_AES_ROUND_H */
|