Re: [PATCH v2 06/13] lib/crypto: aes: Add GCM support
Thomas Huth <[email protected]> Wed, 22 Jul 2026 13:02:46 +0200
| Newsgroups | org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 16/07/2026 00.11, Eric Biggers wrote: > Add support for AES-GCM to the crypto library. > > This will be used to provide streamlined implementations of the > "gcm(aes)" and "rfc4106(gcm(aes))" crypto_aead algorithms. Most users > of these will also be able to switch to the library, which as usual will > be faster and simpler, e.g.: > > - drivers/net/macsec.c > - fs/smb/client/ > - fs/smb/server/ > - net/ceph/messenger_v2.c > - net/mac80211/ (for both GMAC and GCMP) > - net/tipc/crypto.c > - security/keys/trusted-keys/trusted_dcp.c > > (I've already written proof-of-concept patches for all the above, and > they helped inform the API design.) > > As usual, the architecture-optimized AES-GCM code will be migrated into > the library as well (using the hooks provided in this commit as well as > the GHASH ones), eliminating lots of repetitive boilerplate code. > > Incremental en/decryption is supported. Incremental operation is a bit > controversial in AEAD APIs because users have to be careful not to > consume any decrypted data that hasn't been authenticated yet. But I do > think it's the right choice here. It's not fundamentally different from > the existing incremental MAC APIs, and it's the only approach that's > general enough to work well for all users in the kernel: > > - An array of virtually-addressed buffers (like that used by > BoringSSL's EVP_AEAD_CTX_sealv() and EVP_AEAD_CTX_openv()) doesn't > work in the kernel in general, since in some cases the data for a > single AES-GCM message is contained in a large number of highmem > pages that each need to be mapped into memory individually. That > can be done efficiently only by using CPU-local mappings, but there > is a limited number of those. > > Ceph messenger v2 is a great example, as it can send or receive up > to 32 MiB in a single AES-GCM message. And it needs the > en/decrypted data to go into a (potentially large) number of bvecs > provided by a custom iterator, as well as into four > virtually-addressed buffers, two of which can be large buffers in > the vmalloc region. > > Even just allocating an array big enough to store all the pointers > can be problematic in the kernel. There are cases in which > decryption runs in GFP_NOIO context or even in softirq context, > where memory allocations are not as reliable as they normally are. > > - Meanwhile, 'struct scatterlist' (the choice of crypto_aead) has > turned out to be really inconvenient for anyone who *does* just have > virtually-addressed buffers. This is especially true if they can be > in the vmalloc region, including the stack, as in that case the > conversion to a scatterlist has to be done page-by-page. > > And even for users who have all of their data in bare 'struct page', > none of them actually use 'struct scatterlist' as their native data > structure anyway. They actually use skbs, bvecs, or other formats. > > - iov_iter is attractive, but ultimately not general enough either > (considering the Ceph case for example), but also too general in > some ways (like having support for userspace addresses). Additional > iter types like ITER_SKB would help a bit, but bloating iov_iter > with more types would reduce performance elsewhere in the kernel. > > Initial test coverage is provided by the crypto_aead support added in a > later commit. I'm planning a KUnit test suite as well. Sorry for asking ignorant questions, but which later commit is this? I couldn't spot it :-/ Anyway, the previous AES-GCM code in lib/crypto/aesgcm.c featured some self-tests in libaesgcm_init() ... would it maybe make sense to add those here, too? Thomas