return 0;
 }
 
+static void crypto_shash_exit_tfm(struct crypto_tfm *tfm)
+{
+       struct crypto_shash *hash = __crypto_shash_cast(tfm);
+       struct shash_alg *alg = crypto_shash_alg(hash);
+
+       alg->exit_tfm(hash);
+}
+
 static int crypto_shash_init_tfm(struct crypto_tfm *tfm)
 {
        struct crypto_shash *hash = __crypto_shash_cast(tfm);
        struct shash_alg *alg = crypto_shash_alg(hash);
+       int err;
 
        hash->descsize = alg->descsize;
 
        shash_set_needkey(hash, alg);
 
+       if (alg->exit_tfm)
+               tfm->exit = crypto_shash_exit_tfm;
+
+       if (!alg->init_tfm)
+               return 0;
+
+       err = alg->init_tfm(hash);
+       if (err)
+               return err;
+
+       /* ->init_tfm() may have increased the descsize. */
+       if (WARN_ON_ONCE(hash->descsize > HASH_MAX_DESCSIZE)) {
+               if (alg->exit_tfm)
+                       alg->exit_tfm(hash);
+               return -EINVAL;
+       }
+
        return 0;
 }
 
 
  * @export: see struct ahash_alg
  * @import: see struct ahash_alg
  * @setkey: see struct ahash_alg
+ * @init_tfm: Initialize the cryptographic transformation object.
+ *           This function is called only once at the instantiation
+ *           time, right after the transformation context was
+ *           allocated. In case the cryptographic hardware has
+ *           some special requirements which need to be handled
+ *           by software, this function shall check for the precise
+ *           requirement of the transformation and put any software
+ *           fallbacks in place.
+ * @exit_tfm: Deinitialize the cryptographic transformation object.
+ *           This is a counterpart to @init_tfm, used to remove
+ *           various changes set in @init_tfm.
  * @digestsize: see struct ahash_alg
  * @statesize: see struct ahash_alg
  * @descsize: Size of the operational state for the message digest. This state
        int (*import)(struct shash_desc *desc, const void *in);
        int (*setkey)(struct crypto_shash *tfm, const u8 *key,
                      unsigned int keylen);
+       int (*init_tfm)(struct crypto_shash *tfm);
+       void (*exit_tfm)(struct crypto_shash *tfm);
 
        unsigned int descsize;