On Mon, Aug 12, 2019 at 05:53:18PM +0300, Ard Biesheuvel wrote: > + switch (type) { > + case CRYPTO_ALG_TYPE_BLKCIPHER: > + skcipher_inst = kzalloc(sizeof(*skcipher_inst) + > + sizeof(*ictx), GFP_KERNEL); > + if (!skcipher_inst) > + return -ENOMEM; > + inst = skcipher_crypto_instance(skcipher_inst); > + base = &skcipher_inst->alg.base; > + ictx = crypto_instance_ctx(inst); > + > + /* Block cipher, e.g. "cbc(aes)" */ > + crypto_set_skcipher_spawn(&ictx->u.skcipher_spawn, inst); > + err = crypto_grab_skcipher(&ictx->u.skcipher_spawn, > + inner_cipher_name, 0, > + crypto_requires_sync(algt->type, > + algt->mask)); > + if (err) > + goto out_free_inst; This should say "Symmetric cipher", not "Block cipher". > + > + if (!parse_cipher_name(essiv_cipher_name, block_base->cra_name)) { > + pr_warn("Failed to parse ESSIV cipher name from skcipher cra_name\n"); > + goto out_drop_skcipher; > + } This is missing: err = -EINVAL; > + if (type == CRYPTO_ALG_TYPE_BLKCIPHER) { > + skcipher_inst->alg.setkey = essiv_skcipher_setkey; > + skcipher_inst->alg.encrypt = essiv_skcipher_encrypt; > + skcipher_inst->alg.decrypt = essiv_skcipher_decrypt; > + skcipher_inst->alg.init = essiv_skcipher_init_tfm; > + skcipher_inst->alg.exit = essiv_skcipher_exit_tfm; > + > + skcipher_inst->alg.min_keysize = crypto_skcipher_alg_min_keysize(skcipher_alg); > + skcipher_inst->alg.max_keysize = crypto_skcipher_alg_max_keysize(skcipher_alg); > + skcipher_inst->alg.ivsize = crypto_skcipher_alg_ivsize(skcipher_alg); > + skcipher_inst->alg.chunksize = crypto_skcipher_alg_chunksize(skcipher_alg); > + skcipher_inst->alg.walksize = crypto_skcipher_alg_walksize(skcipher_alg); > + > + skcipher_inst->free = essiv_skcipher_free_instance; > + > + err = skcipher_register_instance(tmpl, skcipher_inst); > + } else { > + aead_inst->alg.setkey = essiv_aead_setkey; > + aead_inst->alg.setauthsize = essiv_aead_setauthsize; > + aead_inst->alg.encrypt = essiv_aead_encrypt; > + aead_inst->alg.decrypt = essiv_aead_decrypt; > + aead_inst->alg.init = essiv_aead_init_tfm; > + aead_inst->alg.exit = essiv_aead_exit_tfm; > + > + aead_inst->alg.ivsize = crypto_aead_alg_ivsize(aead_alg); > + aead_inst->alg.maxauthsize = crypto_aead_alg_maxauthsize(aead_alg); > + aead_inst->alg.chunksize = crypto_aead_alg_chunksize(aead_alg); > + > + aead_inst->free = essiv_aead_free_instance; > + > + err = aead_register_instance(tmpl, aead_inst); > + } 'ivsize' is already in a variable, so could use skcipher_inst->alg.ivsize = ivsize; and aead_inst->alg.ivsize = ivsize; - Eric