static struct shash_desc *chcr_alloc_shash(unsigned int ds) { struct crypto_shash *base_hash = NULL; struct shash_desc *desc; switch (ds) { case SHA1_DIGEST_SIZE: base_hash = crypto_alloc_shash("sha1-generic", 0, 0); break; case SHA224_DIGEST_SIZE: base_hash = crypto_alloc_shash("sha224-generic", 0, 0); break; case SHA256_DIGEST_SIZE: base_hash = crypto_alloc_shash("sha256-generic", 0, 0); break; case SHA384_DIGEST_SIZE: base_hash = crypto_alloc_shash("sha384-generic", 0, 0); break; case SHA512_DIGEST_SIZE: base_hash = crypto_alloc_shash("sha512-generic", 0, 0); break; } if (IS_ERR(base_hash)) { pr_err("Can not allocate sha-generic algo.\n"); return (void *)base_hash; } desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(base_hash), GFP_KERNEL); if (!desc) return ERR_PTR(-ENOMEM); desc->tfm = base_hash; desc->flags = crypto_shash_get_flags(base_hash); return desc; }
static int p8_ghash_init_tfm(struct crypto_tfm *tfm) { const char *alg; struct crypto_shash *fallback; struct crypto_shash *shash_tfm = __crypto_shash_cast(tfm); struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm); if (!(alg = crypto_tfm_alg_name(tfm))) { printk(KERN_ERR "Failed to get algorithm name.\n"); return -ENOENT; } fallback = crypto_alloc_shash(alg, 0 ,CRYPTO_ALG_NEED_FALLBACK); if (IS_ERR(fallback)) { printk(KERN_ERR "Failed to allocate transformation for '%s': %ld\n", alg, PTR_ERR(fallback)); return PTR_ERR(fallback); } printk(KERN_INFO "Using '%s' as fallback implementation.\n", crypto_tfm_alg_driver_name(crypto_shash_tfm(fallback))); crypto_shash_set_flags(fallback, crypto_shash_get_flags((struct crypto_shash *) tfm)); ctx->fallback = fallback; shash_tfm->descsize = sizeof(struct p8_ghash_desc_ctx) + crypto_shash_descsize(fallback); return 0; }