Current blkcipher_walk can be used for ablkcipher crypto_tfm + blkcipher crypto_alg. This patch make it possible to use blkcipher_walk for ablkcipher algorithm. The only field in cra_blkcipher used is ivsize, which is wrapped in a function to support both cra_blkcipher and cra_ablkcipher. Signed-off-by: Huang Ying <ying.huang@xxxxxxxxx> --- crypto/blkcipher.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c @@ -68,6 +68,16 @@ static inline u8 *blkcipher_get_spot(u8 return max(start, end_page); } +static inline unsigned int blkcipher_walk_ivsize(struct crypto_blkcipher *tfm) +{ + struct crypto_tfm *tfm_base = crypto_blkcipher_tfm(tfm); + + if (crypto_tfm_alg_type(tfm_base) == CRYPTO_ALG_TYPE_ABLKCIPHER) + return tfm_base->__crt_alg->cra_ablkcipher.ivsize; + else + return crypto_blkcipher_ivsize(tfm); +} + static inline unsigned int blkcipher_done_slow(struct crypto_blkcipher *tfm, struct blkcipher_walk *walk, unsigned int bsize) @@ -134,7 +144,7 @@ int blkcipher_walk_done(struct blkcipher err: if (walk->iv != desc->info) - memcpy(desc->info, walk->iv, crypto_blkcipher_ivsize(tfm)); + memcpy(desc->info, walk->iv, blkcipher_walk_ivsize(tfm)); if (walk->buffer != walk->page) kfree(walk->buffer); if (walk->page) @@ -280,7 +290,7 @@ static inline int blkcipher_copy_iv(stru unsigned int alignmask) { unsigned bs = walk->blocksize; - unsigned int ivsize = crypto_blkcipher_ivsize(tfm); + unsigned int ivsize = blkcipher_walk_ivsize(tfm); unsigned aligned_bs = ALIGN(bs, alignmask + 1); unsigned int size = aligned_bs * 2 + ivsize + max(aligned_bs, ivsize) - (alignmask + 1);
Attachment:
signature.asc
Description: This is a digitally signed message part