ANDROID: crypto: allow blkcipher walks over ablkcipher data

Add a function blkcipher_ablkcipher_walk_virt() which allows ablkcipher
algorithms to use the blkcipher_walk API to walk over their data.  This
will be used by the HEH algorithm, which to support asynchronous ECB
algorithms will be an ablkcipher, but it also needs to make other passes
over the data.

Bug: 32975945
Signed-off-by: Eric Biggers <ebiggers@google.com>
Change-Id: I05f9a0e5473ba6115fcc72d5122d6b0b18b2078b
This commit is contained in:
Eric Biggers 2017-01-10 16:47:49 -08:00 committed by Amit Pundir
parent ea6520c1c8
commit c1bba8c93f
2 changed files with 24 additions and 0 deletions

View File

@ -373,6 +373,27 @@ int blkcipher_aead_walk_virt_block(struct blkcipher_desc *desc,
}
EXPORT_SYMBOL_GPL(blkcipher_aead_walk_virt_block);
/*
* This function allows ablkcipher algorithms to use the blkcipher_walk API to
* walk over their data. The specified crypto_ablkcipher tfm is used to
* initialize the struct blkcipher_walk, and the crypto_blkcipher specified in
* desc->tfm is never used so it can be left NULL. (Yes, this design is ugly,
* but it parallels blkcipher_aead_walk_virt_block() above. In the 4.10 kernel
* this is starting to be cleaned up...)
*/
int blkcipher_ablkcipher_walk_virt(struct blkcipher_desc *desc,
struct blkcipher_walk *walk,
struct crypto_ablkcipher *tfm)
{
walk->flags &= ~BLKCIPHER_WALK_PHYS;
walk->walk_blocksize = crypto_ablkcipher_blocksize(tfm);
walk->cipher_blocksize = walk->walk_blocksize;
walk->ivsize = crypto_ablkcipher_ivsize(tfm);
walk->alignmask = crypto_ablkcipher_alignmask(tfm);
return blkcipher_walk_first(desc, walk);
}
EXPORT_SYMBOL_GPL(blkcipher_ablkcipher_walk_virt);
static int setkey_unaligned(struct crypto_tfm *tfm, const u8 *key,
unsigned int keylen)
{

View File

@ -202,6 +202,9 @@ int blkcipher_aead_walk_virt_block(struct blkcipher_desc *desc,
struct blkcipher_walk *walk,
struct crypto_aead *tfm,
unsigned int blocksize);
int blkcipher_ablkcipher_walk_virt(struct blkcipher_desc *desc,
struct blkcipher_walk *walk,
struct crypto_ablkcipher *tfm);
int ablkcipher_walk_done(struct ablkcipher_request *req,
struct ablkcipher_walk *walk, int err);