[PATCH 10/19] crypto: arm64/aes-gcm - Rename struct ghash_key and make fixed-sized

Eric Biggers
2026-03-19T06:19:19Z

Rename the 'struct ghash_key' in arch/arm64/crypto/ghash-ce-glue.c to
prevent a naming conflict with the library 'struct ghash_key'. In
addition, declare the 'h' field with an explicit size, now that there's
no longer any reason for it to be a flexible array.

Update the comments in the assembly file to match the C code. Note that
some of these were out-of-date.

Signed-off-by: Eric Biggers <ebiggers@kernel.org>
---
arch/arm64/crypto/ghash-ce-core.S | 15 ++++++++-------
arch/arm64/crypto/ghash-ce-glue.c | 20 +++++++++-----------
2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/arch/arm64/crypto/ghash-ce-core.S b/arch/arm64/crypto/ghash-ce-core.S
index a01f136f4fb2..33772d8fe6b5 100644
--- a/arch/arm64/crypto/ghash-ce-core.S
+++ b/arch/arm64/crypto/ghash-ce-core.S
@@ -62,11 +62,11 @@
pmull XL.1q, XL.1d, MASK.1d
.endm

/*
* void pmull_ghash_update_p64(int blocks, u64 dg[], const char *src,
- * u64 const h[][2], const char *head)
+ * u64 const h[4][2], const char *head)
*/
SYM_FUNC_START(pmull_ghash_update_p64)
ld1 {SHASH.2d}, [x3]
ld1 {XL.2d}, [x1]

@@ -411,22 +411,23 @@ CPU_LE( rev w8, w8 )
.endif
b 3b
.endm

/*
- * void pmull_gcm_encrypt(int blocks, u8 dst[], const u8 src[],
- * struct ghash_key const *k, u64 dg[], u8 ctr[],
- * int rounds, u8 tag)
+ * void pmull_gcm_encrypt(int bytes, u8 dst[], const u8 src[],
+ * u64 const h[4][2], u64 dg[], u8 ctr[],
+ * u32 const rk[], int rounds, u8 tag[])
*/
SYM_FUNC_START(pmull_gcm_encrypt)
pmull_gcm_do_crypt 1
SYM_FUNC_END(pmull_gcm_encrypt)

/*
- * void pmull_gcm_decrypt(int blocks, u8 dst[], const u8 src[],
- * struct ghash_key const *k, u64 dg[], u8 ctr[],
- * int rounds, u8 tag)
+ * int pmull_gcm_decrypt(int bytes, u8 dst[], const u8 src[],
+ * u64 const h[4][2], u64 dg[], u8 ctr[],
+ * u32 const rk[], int rounds, const u8 l[],
+ * const u8 tag[], u64 authsize)
*/
SYM_FUNC_START(pmull_gcm_decrypt)
pmull_gcm_do_crypt 0
SYM_FUNC_END(pmull_gcm_decrypt)

diff --git a/arch/arm64/crypto/ghash-ce-glue.c b/arch/arm64/crypto/ghash-ce-glue.c
index 42fb46bdc124..c74066d430fa 100644
--- a/arch/arm64/crypto/ghash-ce-glue.c
+++ b/arch/arm64/crypto/ghash-ce-glue.c
@@ -28,38 +28,38 @@ MODULE_LICENSE("GPL v2");
MODULE_ALIAS_CRYPTO("gcm(aes)");
MODULE_ALIAS_CRYPTO("rfc4106(gcm(aes))");

#define RFC4106_NONCE_SIZE 4

-struct ghash_key {
+struct arm_ghash_key {
be128 k;
- u64 h[][2];
+ u64 h[4][2];
};

struct arm_ghash_desc_ctx {
u64 digest[GHASH_DIGEST_SIZE/sizeof(u64)];
};

struct gcm_aes_ctx {
struct aes_enckey aes_key;
u8 nonce[RFC4106_NONCE_SIZE];
- struct ghash_key ghash_key;
+ struct arm_ghash_key ghash_key;
};

asmlinkage void pmull_ghash_update_p64(int blocks, u64 dg[], const char *src,
- u64 const h[][2], const char *head);
+ u64 const h[4][2], const char *head);

asmlinkage void pmull_gcm_encrypt(int bytes, u8 dst[], const u8 src[],
- u64 const h[][2], u64 dg[], u8 ctr[],
+ u64 const h[4][2], u64 dg[], u8 ctr[],
u32 const rk[], int rounds, u8 tag[]);
asmlinkage int pmull_gcm_decrypt(int bytes, u8 dst[], const u8 src[],
- u64 const h[][2], u64 dg[], u8 ctr[],
+ u64 const h[4][2], u64 dg[], u8 ctr[],
u32 const rk[], int rounds, const u8 l[],
const u8 tag[], u64 authsize);

static void ghash_do_simd_update(int blocks, u64 dg[], const char *src,
- struct ghash_key *key, const char *head)
+ struct arm_ghash_key *key, const char *head)
{
scoped_ksimd()
pmull_ghash_update_p64(blocks, dg, src, key->h, head);
}

@@ -365,12 +365,11 @@ static struct aead_alg gcm_aes_algs[] = {{

.base.cra_name = "gcm(aes)",
.base.cra_driver_name = "gcm-aes-ce",
.base.cra_priority = 300,
.base.cra_blocksize = 1,
- .base.cra_ctxsize = sizeof(struct gcm_aes_ctx) +
- 4 * sizeof(u64[2]),
+ .base.cra_ctxsize = sizeof(struct gcm_aes_ctx),
.base.cra_module = THIS_MODULE,
}, {
.ivsize = GCM_RFC4106_IV_SIZE,
.chunksize = AES_BLOCK_SIZE,
.maxauthsize = AES_BLOCK_SIZE,
@@ -381,12 +380,11 @@ static struct aead_alg gcm_aes_algs[] = {{

.base.cra_name = "rfc4106(gcm(aes))",
.base.cra_driver_name = "rfc4106-gcm-aes-ce",
.base.cra_priority = 300,
.base.cra_blocksize = 1,
- .base.cra_ctxsize = sizeof(struct gcm_aes_ctx) +
- 4 * sizeof(u64[2]),
+ .base.cra_ctxsize = sizeof(struct gcm_aes_ctx),
.base.cra_module = THIS_MODULE,
}};

static int __init ghash_ce_mod_init(void)
{
--
2.53.0