Skip to content

Commit

Permalink
crypto: skcipher - Fix crash on zero-length input
Browse files Browse the repository at this point in the history
The skcipher walk interface doesn't handle zero-length input
properly as the old blkcipher walk interface did.  This is due
to the fact that the length check is done too late.

This patch moves the length check forward so that it does the
right thing.

Fixes: b286d8b ("crypto: skcipher - Add skcipher walk...")
Cc: <stable@vger.kernel.org>
Reported-by: Stephan Müller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
herbertx committed Oct 7, 2017
1 parent 9039f3e commit 0cabf2a
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions crypto/skcipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,14 +426,9 @@ static int skcipher_copy_iv(struct skcipher_walk *walk)

static int skcipher_walk_first(struct skcipher_walk *walk)
{
walk->nbytes = 0;

if (WARN_ON_ONCE(in_irq()))
return -EDEADLK;

if (unlikely(!walk->total))
return 0;

walk->buffer = NULL;
if (unlikely(((unsigned long)walk->iv & walk->alignmask))) {
int err = skcipher_copy_iv(walk);
Expand All @@ -452,10 +447,15 @@ static int skcipher_walk_skcipher(struct skcipher_walk *walk,
{
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);

walk->total = req->cryptlen;
walk->nbytes = 0;

if (unlikely(!walk->total))
return 0;

scatterwalk_start(&walk->in, req->src);
scatterwalk_start(&walk->out, req->dst);

walk->total = req->cryptlen;
walk->iv = req->iv;
walk->oiv = req->iv;

Expand Down Expand Up @@ -509,6 +509,11 @@ static int skcipher_walk_aead_common(struct skcipher_walk *walk,
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
int err;

walk->nbytes = 0;

if (unlikely(!walk->total))
return 0;

walk->flags &= ~SKCIPHER_WALK_PHYS;

scatterwalk_start(&walk->in, req->src);
Expand Down

0 comments on commit 0cabf2a

Please sign in to comment.