Skip to content

Commit

Permalink
[CRYPTO] Fix boundary check in standard multi-block cipher processors
Browse files Browse the repository at this point in the history
The boundary check in the standard multi-block cipher processors are
broken when nbytes is not a multiple of bsize.  In those cases it will
always process an extra block.

This patch corrects the check so that it processes at most nbytes of
data.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
herbertx authored and davem330 committed Sep 6, 2005
1 parent b69aee0 commit fe2d529
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions crypto/cipher.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,16 @@ static unsigned int cbc_process_encrypt(const struct cipher_desc *desc,
u8 *iv = desc->info;
unsigned int done = 0;

nbytes -= bsize;

do {
xor(iv, src);
fn(crypto_tfm_ctx(tfm), dst, iv);
memcpy(iv, dst, bsize);

src += bsize;
dst += bsize;
} while ((done += bsize) < nbytes);
} while ((done += bsize) <= nbytes);

return done;
}
Expand All @@ -219,6 +221,8 @@ static unsigned int cbc_process_decrypt(const struct cipher_desc *desc,
u8 *iv = desc->info;
unsigned int done = 0;

nbytes -= bsize;

do {
u8 *tmp_dst = *dst_p;

Expand All @@ -230,7 +234,7 @@ static unsigned int cbc_process_decrypt(const struct cipher_desc *desc,

src += bsize;
dst += bsize;
} while ((done += bsize) < nbytes);
} while ((done += bsize) <= nbytes);

return done;
}
Expand All @@ -243,12 +247,14 @@ static unsigned int ecb_process(const struct cipher_desc *desc, u8 *dst,
void (*fn)(void *, u8 *, const u8 *) = desc->crfn;
unsigned int done = 0;

nbytes -= bsize;

do {
fn(crypto_tfm_ctx(tfm), dst, src);

src += bsize;
dst += bsize;
} while ((done += bsize) < nbytes);
} while ((done += bsize) <= nbytes);

return done;
}
Expand Down

0 comments on commit fe2d529

Please sign in to comment.