Skip to content

Commit bc79efa

Browse files
author
Eric Biggers
committed
lib/crypto: aesgcm: Use new AES library API
Switch from the old AES library functions (which use struct crypto_aes_ctx) to the new ones (which use struct aes_enckey). This eliminates the unnecessary computation and caching of the decryption round keys. The new AES en/decryption functions are also much faster and use AES instructions when supported by the CPU. Note that in addition to the change in the key preparation function and the key struct type itself, the change in the type of the key struct results in aes_encrypt() (which is temporarily a type-generic macro) calling the new encryption function rather than the old one. Acked-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lore.kernel.org/r/20260112192035.10427-34-ebiggers@kernel.org Signed-off-by: Eric Biggers <ebiggers@kernel.org>
1 parent 7fcb22d commit bc79efa

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

include/crypto/gcm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static inline int crypto_ipsec_check_assoclen(unsigned int assoclen)
6666

6767
struct aesgcm_ctx {
6868
be128 ghash_key;
69-
struct crypto_aes_ctx aes_ctx;
69+
struct aes_enckey aes_key;
7070
unsigned int authsize;
7171
};
7272

lib/crypto/aesgcm.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <linux/module.h>
1313
#include <asm/irqflags.h>
1414

15-
static void aesgcm_encrypt_block(const struct crypto_aes_ctx *ctx, void *dst,
15+
static void aesgcm_encrypt_block(const struct aes_enckey *key, void *dst,
1616
const void *src)
1717
{
1818
unsigned long flags;
@@ -26,7 +26,7 @@ static void aesgcm_encrypt_block(const struct crypto_aes_ctx *ctx, void *dst,
2626
* effective when running with interrupts disabled.
2727
*/
2828
local_irq_save(flags);
29-
aes_encrypt(ctx, dst, src);
29+
aes_encrypt(key, dst, src);
3030
local_irq_restore(flags);
3131
}
3232

@@ -49,12 +49,12 @@ int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key,
4949
int ret;
5050

5151
ret = crypto_gcm_check_authsize(authsize) ?:
52-
aes_expandkey(&ctx->aes_ctx, key, keysize);
52+
aes_prepareenckey(&ctx->aes_key, key, keysize);
5353
if (ret)
5454
return ret;
5555

5656
ctx->authsize = authsize;
57-
aesgcm_encrypt_block(&ctx->aes_ctx, &ctx->ghash_key, kin);
57+
aesgcm_encrypt_block(&ctx->aes_key, &ctx->ghash_key, kin);
5858

5959
return 0;
6060
}
@@ -97,7 +97,7 @@ static void aesgcm_mac(const struct aesgcm_ctx *ctx, const u8 *src, int src_len,
9797
aesgcm_ghash(&ghash, &ctx->ghash_key, &tail, sizeof(tail));
9898

9999
ctr[3] = cpu_to_be32(1);
100-
aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr);
100+
aesgcm_encrypt_block(&ctx->aes_key, buf, ctr);
101101
crypto_xor_cpy(authtag, buf, (u8 *)&ghash, ctx->authsize);
102102

103103
memzero_explicit(&ghash, sizeof(ghash));
@@ -119,7 +119,7 @@ static void aesgcm_crypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src,
119119
* len', this cannot happen, so no explicit test is necessary.
120120
*/
121121
ctr[3] = cpu_to_be32(n++);
122-
aesgcm_encrypt_block(&ctx->aes_ctx, buf, ctr);
122+
aesgcm_encrypt_block(&ctx->aes_key, buf, ctr);
123123
crypto_xor_cpy(dst, src, buf, min(len, AES_BLOCK_SIZE));
124124

125125
dst += AES_BLOCK_SIZE;

0 commit comments

Comments
 (0)