Thread (53 messages) 53 messages, 5 authors, 2018-07-19

Re: [PATCH v4 11/14] treewide: Prepare to remove VLA usage for AHASH_REQUEST_ON_STACK

From: Arnd Bergmann <arnd@arndb.de>
Date: 2018-07-18 15:33:14
Also in: dm-devel, lkml

On Wed, Jul 18, 2018 at 5:19 PM, Ard Biesheuvel
[off-list ref] wrote:
On 18 July 2018 at 23:50, Ard Biesheuvel [off-list ref] wrote:
quoted
On 18 July 2018 at 05:59, Arnd Bergmann [off-list ref] wrote:
quoted
On Sun, Jul 15, 2018 at 6:28 AM, Kees Cook [off-list ref] wrote:
quoted
After my ahash to shash conversions, only ccm is left as an ahash
user, since it actually uses sg. But with the hard-coded value reduced
to 376, this doesn't trip the frame warnings any more. :)

I'll send an updated series soon.
Maybe we should get rid of that one as well then and remove
AHASH_REQUEST_ON_STACK()?

I see that Ard (now on Cc) added this usage only recently. Looking
at the code some more, I also find that the descsize is probably
much smaller than 376 for all possible cases   of "cbcmac(*)",
either alg->cra_blocksize plus a few bytes or sizeof(mac_desc_ctx)
(i.e. 20) for arch/arm64/crypto/aes-glue.c.

Walking the sglist here means open-coding a shash_ahash_update()
implementation in crypto_ccm_auth(), that that doesn't seem to
add much complexity over what it already has to do to chain
the sglist today.
It would be better to add a variably sized ahash request member to
struct crypto_ccm_req_priv_ctx, the only problem is that the last
member of that struct (skreq) is variably sized already, so it would
involve having a struct ahash_request pointer pointing into the same
struct, after the skreq member.
Actually, I think the below should already do the trick: ahreq and
skreq are not used at the same time, so we can stick them in a union,
and take the max() of the reqsize to ensure there's enough empty space
after it.
This looks very nice indeed.
quoted hunk ↗ jump to hunk
--------8<----------
diff --git a/crypto/ccm.c b/crypto/ccm.c
index 0a083342ec8c..b242fd0d3262 100644
--- a/crypto/ccm.c
+++ b/crypto/ccm.c
@@ -50,7 +50,10 @@ struct crypto_ccm_req_priv_ctx {
        u32 flags;
        struct scatterlist src[3];
        struct scatterlist dst[3];
-       struct skcipher_request skreq;
+       union {
+               struct ahash_request ahreq;
+               struct skcipher_request skreq;
+       };
 };
And this structure is never put on the stack anywhere but
always dynamically allocated anyway, right?

      Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help