crypto: arm64/aes-ccm - Keep NEON enabled during skcipher walk
authorArd Biesheuvel <ardb@kernel.org>
Thu, 18 Jan 2024 17:06:31 +0000 (18:06 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 26 Jan 2024 08:39:32 +0000 (16:39 +0800)
Now that kernel mode NEON no longer disables preemption, we no longer
have to take care to disable and re-enable use of the NEON when calling
into the skcipher walk API. So just keep it enabled until done.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/arm64/crypto/aes-ce-ccm-glue.c

index c4f14415f5f01c21287fb1f4bf4f1b64893ebad4..b177ebea7d09119e11ab5fca88d95c355e436465 100644 (file)
@@ -182,17 +182,16 @@ static int ccm_encrypt(struct aead_request *req)
                if (walk.nbytes == walk.total)
                        ce_aes_ccm_final(mac, buf, ctx->key_enc, num_rounds(ctx));
 
-               kernel_neon_end();
-
                if (walk.nbytes) {
                        err = skcipher_walk_done(&walk, tail);
-                       if (unlikely(err))
-                               return err;
-                       if (unlikely(walk.nbytes))
-                               kernel_neon_begin();
                }
        } while (walk.nbytes);
 
+       kernel_neon_end();
+
+       if (unlikely(err))
+               return err;
+
        /* copy authtag to end of dst */
        scatterwalk_map_and_copy(mac, req->dst, req->assoclen + req->cryptlen,
                                 crypto_aead_authsize(aead), 1);
@@ -240,17 +239,16 @@ static int ccm_decrypt(struct aead_request *req)
                if (walk.nbytes == walk.total)
                        ce_aes_ccm_final(mac, buf, ctx->key_enc, num_rounds(ctx));
 
-               kernel_neon_end();
-
                if (walk.nbytes) {
                        err = skcipher_walk_done(&walk, tail);
-                       if (unlikely(err))
-                               return err;
-                       if (unlikely(walk.nbytes))
-                               kernel_neon_begin();
                }
        } while (walk.nbytes);
 
+       kernel_neon_end();
+
+       if (unlikely(err))
+               return err;
+
        /* compare calculated auth tag with the stored one */
        scatterwalk_map_and_copy(buf, req->src,
                                 req->assoclen + req->cryptlen - authsize,