crypto: api - Increase MAX_ALGAPI_ALIGNMASK to 127
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 25 Nov 2022 04:36:39 +0000 (12:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 2 Dec 2022 10:12:40 +0000 (18:12 +0800)
Previously we limited the maximum alignment mask to 63.  This
is mostly due to stack usage for shash.  This patch introduces
a separate limit for shash algorithms and increases the general
limit to 127 which is the value that we need for DMA allocations
on arm64.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/shash.c
include/crypto/algapi.h

index 0f85431..868b6ba 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "internal.h"
 
+#define MAX_SHASH_ALIGNMASK 63
+
 static const struct crypto_type crypto_shash_type;
 
 int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
@@ -88,7 +90,7 @@ static int shash_update_unaligned(struct shash_desc *desc, const u8 *data,
         * We cannot count on __aligned() working for large values:
         * https://patchwork.kernel.org/patch/9507697/
         */
-       u8 ubuf[MAX_ALGAPI_ALIGNMASK * 2];
+       u8 ubuf[MAX_SHASH_ALIGNMASK * 2];
        u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
        int err;
 
@@ -130,7 +132,7 @@ static int shash_final_unaligned(struct shash_desc *desc, u8 *out)
         * We cannot count on __aligned() working for large values:
         * https://patchwork.kernel.org/patch/9507697/
         */
-       u8 ubuf[MAX_ALGAPI_ALIGNMASK + HASH_MAX_DIGESTSIZE];
+       u8 ubuf[MAX_SHASH_ALIGNMASK + HASH_MAX_DIGESTSIZE];
        u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
        int err;
 
@@ -524,6 +526,9 @@ static int shash_prepare_alg(struct shash_alg *alg)
            alg->statesize > HASH_MAX_STATESIZE)
                return -EINVAL;
 
+       if (base->cra_alignmask > MAX_SHASH_ALIGNMASK)
+               return -EINVAL;
+
        if ((alg->export && !alg->import) || (alg->import && !alg->export))
                return -EINVAL;
 
index 4c99eb6..8722fd6 100644 (file)
@@ -22,7 +22,7 @@
  * algs and architectures. Ciphers have a lower maximum size.
  */
 #define MAX_ALGAPI_BLOCKSIZE           160
-#define MAX_ALGAPI_ALIGNMASK           63
+#define MAX_ALGAPI_ALIGNMASK           127
 #define MAX_CIPHER_BLOCKSIZE           16
 #define MAX_CIPHER_ALIGNMASK           15