summaryrefslogtreecommitdiffstats
path: root/crypto/aegis256.c
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2019-02-01 02:51:36 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2019-02-08 02:30:08 -0500
commit0f533e67d26f228ea5dfdacc8a4bdeb487af5208 (patch)
tree2124e65bceaf4d859803284f4e98f99beceee967 /crypto/aegis256.c
parent42e95d1f10dcf8b18b1d7f52f7068985b3dc5b79 (diff)
crypto: aegis - fix handling chunked inputs
The generic AEGIS implementations all fail the improved AEAD tests because they produce the wrong result with some data layouts. The issue is that they assume that if the skcipher_walk API gives 'nbytes' not aligned to the walksize (a.k.a. walk.stride), then it is the end of the data. In fact, this can happen before the end. Fix them. Fixes: f606a88e5823 ("crypto: aegis - Add generic AEGIS AEAD implementations") Cc: <stable@vger.kernel.org> # v4.18+ Cc: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Eric Biggers <ebiggers@google.com> Reviewed-by: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/aegis256.c')
-rw-r--r--crypto/aegis256.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/crypto/aegis256.c b/crypto/aegis256.c
index 49882a28e93e..ecd6b7f34a2d 100644
--- a/crypto/aegis256.c
+++ b/crypto/aegis256.c
@@ -299,19 +299,19 @@ static void crypto_aegis256_process_crypt(struct aegis_state *state,
299 const struct aegis256_ops *ops) 299 const struct aegis256_ops *ops)
300{ 300{
301 struct skcipher_walk walk; 301 struct skcipher_walk walk;
302 u8 *src, *dst;
303 unsigned int chunksize;
304 302
305 ops->skcipher_walk_init(&walk, req, false); 303 ops->skcipher_walk_init(&walk, req, false);
306 304
307 while (walk.nbytes) { 305 while (walk.nbytes) {
308 src = walk.src.virt.addr; 306 unsigned int nbytes = walk.nbytes;
309 dst = walk.dst.virt.addr;
310 chunksize = walk.nbytes;
311 307
312 ops->crypt_chunk(state, dst, src, chunksize); 308 if (nbytes < walk.total)
309 nbytes = round_down(nbytes, walk.stride);
313 310
314 skcipher_walk_done(&walk, 0); 311 ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr,
312 nbytes);
313
314 skcipher_walk_done(&walk, walk.nbytes - nbytes);
315 } 315 }
316} 316}
317 317